diff --git a/audits/V1.0.0 (Slashing) - Certora - Feb 2025.pdf b/audits/V1.0.0 (Slashing) - Certora - Feb 2025.pdf
new file mode 100644
index 0000000000..93bb944da9
Binary files /dev/null and b/audits/V1.0.0 (Slashing) - Certora - Feb 2025.pdf differ
diff --git a/audits/V1.0.0 (Slashing) - Sigma Prime - Feb 2025.pdf b/audits/V1.0.0 (Slashing) - Sigma Prime - Feb 2025.pdf
new file mode 100644
index 0000000000..dd2d938717
Binary files /dev/null and b/audits/V1.0.0 (Slashing) - Sigma Prime - Feb 2025.pdf differ
diff --git a/docs/core/AllocationManager.md b/docs/core/AllocationManager.md
index 5787b4a544..3957fed5da 100644
--- a/docs/core/AllocationManager.md
+++ b/docs/core/AllocationManager.md
@@ -22,7 +22,9 @@ Libraries and Mixins:
## Overview
-The `AllocationManager` manages registration and deregistration of operators to operator sets, handles allocation and slashing of operators' slashable stake, and is the entry point an AVS uses to slash an operator. The `AllocationManager's` responsibilities are broken down into the following concepts:
+The `AllocationManager` manages AVS metadata registration, registration and deregistration of operators to operator sets, handles allocation and slashing of operators' slashable stake, and is the entry point an AVS uses to slash an operator. The `AllocationManager's` responsibilities are broken down into the following concepts:
+
+* [AVS Metadata](#avs-metadata)
* [Operator Sets](#operator-sets)
* [Allocations and Slashing](#allocations-and-slashing)
* [Config](#config)
@@ -38,6 +40,104 @@ The `AllocationManager` manages registration and deregistration of operators to
---
+## AVS Metadata
+
+AVSs must register their metadata to declare themselves who they are as the first step, before they can create operator sets or register operators into operator sets. `AllocationManager` keeps track of AVSs that have registered metadata.
+
+**Methods:**
+* [`updateAVSMetadataURI`](#updateavsmetadatauri)
+
+
+#### `updateAVSMetadataURI`
+
+```solidity
+/**
+ * @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated.
+ *
+ * @param metadataURI The URI for metadata associated with an AVS.
+ *
+ * @dev Note that the `metadataURI` is *never stored* and is only emitted in the `AVSMetadataURIUpdated` event.
+ */
+function updateAVSMetadataURI(
+ address avs,
+ string calldata metadataURI
+)
+ external
+ checkCanCall(avs)
+```
+
+_Note: this method can be called directly by an AVS, or by a caller authorized by the AVS. See [`PermissionController.md`](../permissions/PermissionController.md) for details._
+
+Below is the format AVSs should use when updating their metadata URI initially. This is not validated onchain.
+
+```json
+{
+ "name": "AVS",
+ "website": "https.avs.xyz/",
+ "description": "Some description about",
+ "logo": "http://github.com/logo.png",
+ "twitter": "https://twitter.com/avs",
+}
+```
+
+
+Later on, once AVSs have created operator sets, content in their metadata URI can be updated subsequently.
+
+```json
+{
+ "name": "AVS",
+ "website": "https.avs.xyz/",
+ "description": "Some description about",
+ "logo": "http://github.com/logo.png",
+ "twitter": "https://twitter.com/avs",
+ "operatorSets": [
+ {
+ "name": "ETH Set",
+ "id": "1", // Note: we use this param to match the opSet id in the Allocation Manager
+ "description": "The ETH operatorSet for AVS",
+ "software": [
+ {
+ "name": "NetworkMonitor",
+ "description": "",
+ "url": "https://link-to-binary-or-github.com"
+ },
+ {
+ "name": "ValidatorClient",
+ "description": "",
+ "url": "https://link-to-binary-or-github.com"
+ }
+ ],
+ "slashingConditions": ["Condition A", "Condition B"]
+ },
+ {
+ "name": "EIGEN Set",
+ "id": "2", // Note: we use this param to match the opSet id in the Allocation Manager
+ "description": "The EIGEN operatorSet for AVS",
+ "software": [
+ {
+ "name": "NetworkMonitor",
+ "description": "",
+ "url": "https://link-to-binary-or-github.com"
+ },
+ {
+ "name": "ValidatorClient",
+ "description": "",
+ "url": "https://link-to-binary-or-github.com"
+ }
+ ],
+ "slashingConditions": ["Condition A", "Condition B"]
+ }
+ ]
+}
+```
+
+*Effects*:
+* Emits an `AVSMetadataURIUpdated` event for use in offchain services
+
+*Requirements*:
+* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
+
+
## Operator Sets
Operator sets, as described in [ELIP-002](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md#operator-sets), are useful for AVSs to configure operator groupings which can be assigned different tasks, rewarded based on their strategy allocations, and slashed according to different rules. Operator sets are defined in [`libraries/OperatorSetLib.sol`](../../src/contracts/libraries/OperatorSetLib.sol):
@@ -145,6 +245,7 @@ Optionally, the `avs` can provide a list of `strategies`, specifying which strat
*Requirements*:
* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
+* AVS MUST have registered metadata
* For each `CreateSetParams` element:
* Each `params.operatorSetId` MUST NOT already exist in `_operatorSets[avs]`
@@ -585,7 +686,26 @@ struct SlashingParams {
}
/**
- * @notice Called by an AVS to slash an operator in a given operator set
+ * @notice Called by an AVS to slash an operator in a given operator set. The operator must be registered
+ * and have slashable stake allocated to the operator set.
+ *
+ * @param avs The AVS address initiating the slash.
+ * @param params The slashing parameters, containing:
+ * - operator: The operator to slash.
+ * - operatorSetId: The ID of the operator set the operator is being slashed from.
+ * - strategies: Array of strategies to slash allocations from (must be in ascending order).
+ * - wadsToSlash: Array of proportions to slash from each strategy (must be between 0 and 1e18).
+ * - description: Description of why the operator was slashed.
+ *
+ * @dev For each strategy:
+ * 1. Reduces the operator's current allocation magnitude by wadToSlash proportion.
+ * 2. Reduces the strategy's max and encumbered magnitudes proportionally.
+ * 3. If there is a pending deallocation, reduces it proportionally.
+ * 4. Updates the operator's shares in the DelegationManager.
+ *
+ * @dev Small slashing amounts may not result in actual token burns due to
+ * rounding, which will result in small amounts of tokens locked in the contract
+ * rather than fully burning through the burn mechanism.
*/
function slashOperator(
address avs,
@@ -646,7 +766,6 @@ Once slashing is processed for a strategy, [slashed stake is burned via the `Del
**Methods:**
* [`setAllocationDelay`](#setallocationdelay)
* [`setAVSRegistrar`](#setavsregistrar)
-* [`updateAVSMetadataURI`](#updateavsmetadatauri)
#### `setAllocationDelay`
@@ -737,79 +856,3 @@ Note that when an operator registers, registration will FAIL if the call to `IAV
*Requirements*:
* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
-
-#### `updateAVSMetadataURI`
-
-```solidity
-/**
- * @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated.
- *
- * @param metadataURI The URI for metadata associated with an AVS.
- *
- * @dev Note that the `metadataURI` is *never stored* and is only emitted in the `AVSMetadataURIUpdated` event.
- */
-function updateAVSMetadataURI(
- address avs,
- string calldata metadataURI
-)
- external
- checkCanCall(avs)
-```
-
-_Note: this method can be called directly by an AVS, or by a caller authorized by the AVS. See [`PermissionController.md`](../permissions/PermissionController.md) for details._
-
-Below is the format AVSs should use when updating their metadata URI. This is not validated onchain.
-
-```json
-{
- "name": "AVS",
- "website": "https.avs.xyz/",
- "description": "Some description about",
- "logo": "http://github.com/logo.png",
- "twitter": "https://twitter.com/avs",
- "operatorSets": [
- {
- "name": "ETH Set",
- "id": "1", // Note: we use this param to match the opSet id in the Allocation Manager
- "description": "The ETH operatorSet for AVS",
- "software": [
- {
- "name": "NetworkMonitor",
- "description": "",
- "url": "https://link-to-binary-or-github.com"
- },
- {
- "name": "ValidatorClient",
- "description": "",
- "url": "https://link-to-binary-or-github.com"
- }
- ],
- "slashingConditions": ["Condition A", "Condition B"]
- },
- {
- "name": "EIGEN Set",
- "id": "2", // Note: we use this param to match the opSet id in the Allocation Manager
- "description": "The EIGEN operatorSet for AVS",
- "software": [
- {
- "name": "NetworkMonitor",
- "description": "",
- "url": "https://link-to-binary-or-github.com"
- },
- {
- "name": "ValidatorClient",
- "description": "",
- "url": "https://link-to-binary-or-github.com"
- }
- ],
- "slashingConditions": ["Condition A", "Condition B"]
- }
- ]
-}
-```
-
-*Effects*:
-* Emits an `AVSMetadataURIUpdated` event for use in offchain services
-
-*Requirements*:
-* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
\ No newline at end of file
diff --git a/docs/core/EigenPodManager.md b/docs/core/EigenPodManager.md
index 8ebbca0c41..322ef3cdb7 100644
--- a/docs/core/EigenPodManager.md
+++ b/docs/core/EigenPodManager.md
@@ -223,7 +223,6 @@ Note that the amount of deposit shares removed while in the withdrawal queue may
function addShares(
address staker,
IStrategy strategy,
- IERC20,
uint256 shares
)
external
diff --git a/docs/core/StrategyManager.md b/docs/core/StrategyManager.md
index f698f1809f..34e4d8797d 100644
--- a/docs/core/StrategyManager.md
+++ b/docs/core/StrategyManager.md
@@ -190,13 +190,11 @@ Note that the amount of deposit shares removed while in the withdrawal queue may
```solidity
/// @notice Used by the DelegationManager to award a Staker some shares that have passed through the withdrawal queue
/// @dev strategy must be beaconChainETH when talking to the EigenPodManager
-/// @dev token is not validated; it is only emitted as an event
/// @return existingDepositShares the shares the staker had before any were added
/// @return addedShares the new shares added to the staker's balance
function addShares(
address staker,
IStrategy strategy,
- IERC20 token,
uint256 shares
)
external
@@ -252,7 +250,7 @@ This method directs the `strategy` to convert the input deposit shares to tokens
## Burning Slashed Shares
-The following methods handle burning of slashed shares:
+Slashed shares are marked as burnable, and anyone can call `burnShares` to transfer them to the default burn address. Burnable shares are stored in `burnableShares`, an [EnumerableMap](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/utils/structs/EnumerableMap.sol) with strategy contract addresses as keys and associated view functions. The following methods handle burning of slashed shares:
* [`StrategyManager.increaseBurnableShares`](#increaseburnableshares)
* [`StrategyManager.burnShares`](#burnshares)
@@ -296,11 +294,12 @@ function burnShares(
IStrategy strategy
)
external
- onlyDelegationManager
```
Anyone can call this method to burn slashed shares previously added by the `DelegationManager` via `increaseBurnableShares`. This method resets the strategy's burnable shares to 0, and directs the corresponding `strategy` to convert the shares to tokens and transfer them to `DEFAULT_BURN_ADDRESS`, rendering them unrecoverable.
+The `strategy` is not called if the strategy had no burnable shares.
+
*Effects*:
* Resets the strategy's burnable shares to 0
* Calls `withdraw` on the `strategy`, withdrawing shares and sending a corresponding amount of tokens to the `DEFAULT_BURN_ADDRESS`
diff --git a/docs/core/accounting/SharesAccounting.md b/docs/core/accounting/SharesAccounting.md
index 940dfab0a1..7e17cfbaf1 100644
--- a/docs/core/accounting/SharesAccounting.md
+++ b/docs/core/accounting/SharesAccounting.md
@@ -162,6 +162,67 @@ See implementation in:
* [`StrategyManager.depositIntoStrategy`](../../../src/contracts/core/StrategyManager.sol)
* [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](../../../src/contracts/pods/EigenPodManager.sol)
+
+---
+
+### Delegation
+
+Suppose we have an undelegated staker who decides to delegate to an operator.
+We have the following properties that should be preserved.
+
+#### Operator Level
+
+Operator shares should be increased by the amount of delegatable shares the staker has, this is synonymous to their withdrawable shares $a_n$. Therefore,
+
+$$
+op_{n+1} = op_{n} + a_n
+$$
+
+$$
+= op_{n} + s_n k_n l_n m_n
+$$
+
+
+#### Staker Level
+
+withdrawable shares should remain unchanged
+
+$$
+a_{n+1} = a_n
+$$
+
+deposit shares should remain unchanged
+
+$$
+s_{n+1} = s_n
+$$
+
+beaconChainSlashingFactor and maxMagnitude should also remain unchanged. In this case, since the staker is not delegated, then their maxMagnitude should by default be equal to 1.
+
+$$
+l_{n+1} = l_n
+$$
+
+Now the question is what is the new depositScalingFactor equal to?
+
+$$
+a_{n+1} = a_n
+$$
+
+$$
+=> s_{n+1} k_{n+1} l_{n+1} m_{n+1} = s_n k_n l_n m_n
+$$
+
+$$
+=> s_{n} k_{n+1} l_{n} m_{n+1} = s_n k_n l_n m_n
+$$
+
+$$
+=> k_{n+1} = \frac {k_n m_n} { m_{n+1} }
+$$
+
+Notice how the staker variables that update $k_{n+1}$ and $m_{n+1}$ do not affect previously queued withdrawals and shares received upon withdrawal completion. This is because the maxMagnitude that is looked up is dependent on the operator at the time of the queued withdrawal and the $k_n$ is effectively stored in the scaled shares field.
+
---
### Slashing
@@ -297,6 +358,8 @@ $$
Note that when a withdrawal is queued, a `Withdrawal` struct is created with _scaled shares_ defined as $q_t = x_t k_t$ where $t$ is the time of the queuing. The reason we define and store scaled shares like this will be clearer in [Complete Withdrawal](#complete-withdrawal) below.
+Additionally, we reset the depositScalingFactor when a user queues a withdrawal for all their shares, either through un/redelegation or directly. This is because the DSF at the time of withdrawal is stored in the scaled shares, and any "new" deposits or delegations by the staker should be considered as new. Note that withdrawal completion is treated as a kind of deposit when done as shares, which again will be clearer below.
+
See implementation in:
* `DelegationManager.queueWithdrawals`
* `SlashingLib.scaleForQueueWithdrawal`
diff --git a/docs/core/accounting/SharesAccountingEdgeCases.md b/docs/core/accounting/SharesAccountingEdgeCases.md
index b74881b081..d8e99b1c38 100644
--- a/docs/core/accounting/SharesAccountingEdgeCases.md
+++ b/docs/core/accounting/SharesAccountingEdgeCases.md
@@ -145,6 +145,28 @@ Since the operatorShares are simply incrementing by the exact depositShares, the
Granted the initial deposit amount was `4.418e28` which is magnitudes larger than the discrepancy here but this its important to note the side effects of the redesigned accounting model.
Instead of purely incremented/decremented amounts, we have introduced magnitudes and scaling factor variables which now result in small amounts of rounding error from division in several places. We deem this rounding behavior to be tolerable given the costs associated for the number of transactions to emulate this and the proportional error is very small.
+### Slashing and Rounding Up Operator Shares and Rounding down on Staker Withdrawable Shares
+
+As can be observed in the `SlashingLib.sol` library, we round up on the operatorShares when slashing and round down on the staker's withdrawableShares. If we look at a core invariant of the shares accounting model, we ideally want to preserve the following:
+
+$$
+op_n = \sum_{i=1}^{k} a_{n,i}
+$$
+
+where $op_n$ is the operatorShares at time $n$ and $a_{n,i}$ is the staker's withdrawableShares at time $n$ for the $i^{th}$ staker.
+
+However due to rounding limitations, there will be some error introduced in calculating the amount of operator shares to slash above and also in calculating the staker's withdrawableShares. To prevent a situation where all stakers were to attempt to withdraw and the operatorShares underflows, we round up on the operatorShares when slashing and round down on the staker's withdrawableShares.
+
+So in practice, the above invariant becomes.
+
+$$
+op_n \geq \sum_{i=1}^{k} a_{n,i}
+$$
+
+Upwards rounding on calculating the amount of operatorShares to give to an operator after slashing is intentionally performed in `SlashingLib.calcSlashedAmount`.
+For calculating a staker's withdrawableShares, there are many different factors to consider such as calculating their depositScalingFactor, their slashingFactor, and calculating the amount of withdrawable shares altogether with their depositShares. These variables are all by default rounded down in calculation and is expected behavior for stakers.
+
+
## Upper bound on Residual Operator Shares
Related to the above rounding error on deposits, we want to calculate what is the worst case rounding error for a staker depositing shares into EigenLayer.
diff --git a/docs/core/accounting/SlashingEdgeCase.md b/docs/core/accounting/SlashingEdgeCase.md
new file mode 100644
index 0000000000..c983e9b823
--- /dev/null
+++ b/docs/core/accounting/SlashingEdgeCase.md
@@ -0,0 +1,117 @@
+# Dual Slashing Edge Case
+
+This document describes edge cases surrounding the slashing of a staker for native ETH by the beacon chain (BC) and an AVS.
+
+## Prior Reading
+
+* [ELIP-002: Slashing via Unique Stake and Operator Sets](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md)
+* [ELIP-004: Slashing-Aware EigenPods](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-004.md)
+* [Shares Accounting](./SharesAccounting.md)
+
+## Scenario
+
+Consider a staker, Alice who is in the following state:
+
+1. Alice has verified a validator. `withdrawble: 32 ETH`
+2. Alice's operator is slashed for 75%. `withdrawable: 8 ETH`
+
+ Calculation
+
+ * `depositShares: 32`
+ * `maxMagnitude: 0.25`
+ * `BCSF: 1`
+ * `DSF: 1`
+ * `withdrawable = 32 * 0.25 * 1 * 1 = 8 ETH`
+
+3. Alice is slashed by 16 ETH on the beacon chain
+
+## Restaking
+
+We define restaking as **reusing staked ETH as security for AVSs. Thus, the same Native ETH that is securing the BC (beacon chain) can also be slashed by an AVS, with priority burning rights going to the BC.**
+
+In the above scenario, let's say the Alice now proves a checkpoint.
+
+4. A checkpoint of BC state is proven. `withdrawable: 4 ETH`
+
+ Calculation
+
+ * `depositShares: 16`
+ * `maxMagnitude: 0.25`
+ * `BCSF: 1`
+ * `DSF: 1`
+ * `withdrawable = 16 * 0.25 * 1 * 1 = 4 ETH`
+
+
+The checkpoint slash has devalued Alice's currently withdrawable assets by 50%. The AVS slashes from what's left due to the BC getting priority burning rights. Thus, AVSs must factor Native ETH (or an LST) being slashed by the beacon chain when designing their slashing conditions. The below diagram illustrates this behavior:
+
+
+
+Diagram showing how AVS slashing is applied after Beacon Chain slashing, with BC having priority burning rights
+
+
+Note that the portion that is marked as BC Slash and BC + AVS Slash has priority burning rights by the beacon chain. 12 ETH has been slashed "twice", but this is by design given our definition of restaking.
+
+The behavior of BC and AVS slashings for Native ETH mimics the behavior of slashings for an LST in isolation (see below for an additional edge case). This ensures that Native ETH security is not disadvantaged compared to LST security. ELIP-004 explains this in [more detail](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-004.md#why-do-eigenpods-need-to-upgrade).
+
+## Ordering of EigenPod Actions
+
+**When an AVS slashes, its attributable slashed amount is between 0 and the originally slashed amount. The attributable slashed amount decreases in the event of BC slashes.** We see this behavior in the above example, where the 12 ETH that was attributed to the AVS is less than the original 24 ETH that was slashed.
+
+However, given the asynchronous nature of the EigenPod proof system, Alice may have a different number of withdrawable shares depending on the ordering of her actions. Note that even in this case, **assets are not overslashed**.
+
+Let's start with our above scenario.
+
+Scenario A:
+
+4. Alice verifies another validator. `withdrawable: 40 ETH`
+
+ Calculation
+
+ * `depositShares: 64`
+ * `maxMagnitude: 0.25`
+ * `BCSF: 1`
+ * `DSF = 40 / (32 + 32) / 0.25 = 2.5`
+ * `withdrawable = 64 * 0.25 * 1 * 2.5 = 40 ETH`
+
+
+5. Alice checkpoints all her pods. `withdrawable: 30 ETH`
+
+ Calculation
+
+ * `depositShares: 64`
+ * `maxMagnitude: 0.25`
+ * `BCSF = 48 / 64 = 0.75`
+ * `DSF: 2.5`
+ * `withdrawable = 64 * 0.25 * 0.75 * 2.5 = 30 ETH`
+
+
+In this scenario, 25% of Alice’s currently proven assets are slashed. Similarly, the AVSs attributable slashed amount has been decreased by 25% (24 → 18 ETH).
+
+
+Scenario B:
+
+4. Alice checkpoints her pod. `withdrawable: 4 ETH`
+
+ Calculation
+
+ * `depositShares: 32`
+ * `maxMagnitude: 0.25`
+ * `BCSF = 16 / 32 = 0.5`
+ * `DSF: 1`
+ * `withdrawable = 32 * 0.25 * 0.5 * 1 = 4 ETH`
+
+
+5. Alice verifies another validator. `withdrawable: 40 ETH`
+
+ Calculation
+
+ * `depositShares: 64`
+ * `maxMagnitude: 0.25`
+ * `BCSF: 0.5`
+ * `DSF = 36 / (32 + 32) / 0.125 = 4.5`
+ * `withdrawable = 64 * 0.25 * 0.5 * 4.5 = 36 ETH`
+
+
+In scenario B, 50% of Alice’s currently proven assets are slashed, along with a commensurate decrease in the AVSs attributable slashed amount. In both cases Alice’s withdrawable shares and the AVSs attributable slashed amount decrease by the same percentage.
+
+We acknowledge this edge case. A benefit of this system is that stakers are incentivized to immediately prove BC slashed. Eigen Labs runs an off-chain process (EigenPod Health Checker) that monitors BC slashings and starts checkpoints as needed. Conversely, when Native-ETH burning is implemented, AVSs are incentivized to immediately exit stakers from the BC to recoup the maximum possible attributable slashed amount.
\ No newline at end of file
diff --git a/docs/images/avs-bc-slash.png b/docs/images/avs-bc-slash.png
new file mode 100644
index 0000000000..e53cedaae1
Binary files /dev/null and b/docs/images/avs-bc-slash.png differ
diff --git a/foundry.toml b/foundry.toml
index 0d1c575633..d8494c0b57 100644
--- a/foundry.toml
+++ b/foundry.toml
@@ -24,7 +24,7 @@
# Specifies the exact version of Solidity to use, overriding auto-detection.
solc_version = '0.8.27'
# If enabled, treats Solidity compiler warnings as errors, preventing artifact generation if warnings are present.
- deny_warnings = true
+ deny_warnings = false
# If set to true, changes compilation pipeline to go through the new IR optimizer.
via_ir = false
# Whether or not to enable the Solidity optimizer.
diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go
index 9a8a99f586..601a4fb8cc 100644
--- a/pkg/bindings/AVSDirectory/binding.go
+++ b/pkg/bindings/AVSDirectory/binding.go
@@ -29,8 +29,8 @@ var (
_ = abi.ConvertType
)
-// ISignatureUtilsSignatureWithSaltAndExpiry is an auto generated low-level Go binding around an user-defined struct.
-type ISignatureUtilsSignatureWithSaltAndExpiry struct {
+// ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry is an auto generated low-level Go binding around an user-defined struct.
+type ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry struct {
Signature []byte
Salt [32]byte
Expiry *big.Int
@@ -38,8 +38,8 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct {
// AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract.
var AVSDirectoryMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"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\":\"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\":[]}]",
- Bin: "0x610100604052348015610010575f5ffd5b5060405161170438038061170483398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516114906102745f395f610b7a01525f610aba01525f8181610340015261063d01525f818161021c015281816103d8015281816104ad0152610b9e01526114905ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063a364f4da116100b4578063dce974b911610079578063dce974b914610314578063df5cf7231461033b578063ec76f44214610362578063f2fde38b14610395578063f698da25146103a8578063fabc1cbc146103b0575f5ffd5b8063a364f4da1461028d578063a98fb355146102a0578063c825fe68146102b3578063cd6dc687146102da578063d79aceab146102ed575f5ffd5b80635c975abb116101055780635c975abb146101fd578063715018a61461020f578063886f1195146102175780638da5cb5b146102565780639926ee7d14610267578063a1060c881461027a575f5ffd5b8063136439dd14610141578063374823b51461015657806349075da314610198578063595c6a67146101d25780635ac86ab7146101da575b5f5ffd5b61015461014f366004611075565b6103c3565b005b6101836101643660046110a0565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101c56101a63660046110ca565b609860209081525f928352604080842090915290825290205460ff1681565b60405161018f9190611115565b610154610498565b6101836101e836600461113b565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161018f565b610154610547565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161018f565b6033546001600160a01b031661023e565b6101546102753660046111d0565b610558565b6102016102883660046112bd565b610777565b61015461029b366004611300565b6107f6565b6101546102ae36600461131b565b6108db565b6102017f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6101546102e83660046110a0565b610922565b6102017fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102017f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b610154610370366004611075565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b6101546103a3366004611300565b610a3e565b610201610ab7565b6101546103be366004611075565b610b9c565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610425573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104499190611389565b61046657604051631d77d47760e21b815260040160405180910390fd5b606654818116811461048b5760405163c61dca5d60e01b815260040160405180910390fd5b61049482610cab565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051e9190611389565b61053b57604051631d77d47760e21b815260040160405180910390fd5b6105455f19610cab565b565b61054f610ce8565b6105455f610d42565b6066545f906001908116036105805760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156105b9576105b9611101565b036105d757604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561061e57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610682573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190611389565b6106c357604051639f88c8af60e01b815260040160405180910390fd5b6106e7836106db853386602001518760400151610777565b84516040860151610d93565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161076a9190611115565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f906107ed9060c00160405160208183030381529060405280519060200120610deb565b95945050505050565b6066545f9060019081160361081e5760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561085757610857611101565b14610875576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916108cf9190611115565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516109169291906113a8565b60405180910390a25050565b5f54610100900460ff161580801561094057505f54600160ff909116105b806109595750303b15801561095957505f5460ff166001145b6109c15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156109e2575f805461ff0019166101001790555b6109eb82610cab565b6109f483610d42565b8015610a39575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610a46610ce8565b6001600160a01b038116610aab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b8565b610ab481610d42565b50565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610b775750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1c91906113d6565b6001600160a01b0316336001600160a01b031614610c4d5760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614610c745760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610916565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6033546001600160a01b031633146105455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109b8565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b42811015610db457604051630819bdcd60e01b815260040160405180910390fd5b610dc86001600160a01b0385168484610e31565b610de557604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610df4610ab7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f5f5f610e3e8585610e8f565b90925090505f816004811115610e5657610e56611101565b148015610e745750856001600160a01b0316826001600160a01b0316145b80610e855750610e85868686610ed1565b9695505050505050565b5f5f8251604103610ec3576020830151604084015160608501515f1a610eb787828585610fb8565b94509450505050610eca565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401610ef99291906113f1565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f37919061142d565b5f60405180830381855afa9150503d805f8114610f6f576040519150601f19603f3d011682016040523d82523d5f602084013e610f74565b606091505b5091509150818015610f8857506020815110155b8015610e8557508051630b135d3f60e11b90610fad9083016020908101908401611443565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610fed57505f9050600361106c565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561103e573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611066575f6001925092505061106c565b91505f90505b94509492505050565b5f60208284031215611085575f5ffd5b5035919050565b6001600160a01b0381168114610ab4575f5ffd5b5f5f604083850312156110b1575f5ffd5b82356110bc8161108c565b946020939093013593505050565b5f5f604083850312156110db575f5ffd5b82356110e68161108c565b915060208301356110f68161108c565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061113557634e487b7160e01b5f52602160045260245ffd5b91905290565b5f6020828403121561114b575f5ffd5b813560ff8116811461115b575f5ffd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561119957611199611162565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156111c8576111c8611162565b604052919050565b5f5f604083850312156111e1575f5ffd5b82356111ec8161108c565b9150602083013567ffffffffffffffff811115611207575f5ffd5b830160608186031215611218575f5ffd5b611220611176565b813567ffffffffffffffff811115611236575f5ffd5b8201601f81018713611246575f5ffd5b803567ffffffffffffffff81111561126057611260611162565b611273601f8201601f191660200161119f565b818152886020838501011115611287575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f608085870312156112d0575f5ffd5b84356112db8161108c565b935060208501356112eb8161108c565b93969395505050506040820135916060013590565b5f60208284031215611310575f5ffd5b813561115b8161108c565b5f5f6020838503121561132c575f5ffd5b823567ffffffffffffffff811115611342575f5ffd5b8301601f81018513611352575f5ffd5b803567ffffffffffffffff811115611368575f5ffd5b856020828401011115611379575f5ffd5b6020919091019590945092505050565b5f60208284031215611399575f5ffd5b8151801515811461115b575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156113e6575f5ffd5b815161115b8161108c565b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215611453575f5ffd5b505191905056fea26469706673582212202c42c92d65f6f44be16b51a5a779e97a22a93acc208b28e1eea0aff5bf2b14e664736f6c634300081b0033",
+ 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: "0x60e060405234801561000f575f5ffd5b5060405161192338038061192383398101604081905261002e916101b3565b808084846001600160a01b038116610059576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0526100748161008a565b60c0525061008290506100d0565b5050506102e4565b5f5f829050601f815111156100bd578260405163305a27a960e01b81526004016100b49190610289565b60405180910390fd5b80516100c8826102be565b179392505050565b5f54610100900460ff16156101375760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100b4565b5f5460ff90811614610186575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461019c575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101c5575f5ffd5b83516101d081610188565b60208501519093506101e181610188565b60408501519092506001600160401b038111156101fc575f5ffd5b8401601f8101861361020c575f5ffd5b80516001600160401b038111156102255761022561019f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102535761025361019f565b60405281815282820160200188101561026a575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102de575f198160200360031b1b821691505b50919050565b60805160a05160c0516115f26103315f395f81816104bf0152610e9a01525f8181610360015261068d01525f818161023c015281816103f8015281816104fd0152610bc201526115f25ff3fe608060405234801561000f575f5ffd5b5060043610610148575f3560e01c8063a1060c88116100bf578063dce974b911610079578063dce974b914610334578063df5cf7231461035b578063ec76f44214610382578063f2fde38b146103b5578063f698da25146103c8578063fabc1cbc146103d0575f5ffd5b8063a1060c881461029a578063a364f4da146102ad578063a98fb355146102c0578063c825fe68146102d3578063cd6dc687146102fa578063d79aceab1461030d575f5ffd5b80635ac86ab7116101105780635ac86ab7146101fa5780635c975abb1461021d578063715018a61461022f578063886f1195146102375780638da5cb5b146102765780639926ee7d14610287575f5ffd5b8063136439dd1461014c578063374823b51461016157806349075da3146101a357806354fd4d50146101dd578063595c6a67146101f2575b5f5ffd5b61015f61015a36600461119f565b6103e3565b005b61018e61016f3660046111ca565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101d06101b13660046111f4565b609860209081525f928352604080842090915290825290205460ff1681565b60405161019a919061123f565b6101e56104b8565b60405161019a9190611293565b61015f6104e8565b61018e6102083660046112ac565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161019a565b61015f610597565b61025e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161019a565b6033546001600160a01b031661025e565b61015f61029536600461133a565b6105a8565b6102216102a8366004611427565b6107c7565b61015f6102bb36600461146a565b610846565b61015f6102ce366004611485565b61092b565b6102217f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b61015f6103083660046111ca565b610972565b6102217fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102217f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61025e7f000000000000000000000000000000000000000000000000000000000000000081565b61015f61039036600461119f565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b61015f6103c336600461146a565b610a8e565b610221610b07565b61015f6103de36600461119f565b610bc0565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610445573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046991906114f3565b61048657604051631d77d47760e21b815260040160405180910390fd5b60665481811681146104ab5760405163c61dca5d60e01b815260040160405180910390fd5b6104b482610ccf565b5050565b60606104e37f0000000000000000000000000000000000000000000000000000000000000000610d0c565b905090565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561054a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061056e91906114f3565b61058b57604051631d77d47760e21b815260040160405180910390fd5b6105955f19610ccf565b565b61059f610d49565b6105955f610da3565b6066545f906001908116036105d05760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156106095761060961122b565b0361062757604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561066e57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156106d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f691906114f3565b61071357604051639f88c8af60e01b815260040160405180910390fd5b6107378361072b8533866020015187604001516107c7565b84516040860151610df4565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916107ba919061123f565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f9061083d9060c00160405160208183030381529060405280519060200120610e4c565b95945050505050565b6066545f9060019081160361086e5760405163840a48d560e01b815260040160405180910390fd5b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff1660018111156108a7576108a761122b565b146108c5576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161091f919061123f565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610966929190611512565b60405180910390a25050565b5f54610100900460ff161580801561099057505f54600160ff909116105b806109a95750303b1580156109a957505f5460ff166001145b610a115760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015610a32575f805461ff0019166101001790555b610a3b82610ccf565b610a4483610da3565b8015610a89575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610a96610d49565b6001600160a01b038116610afb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a08565b610b0481610da3565b50565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea610b74610e92565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c1c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c409190611540565b6001600160a01b0316336001600160a01b031614610c715760405163794821ff60e01b815260040160405180910390fd5b60665480198219811614610c985760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610966565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b60605f610d1883610f2e565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6033546001600160a01b031633146105955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a08565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b42811015610e1557604051630819bdcd60e01b815260040160405180910390fd5b610e296001600160a01b0385168484610f5b565b610e4657604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610e55610b07565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60605f610ebe7f0000000000000000000000000000000000000000000000000000000000000000610d0c565b9050805f81518110610ed257610ed261155b565b602001015160f81c60f81b81600181518110610ef057610ef061155b565b016020908101516040516001600160f81b03199384169281019290925291909116602182015260220160405160208183030381529060405291505090565b5f60ff8216601f811115610f5557604051632cd44ac360e21b815260040160405180910390fd5b92915050565b5f5f5f610f688585610fb9565b90925090505f816004811115610f8057610f8061122b565b148015610f9e5750856001600160a01b0316826001600160a01b0316145b80610faf5750610faf868686610ffb565b9695505050505050565b5f5f8251604103610fed576020830151604084015160608501515f1a610fe1878285856110e2565b94509450505050610ff4565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b868660405160240161102392919061156f565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611061919061158f565b5f60405180830381855afa9150503d805f8114611099576040519150601f19603f3d011682016040523d82523d5f602084013e61109e565b606091505b50915091508180156110b257506020815110155b8015610faf57508051630b135d3f60e11b906110d790830160209081019084016115a5565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561111757505f90506003611196565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611168573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611190575f60019250925050611196565b91505f90505b94509492505050565b5f602082840312156111af575f5ffd5b5035919050565b6001600160a01b0381168114610b04575f5ffd5b5f5f604083850312156111db575f5ffd5b82356111e6816111b6565b946020939093013593505050565b5f5f60408385031215611205575f5ffd5b8235611210816111b6565b91506020830135611220816111b6565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061125f57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6112a56020830184611265565b9392505050565b5f602082840312156112bc575f5ffd5b813560ff811681146112a5575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611303576113036112cc565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611332576113326112cc565b604052919050565b5f5f6040838503121561134b575f5ffd5b8235611356816111b6565b9150602083013567ffffffffffffffff811115611371575f5ffd5b830160608186031215611382575f5ffd5b61138a6112e0565b813567ffffffffffffffff8111156113a0575f5ffd5b8201601f810187136113b0575f5ffd5b803567ffffffffffffffff8111156113ca576113ca6112cc565b6113dd601f8201601f1916602001611309565b8181528860208385010111156113f1575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f6080858703121561143a575f5ffd5b8435611445816111b6565b93506020850135611455816111b6565b93969395505050506040820135916060013590565b5f6020828403121561147a575f5ffd5b81356112a5816111b6565b5f5f60208385031215611496575f5ffd5b823567ffffffffffffffff8111156114ac575f5ffd5b8301601f810185136114bc575f5ffd5b803567ffffffffffffffff8111156114d2575f5ffd5b8560208284010111156114e3575f5ffd5b6020919091019590945092505050565b5f60208284031215611503575f5ffd5b815180151581146112a5575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60208284031215611550575f5ffd5b81516112a5816111b6565b634e487b7160e01b5f52603260045260245ffd5b828152604060208201525f6115876040830184611265565b949350505050565b5f82518060208501845e5f920191825250919050565b5f602082840312156115b5575f5ffd5b505191905056fea26469706673582212205db0005f57345fba89da0e86c8a4b123fbdd941cafc25d55da07e5d1955972cf64736f6c634300081b0033",
}
// AVSDirectoryABI is the input ABI used to generate the binding from.
@@ -51,7 +51,7 @@ var AVSDirectoryABI = AVSDirectoryMetaData.ABI
var AVSDirectoryBin = AVSDirectoryMetaData.Bin
// DeployAVSDirectory deploys a new Ethereum contract, binding an instance of AVSDirectory to it.
-func DeployAVSDirectory(auth *bind.TransactOpts, backend bind.ContractBackend, _delegation common.Address, _pauserRegistry common.Address) (common.Address, *types.Transaction, *AVSDirectory, error) {
+func DeployAVSDirectory(auth *bind.TransactOpts, backend bind.ContractBackend, _delegation common.Address, _pauserRegistry common.Address, _version string) (common.Address, *types.Transaction, *AVSDirectory, error) {
parsed, err := AVSDirectoryMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
@@ -60,7 +60,7 @@ func DeployAVSDirectory(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(AVSDirectoryBin), backend, _delegation, _pauserRegistry)
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(AVSDirectoryBin), backend, _delegation, _pauserRegistry, _version)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -581,6 +581,37 @@ func (_AVSDirectory *AVSDirectoryCallerSession) PauserRegistry() (common.Address
return _AVSDirectory.Contract.PauserRegistry(&_AVSDirectory.CallOpts)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_AVSDirectory *AVSDirectoryCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _AVSDirectory.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_AVSDirectory *AVSDirectorySession) Version() (string, error) {
+ return _AVSDirectory.Contract.Version(&_AVSDirectory.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_AVSDirectory *AVSDirectoryCallerSession) Version() (string, error) {
+ return _AVSDirectory.Contract.Version(&_AVSDirectory.CallOpts)
+}
+
// CancelSalt is a paid mutator transaction binding the contract method 0xec76f442.
//
// Solidity: function cancelSalt(bytes32 salt) returns()
@@ -689,21 +720,21 @@ func (_AVSDirectory *AVSDirectoryTransactorSession) PauseAll() (*types.Transacti
// RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d.
//
// Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns()
-func (_AVSDirectory *AVSDirectoryTransactor) RegisterOperatorToAVS(opts *bind.TransactOpts, operator common.Address, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) {
+func (_AVSDirectory *AVSDirectoryTransactor) RegisterOperatorToAVS(opts *bind.TransactOpts, operator common.Address, operatorSignature ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry) (*types.Transaction, error) {
return _AVSDirectory.contract.Transact(opts, "registerOperatorToAVS", operator, operatorSignature)
}
// RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d.
//
// Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns()
-func (_AVSDirectory *AVSDirectorySession) RegisterOperatorToAVS(operator common.Address, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) {
+func (_AVSDirectory *AVSDirectorySession) RegisterOperatorToAVS(operator common.Address, operatorSignature ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry) (*types.Transaction, error) {
return _AVSDirectory.Contract.RegisterOperatorToAVS(&_AVSDirectory.TransactOpts, operator, operatorSignature)
}
// RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d.
//
// Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns()
-func (_AVSDirectory *AVSDirectoryTransactorSession) RegisterOperatorToAVS(operator common.Address, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) {
+func (_AVSDirectory *AVSDirectoryTransactorSession) RegisterOperatorToAVS(operator common.Address, operatorSignature ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry) (*types.Transaction, error) {
return _AVSDirectory.Contract.RegisterOperatorToAVS(&_AVSDirectory.TransactOpts, operator, operatorSignature)
}
diff --git a/pkg/bindings/AVSDirectoryStorage/binding.go b/pkg/bindings/AVSDirectoryStorage/binding.go
index 9ac3cb91bd..a6e00bb6f8 100644
--- a/pkg/bindings/AVSDirectoryStorage/binding.go
+++ b/pkg/bindings/AVSDirectoryStorage/binding.go
@@ -29,8 +29,8 @@ var (
_ = abi.ConvertType
)
-// ISignatureUtilsSignatureWithSaltAndExpiry is an auto generated low-level Go binding around an user-defined struct.
-type ISignatureUtilsSignatureWithSaltAndExpiry struct {
+// ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry is an auto generated low-level Go binding around an user-defined struct.
+type ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry struct {
Signature []byte
Salt [32]byte
Expiry *big.Int
@@ -38,7 +38,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct {
// AVSDirectoryStorageMetaData contains all meta data concerning the AVSDirectoryStorage contract.
var AVSDirectoryStorageMetaData = &bind.MetaData{
- ABI: "[{\"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\":\"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\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"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\":[]}]",
+ ABI: "[{\"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\":\"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\":\"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\":\"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\":\"error\",\"name\":\"InvalidSignature\",\"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\":[]}]",
}
// AVSDirectoryStorageABI is the input ABI used to generate the binding from.
@@ -373,6 +373,37 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) Delegation() (comm
return _AVSDirectoryStorage.Contract.Delegation(&_AVSDirectoryStorage.CallOpts)
}
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error) {
+ var out []interface{}
+ err := _AVSDirectoryStorage.contract.Call(opts, &out, "domainSeparator")
+
+ if err != nil {
+ return *new([32]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+ return out0, err
+
+}
+
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_AVSDirectoryStorage *AVSDirectoryStorageSession) DomainSeparator() ([32]byte, error) {
+ return _AVSDirectoryStorage.Contract.DomainSeparator(&_AVSDirectoryStorage.CallOpts)
+}
+
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) DomainSeparator() ([32]byte, error) {
+ return _AVSDirectoryStorage.Contract.DomainSeparator(&_AVSDirectoryStorage.CallOpts)
+}
+
// OperatorSaltIsSpent is a free data retrieval call binding the contract method 0x374823b5.
//
// Solidity: function operatorSaltIsSpent(address operator, bytes32 salt) view returns(bool isSpent)
@@ -404,6 +435,37 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) OperatorSaltIsSpen
return _AVSDirectoryStorage.Contract.OperatorSaltIsSpent(&_AVSDirectoryStorage.CallOpts, operator, salt)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _AVSDirectoryStorage.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_AVSDirectoryStorage *AVSDirectoryStorageSession) Version() (string, error) {
+ return _AVSDirectoryStorage.Contract.Version(&_AVSDirectoryStorage.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) Version() (string, error) {
+ return _AVSDirectoryStorage.Contract.Version(&_AVSDirectoryStorage.CallOpts)
+}
+
// CancelSalt is a paid mutator transaction binding the contract method 0xec76f442.
//
// Solidity: function cancelSalt(bytes32 salt) returns()
@@ -470,21 +532,21 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) Initialize(ini
// RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d.
//
// Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns()
-func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) RegisterOperatorToAVS(opts *bind.TransactOpts, operator common.Address, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) {
+func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) RegisterOperatorToAVS(opts *bind.TransactOpts, operator common.Address, operatorSignature ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry) (*types.Transaction, error) {
return _AVSDirectoryStorage.contract.Transact(opts, "registerOperatorToAVS", operator, operatorSignature)
}
// RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d.
//
// Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns()
-func (_AVSDirectoryStorage *AVSDirectoryStorageSession) RegisterOperatorToAVS(operator common.Address, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) {
+func (_AVSDirectoryStorage *AVSDirectoryStorageSession) RegisterOperatorToAVS(operator common.Address, operatorSignature ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry) (*types.Transaction, error) {
return _AVSDirectoryStorage.Contract.RegisterOperatorToAVS(&_AVSDirectoryStorage.TransactOpts, operator, operatorSignature)
}
// RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d.
//
// Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns()
-func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) RegisterOperatorToAVS(operator common.Address, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) {
+func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) RegisterOperatorToAVS(operator common.Address, operatorSignature ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry) (*types.Transaction, error) {
return _AVSDirectoryStorage.Contract.RegisterOperatorToAVS(&_AVSDirectoryStorage.TransactOpts, operator, operatorSignature)
}
diff --git a/pkg/bindings/AllocationManager/binding.go b/pkg/bindings/AllocationManager/binding.go
index 8d9e421797..28e293a2ac 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\"}],\"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\":\"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\":\"encumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"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\":\"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\":\"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\":\"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\":\"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\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"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\":\"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\":\"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\":\"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\":\"renounceOwnership\",\"inputs\":[],\"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\":[],\"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\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":\"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\":\"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\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"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\":\"UninitializedAllocationDelay\",\"inputs\":[]}]",
- Bin: "0x610120604052348015610010575f5ffd5b50604051615b41380380615b4183398101604081905261002f91610180565b82858383876001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05263ffffffff91821660c0521660e052166101005261008b610095565b50505050506101e9565b5f54610100900460ff16156101005760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461014f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610165575f5ffd5b50565b805163ffffffff8116811461017b575f5ffd5b919050565b5f5f5f5f5f60a08688031215610194575f5ffd5b855161019f81610151565b60208701519095506101b081610151565b60408701519094506101c181610151565b92506101cf60608701610168565b91506101dd60808701610168565b90509295509295909350565b60805160a05160c05160e051610100516158c761027a5f395f81816103f901526137b301525f81816105480152613db301525f818161031e0152818161223e015261294601525f81816106fa01528181610c970152818161161c01528181611c8301528181611ced0152612c0d01525f818161056f0152818161079201528181611d92015261342a01526158c75ff3fe608060405234801561000f575f5ffd5b5060043610610281575f3560e01c80636e875dba11610156578063a984eb3a116100ca578063c221d8ae11610084578063c221d8ae146106bc578063cd6dc687146106cf578063d3d96ff4146106e2578063df5cf723146106f5578063f2fde38b1461071c578063fabc1cbc1461072f575f5ffd5b8063a984eb3a1461060e578063adc2e3d914610641578063b2447af714610654578063b66bd98914610667578063b9fbaed11461067a578063ba1a84e5146106a9575f5ffd5b80638ce648541161011b5780638ce64854146105915780638da5cb5b146105b157806394d7d00c146105c2578063952899ee146105d5578063a9333ec8146105e8578063a9821821146105fb575f5ffd5b80636e875dba14610515578063715018a61461052857806379ae50cd146105305780637bc1ef6114610543578063886f11951461056a575f5ffd5b80634657e26a116101f8578063595c6a67116101b2578063595c6a67146104875780635ac86ab71461048f5780635c975abb146104b2578063670d3ba2146104c45780636cfb4481146104d75780636e3492b514610502575f5ffd5b80634657e26a146103f45780634a10ffe51461041b5780634b5046ef1461043b57806350feea201461044e578063547afb871461046157806356c483e614610474575f5ffd5b80632981eb77116102495780632981eb77146103195780632bab2c4a14610355578063304c10cd1461037557806336352057146103a057806340120dab146103b35780634177a87c146103d4575f5ffd5b806310e1b9b814610285578063136439dd146102ae57806315fe5028146102c3578063260dc758146102e3578063261f84e014610306575b5f5ffd5b6102986102933660046147e3565b610742565b6040516102a5919061482a565b60405180910390f35b6102c16102bc36600461485d565b61077d565b005b6102d66102d1366004614874565b610852565b6040516102a591906148f2565b6102f66102f1366004614904565b610969565b60405190151581526020016102a5565b6102c161031436600461495e565b6109a0565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102a5565b610368610363366004614a43565b610c43565b6040516102a59190614af7565b610388610383366004614874565b610f30565b6040516001600160a01b0390911681526020016102a5565b6102c16103ae366004614b5a565b610f5f565b6103c66103c1366004614bac565b611771565b6040516102a5929190614c39565b6103e76103e2366004614904565b6118ec565b6040516102a59190614c96565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b61042e610429366004614ca8565b611910565b6040516102a59190614ceb565b6102c1610449366004614d36565b6119b8565b6102c161045c366004614db6565b611a72565b61042e61046f366004614e14565b611bd0565b6102c1610482366004614e60565b611c78565b6102c1611d7d565b6102f661049d366004614e93565b606654600160ff9092169190911b9081161490565b6066545b6040519081526020016102a5565b6102f66104d2366004614eb3565b611e2c565b6104ea6104e5366004614bac565b611e3d565b6040516001600160401b0390911681526020016102a5565b6102c1610510366004614ef4565b611faa565b6103e7610523366004614904565b61238b565b6102c161239c565b6102d661053e366004614874565b6123ad565b6103407f000000000000000000000000000000000000000000000000000000000000000081565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6105a461059f366004614f25565b612487565b6040516102a59190614f68565b6033546001600160a01b0316610388565b61042e6105d0366004614f7a565b61254c565b6102c16105e3366004614fd5565b612638565b6104ea6105f6366004614bac565b612aff565b6102c161060936600461517e565b612b2e565b6104ea61061c366004614bac565b60a260209081525f92835260408084209091529082529020546001600160401b031681565b6102c161064f3660046151fc565b612b9e565b6104b6610662366004614904565b612efb565b6102c1610675366004614db6565b612f1d565b61068d610688366004614874565b613077565b60408051921515835263ffffffff9091166020830152016102a5565b6104b66106b7366004614874565b613111565b6103e76106ca366004614eb3565b613131565b6102c16106dd36600461523e565b613162565b6102c16106f0366004614bac565b61327f565b6103887f000000000000000000000000000000000000000000000000000000000000000081565b6102c161072a366004614874565b6133af565b6102c161073d36600461485d565b613428565b604080516060810182525f80825260208201819052918101829052906107718561076b8661353e565b856135a1565b925050505b9392505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156107df573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108039190615268565b61082057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146108455760405163c61dca5d60e01b815260040160405180910390fd5b61084e8261370d565b5050565b6001600160a01b0381165f908152609d60205260408120606091906108769061374a565b90505f816001600160401b0381111561089157610891614707565b6040519080825280602002602001820160405280156108d557816020015b604080518082019091525f80825260208201528152602001906001900390816108af5790505b5090505f5b82811015610961576001600160a01b0385165f908152609d6020526040902061093c906109079083613753565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b82828151811061094e5761094e615287565b60209081029190910101526001016108da565b509392505050565b60208082015182516001600160a01b03165f90815260989092526040822061099a9163ffffffff9081169061375e16565b92915050565b826109aa81613775565b6109c75760405163932d94f760e01b815260040160405180910390fd5b5f5b82811015610c3c575f6040518060400160405280876001600160a01b031681526020018686858181106109fe576109fe615287565b9050602002810190610a10919061529b565b610a1e9060208101906152b9565b63ffffffff168152509050610a68816020015163ffffffff1660985f896001600160a01b03166001600160a01b031681526020019081526020015f2061381f90919063ffffffff16565b610a8557604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280886001600160a01b03168152602001836020015163ffffffff16815250604051610adb91906152d2565b60405180910390a15f610aed8261353e565b90505f5b868685818110610b0357610b03615287565b9050602002810190610b15919061529b565b610b239060208101906152e0565b9050811015610c3157610b99878786818110610b4157610b41615287565b9050602002810190610b53919061529b565b610b619060208101906152e0565b83818110610b7157610b71615287565b9050602002016020810190610b869190614874565b5f8481526099602052604090209061382a565b507f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83888887818110610bce57610bce615287565b9050602002810190610be0919061529b565b610bee9060208101906152e0565b84818110610bfe57610bfe615287565b9050602002016020810190610c139190614874565b604051610c21929190615325565b60405180910390a1600101610af1565b5050506001016109c9565b5050505050565b606083516001600160401b03811115610c5e57610c5e614707565b604051908082528060200260200182016040528015610c9157816020015b6060815260200190600190039081610c7c5790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b8152600401610ce392919061534b565b5f60405180830381865afa158015610cfd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d24919081019061536f565b90505f5b8551811015610f26575f868281518110610d4457610d44615287565b6020026020010151905085516001600160401b03811115610d6757610d67614707565b604051908082528060200260200182016040528015610d90578160200160208202803683370190505b50848381518110610da357610da3615287565b60209081029190910101525f5b8651811015610f1c575f878281518110610dcc57610dcc615287565b6020908102919091018101516001600160a01b038086165f90815260a1845260408082209284168252919093528220909250610e079061383e565b9050806001600160401b03165f03610e20575050610f14565b5f610e2c858d85610742565b90508863ffffffff16816040015163ffffffff1611158015610e5457505f8160200151600f0b125b15610e7657610e6a815f01518260200151613851565b6001600160401b031681525b80515f90610e91906001600160401b03908116908516613865565b9050610ed881898981518110610ea957610ea9615287565b60200260200101518781518110610ec257610ec2615287565b602002602001015161387990919063ffffffff16565b898881518110610eea57610eea615287565b60200260200101518681518110610f0357610f03615287565b602002602001018181525050505050505b600101610db0565b5050600101610d28565b5050949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610f585780610776565b5090919050565b606654600190600290811603610f885760405163840a48d560e01b815260040160405180910390fd5b82610f9281613775565b610faf5760405163932d94f760e01b815260040160405180910390fd5b5f6040518060400160405280866001600160a01b03168152602001856020016020810190610fdd91906152b9565b63ffffffff16905290505f610ffe610ff86020870187614874565b8361388d565b905061100d60608601866152e0565b905061101c60408701876152e0565b90501461103c576040516343714afd60e01b815260040160405180910390fd5b60208083015183516001600160a01b03165f9081526098909252604090912061106e9163ffffffff9081169061375e16565b61108b57604051631fb1705560e21b815260040160405180910390fd5b806110a95760405163ebbff49760e01b815260040160405180910390fd5b5f6110b760408701876152e0565b90506001600160401b038111156110d0576110d0614707565b6040519080825280602002602001820160405280156110f9578160200160208202803683370190505b5090505f5b61110b60408801886152e0565b90508110156117025780158061119e575061112960408801886152e0565b61113460018461548f565b81811061114357611143615287565b90506020020160208101906111589190614874565b6001600160a01b031661116e60408901896152e0565b8381811061117e5761117e615287565b90506020020160208101906111939190614874565b6001600160a01b0316115b6111bb57604051639f1c805360e01b815260040160405180910390fd5b6111c860608801886152e0565b828181106111d8576111d8615287565b905060200201355f1080156112185750670de0b6b3a76400006111fe60608901896152e0565b8381811061120e5761120e615287565b9050602002013511155b61123557604051631353603160e01b815260040160405180910390fd5b61129161124560408901896152e0565b8381811061125557611255615287565b905060200201602081019061126a9190614874565b60995f6112768861353e565b81526020019081526020015f2061390390919063ffffffff16565b6112ae576040516331bc342760e11b815260040160405180910390fd5b5f806113006112c060208b018b614874565b6112c98861353e565b6112d660408d018d6152e0565b878181106112e6576112e6615287565b90506020020160208101906112fb9190614874565b6135a1565b805191935091506001600160401b03165f0361131d5750506116fa565b5f61135861132e60608c018c6152e0565b8681811061133e5761133e615287565b85516001600160401b031692602090910201359050613924565b83519091506113736001600160401b03808416908316613865565b86868151811061138557611385615287565b60200260200101818152505081835f018181516113a291906154a2565b6001600160401b03169052508351829085906113bf9083906154a2565b6001600160401b03169052506020840180518391906113df9083906154a2565b6001600160401b031690525060208301515f600f9190910b12156114fa575f61144261140e60608e018e6152e0565b8881811061141e5761141e615287565b905060200201358560200151611433906154c1565b6001600160801b031690613924565b9050806001600160401b03168460200181815161145f91906154e5565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61149360208e018e614874565b8a8e80604001906114a491906152e0565b8a8181106114b4576114b4615287565b90506020020160208101906114c99190614874565b6114da885f01518960200151613851565b88604001516040516114f0959493929190615512565b60405180910390a1505b61154c61150a60208d018d614874565b6115138a61353e565b61152060408f018f6152e0565b8981811061153057611530615287565b90506020020160208101906115459190614874565b878761393a565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61157a60208d018d614874565b8961158860408f018f6152e0565b8981811061159857611598615287565b90506020020160208101906115ad9190614874565b86516040516115c194939291904390615512565b60405180910390a16116126115d960208d018d614874565b6115e660408e018e6152e0565b888181106115f6576115f6615287565b905060200201602081019061160b9190614874565b8651613b7a565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663601bb36f61164e60208e018e614874565b61165b60408f018f6152e0565b8981811061166b5761166b615287565b90506020020160208101906116809190614874565b875160405160e085901b6001600160e01b03191681526001600160a01b0393841660048201529290911660248301526001600160401b0380861660448401521660648201526084015f604051808303815f87803b1580156116df575f5ffd5b505af11580156116f1573d5f5f3e3d5ffd5b50505050505050505b6001016110fe565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe56117316020880188614874565b8461173f60408a018a6152e0565b8561174d60808d018d615563565b60405161176097969594939291906155cd565b60405180910390a150505050505050565b6001600160a01b0382165f908152609d6020526040812060609182916117969061374a565b90505f816001600160401b038111156117b1576117b1614707565b6040519080825280602002602001820160405280156117f557816020015b604080518082019091525f80825260208201528152602001906001900390816117cf5790505b5090505f826001600160401b0381111561181157611811614707565b60405190808252806020026020018201604052801561185a57816020015b604080516060810182525f80825260208083018290529282015282525f1990920191018161182f5790505b5090505f5b838110156118dd576001600160a01b0388165f908152609d6020526040812061188c906109079084613753565b9050808483815181106118a1576118a1615287565b60200260200101819052506118b789828a610742565b8383815181106118c9576118c9615287565b60209081029190910101525060010161185f565b509093509150505b9250929050565b60605f61077660995f6118fe8661353e565b81526020019081526020015f20613bfc565b60605f83516001600160401b0381111561192c5761192c614707565b604051908082528060200260200182016040528015611955578160200160208202803683370190505b5090505f5b84518110156109615761198685828151811061197857611978615287565b602002602001015185612aff565b82828151811061199857611998615287565b6001600160401b039092166020928302919091019091015260010161195a565b6066545f906001908116036119e05760405163840a48d560e01b815260040160405180910390fd5b838214611a00576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015611a6957611a6187878784818110611a2057611a20615287565b9050602002016020810190611a359190614874565b868685818110611a4757611a47615287565b9050602002016020810190611a5c9190615663565b613c08565b600101611a02565b50505050505050565b83611a7c81613775565b611a995760405163932d94f760e01b815260040160405180910390fd5b604080518082019091526001600160a01b038616815263ffffffff851660208201525f611ac58261353e565b9050611b06826020015163ffffffff1660985f8a6001600160a01b03166001600160a01b031681526020019081526020015f2061375e90919063ffffffff16565b611b2357604051631fb1705560e21b815260040160405180910390fd5b5f5b84811015611bc657611b42868683818110610b7157610b71615287565b611b5f5760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83878784818110611b9357611b93615287565b9050602002016020810190611ba89190614874565b604051611bb6929190615325565b60405180910390a1600101611b25565b5050505050505050565b60605f82516001600160401b03811115611bec57611bec614707565b604051908082528060200260200182016040528015611c15578160200160208202803683370190505b5090505f5b835181101561096157611c4685858381518110611c3957611c39615287565b6020026020010151612aff565b828281518110611c5857611c58615287565b6001600160401b0390921660209283029190910190910152600101611c1a565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d7357611cb182613775565b611cce576040516348f5c3ed60e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611d32573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d569190615268565b611d735760405163ccea9e6f60e01b815260040160405180910390fd5b61084e8282613d0c565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611ddf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e039190615268565b611e2057604051631d77d47760e21b815260040160405180910390fd5b611e2a5f1961370d565b565b5f61077683609a5f6112768661353e565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b0390911690600f81810b600160801b909204900b03825b81811015611f67576001600160a01b038087165f90815260a3602090815260408083209389168352929052908120611ecf9083613eb8565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff16918101829052919250431015611f4a575050611f67565b611f58858260200151613851565b94505050806001019050611e97565b506001600160a01b038086165f90815260a1602090815260408083209388168352929052208290611f979061383e565b611fa191906154a2565b95945050505050565b606654600290600490811603611fd35760405163840a48d560e01b815260040160405180910390fd5b611fe8611fe36020840184614874565b613775565b806120015750612001611fe36040840160208501614874565b61201e576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b61202d60408401846152e0565b90508110156122ef575f60405180604001604052808560200160208101906120559190614874565b6001600160a01b0316815260200161207060408701876152e0565b8581811061208057612080615287565b905060200201602081019061209591906152b9565b63ffffffff1681525090506120e2816020015163ffffffff1660985f8760200160208101906120c49190614874565b6001600160a01b0316815260208101919091526040015f209061375e565b6120ff57604051631fb1705560e21b815260040160405180910390fd5b609e5f61210f6020870187614874565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6121388361353e565b815260208101919091526040015f205460ff16612168576040516325131d4f60e01b815260040160405180910390fd5b6121a26121748261353e565b609c5f6121846020890189614874565b6001600160a01b0316815260208101919091526040015f2090613f27565b506121da6121b36020860186614874565b609a5f6121bf8561353e565b81526020019081526020015f20613f3290919063ffffffff16565b506121e86020850185614874565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe8260405161222091906152d2565b60405180910390a2604080518082019091525f8152602081016122637f000000000000000000000000000000000000000000000000000000000000000043615684565b63ffffffff169052609e5f61227b6020880188614874565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6122a48461353e565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101612020565b506123036103836040840160208501614874565b6001600160a01b031663303ca95661231e6020850185614874565b61232e6040860160208701614874565b61233b60408701876152e0565b6040518563ffffffff1660e01b815260040161235a94939291906156d9565b5f604051808303815f87803b158015612371575f5ffd5b505af1925050508015612382575060015b1561084e575050565b606061099a609a5f6118fe8561353e565b6123a4613f46565b611e2a5f613fa0565b6001600160a01b0381165f908152609c60205260408120606091906123d19061374a565b90505f816001600160401b038111156123ec576123ec614707565b60405190808252806020026020018201604052801561243057816020015b604080518082019091525f808252602082015281526020019060019003908161240a5790505b5090505f5b82811015610961576001600160a01b0385165f908152609c60205260409020612462906109079083613753565b82828151811061247457612474615287565b6020908102919091010152600101612435565b60605f84516001600160401b038111156124a3576124a3614707565b6040519080825280602002602001820160405280156124ec57816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816124c15790505b5090505f5b85518110156125435761251e86828151811061250f5761250f615287565b60200260200101518686610742565b82828151811061253057612530615287565b60209081029190910101526001016124f1565b50949350505050565b60605f83516001600160401b0381111561256857612568614707565b604051908082528060200260200182016040528015612591578160200160208202803683370190505b5090505f5b8451811015612543576001600160a01b0386165f90815260a1602052604081208651612606928792918990869081106125d1576125d1615287565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20613ff190919063ffffffff16565b82828151811061261857612618615287565b6001600160401b0390921660209283029190910190910152600101612596565b6066545f906001908116036126605760405163840a48d560e01b815260040160405180910390fd5b61266983613775565b612686576040516348f5c3ed60e01b815260040160405180910390fd5b5f5f5f61269286613077565b91509150816126b45760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b8351811015610c3c578381815181106126d5576126d5615287565b602002602001015160400151518482815181106126f4576126f4615287565b602002602001015160200151511461271f576040516343714afd60e01b815260040160405180910390fd5b5f84828151811061273257612732615287565b602090810291909101810151518082015181516001600160a01b03165f908152609890935260409092209092506127729163ffffffff9081169061375e16565b61278f57604051631fb1705560e21b815260040160405180910390fd5b5f61279a878361388d565b90505f5b8684815181106127b0576127b0615287565b60200260200101516020015151811015612af4575f8785815181106127d7576127d7615287565b60200260200101516020015182815181106127f4576127f4615287565b6020026020010151905061280b898261ffff613c08565b5f5f61281a8b61076b8861353e565b915091508060200151600f0b5f1461284557604051630d8fcbe360e41b815260040160405180910390fd5b5f61285287858489614005565b9050612897825f01518c8a8151811061286d5761286d615287565b602002602001015160400151878151811061288a5761288a615287565b602002602001015161403b565b600f0b602083018190525f036128c057604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b1215612a04578015612986576129416128e18861353e565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b61296b7f000000000000000000000000000000000000000000000000000000000000000043615684565b612976906001615684565b63ffffffff166040830152612a71565b61299883602001518360200151613851565b6001600160401b031660208401528a518b90899081106129ba576129ba615287565b60200260200101516040015185815181106129d7576129d7615287565b6020908102919091018101516001600160401b031683525f9083015263ffffffff43166040830152612a71565b5f8260200151600f0b1315612a7157612a2583602001518360200151613851565b6001600160401b039081166020850181905284519091161015612a5b57604051636c9be0bf60e01b815260040160405180910390fd5b612a658943615684565b63ffffffff1660408301525b612a868c612a7e8961353e565b86868661393a565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c612ab46109078a61353e565b86612ac6865f01518760200151613851565b8660400151604051612adc959493929190615512565b60405180910390a150506001909201915061279e9050565b5050506001016126ba565b6001600160a01b038083165f90815260a16020908152604080832093851683529290529081206107769061383e565b82612b3881613775565b612b555760405163932d94f760e01b815260040160405180910390fd5b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138484604051612b90929190615705565b60405180910390a250505050565b606654600290600490811603612bc75760405163840a48d560e01b815260040160405180910390fd5b82612bd181613775565b612bee5760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015612c52573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c769190615268565b612c935760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b612ca260208501856152e0565b9050811015612e6a57604080518082019091525f9080612cc56020880188614874565b6001600160a01b03168152602001868060200190612ce391906152e0565b85818110612cf357612cf3615287565b9050602002016020810190612d0891906152b9565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350612d4492919081169061375e16565b612d6157604051631fb1705560e21b815260040160405180910390fd5b612d6b868261388d565b15612d8957604051636c6c6e2760e11b815260040160405180910390fd5b612db2612d958261353e565b6001600160a01b0388165f908152609c602052604090209061381f565b50612dde86609a5f612dc38561353e565b81526020019081526020015f2061382a90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e82604051612e1891906152d2565b60405180910390a26001600160a01b0386165f908152609e60205260408120600191612e438461353e565b815260208101919091526040015f20805460ff191691151591909117905550600101612c95565b50612e7b6103836020850185614874565b6001600160a01b031663c63fd50285612e976020870187614874565b612ea460208801886152e0565b612eb160408a018a615563565b6040518763ffffffff1660e01b8152600401612ed296959493929190615718565b5f604051808303815f87803b158015612ee9575f5ffd5b505af1158015611bc6573d5f5f3e3d5ffd5b5f61099a609a5f612f0b8561353e565b81526020019081526020015f2061374a565b83612f2781613775565b612f445760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192612f83929161375e16565b612fa057604051631fb1705560e21b815260040160405180910390fd5b5f612faa8261353e565b90505f5b84811015611bc657612ff3868683818110612fcb57612fcb615287565b9050602002016020810190612fe09190614874565b5f84815260996020526040902090613f32565b613010576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee8387878481811061304457613044615287565b90506020020160208101906130599190614874565b604051613067929190615325565b60405180910390a1600101612fae565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b9091041660608201819052849391929190158015906130f85750826060015163ffffffff164310155b15613107575050604081015160015b9590945092505050565b6001600160a01b0381165f90815260986020526040812061099a9061374a565b6001600160a01b0382165f908152609f602052604081206060919061315a90826118fe8661353e565b949350505050565b5f54610100900460ff161580801561318057505f54600160ff909116105b806131995750303b15801561319957505f5460ff166001145b6132015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015613222575f805461ff0019166101001790555b61322b8261370d565b61323483613fa0565b801561327a575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b505050565b8161328981613775565b6132a65760405163932d94f760e01b815260040160405180910390fd5b826001600160a01b0316826001600160a01b031663de1164bb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132ec573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133109190615764565b6001600160a01b03161461333757604051631d0b13c160e31b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf858361338f81610f30565b604080516001600160a01b03938416815292909116602083015201613271565b6133b7613f46565b6001600160a01b03811661341c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016131f8565b61342581613fa0565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613484573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134a89190615764565b6001600160a01b0316336001600160a01b0316146134d95760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146135005760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f815f0151826020015163ffffffff1660405160200161358992919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261099a9061577f565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906136019061383e565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156136a3579092509050613705565b6136b4815f01518260200151613851565b6001600160401b0316815260208101515f600f9190910b12156136f2576136e382602001518260200151613851565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61099a825490565b5f6107768383614052565b5f8181526001830160205260408120541515610776565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156137fb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099a9190615268565b5f6107768383614078565b5f610776836001600160a01b038416614078565b5f61099a82670de0b6b3a76400006140c4565b5f610776826001600160401b0385166154e5565b5f61077683670de0b6b3a764000084614108565b5f6107768383670de0b6b3a7640000614108565b6001600160a01b0382165f908152609e602052604081208190816138b08561353e565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff169282019290925291508061315a57506020015163ffffffff164311159392505050565b6001600160a01b0381165f9081526001830160205260408120541515610776565b5f6107768383670de0b6b3a764000060016141ed565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b03908116911614613a0057602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b15613ae2576001600160a01b0385165f908152609f602090815260408083208784529091529020613aba908461382a565b506001600160a01b0385165f908152609d60205260409020613adc908561381f565b50610c3c565b80516001600160401b03165f03610c3c576001600160a01b0385165f908152609f602090815260408083208784529091529020613b1f9084613f32565b506001600160a01b0385165f908152609f602090815260408083208784529091529020613b4b9061374a565b5f03610c3c576001600160a01b0385165f908152609d60205260409020613b729085613f27565b505050505050565b6001600160a01b038084165f90815260a160209081526040808320938616835292905220613ba9904383614246565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c90606001613271565b60605f6107768361425a565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f81118015613c5257508261ffff1682105b15610c3c576001600160a01b038086165f90815260a3602090815260408083209388168352929052908120613c86906142b3565b90505f5f613c958884896135a1565b91509150806040015163ffffffff16431015613cb357505050610c3c565b613cc0888489858561393a565b6001600160a01b038089165f90815260a360209081526040808320938b16835292905220613ced90614305565b50613cf7856157a2565b9450613d02846157ba565b9350505050613c40565b6001600160a01b0382165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b909204166060820181905215801590613d885750806060015163ffffffff164310155b15613da257604081015163ffffffff168152600160208201525b63ffffffff82166040820152613dd87f000000000000000000000000000000000000000000000000000000000000000043615684565b613de3906001615684565b63ffffffff90811660608381019182526001600160a01b0386165f818152609b602090815260409182902087518154838a0151858b01519851928a1664ffffffffff1990921691909117600160201b91151591909102176cffffffffffffffff0000000000191665010000000000978916979097026cffffffff000000000000000000191696909617600160481b968816968702179055815192835294871694820194909452928301919091527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db9101613271565b5f5f613eda613ec684614382565b8554613ed59190600f0b6157cf565b6143ef565b8454909150600160801b9004600f90810b9082900b12613f0d57604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b5f6107768383614458565b5f610776836001600160a01b038416614458565b6033546001600160a01b03163314611e2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016131f8565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6107768383670de0b6b3a764000061453b565b5f6140168460995f6112768961353e565b801561401f5750815b8015611fa157505090516001600160401b031615159392505050565b5f6107766001600160401b038085169084166157f6565b5f825f01828154811061406757614067615287565b905f5260205f200154905092915050565b5f8181526001830160205260408120546140bd57508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561099a565b505f61099a565b81545f908015614100576140ea846140dd60018461548f565b5f91825260209091200190565b54600160201b90046001600160e01b031661315a565b509092915050565b5f80805f19858709858702925082811083820303915050805f0361413f5783828161413557614135615823565b0492505050610776565b8084116141865760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016131f8565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f5f6141fa868686614108565b9050600183600281111561421057614210615837565b14801561422c57505f848061422757614227615823565b868809115b15611fa15761423c60018261584b565b9695505050505050565b61327a83836001600160401b038416614583565b6060815f018054806020026020016040519081016040528092919081815260200182805480156142a757602002820191905f5260205f20905b815481526020019060010190808311614293575b50505050509050919050565b5f6142cd8254600f81810b600160801b909204900b131590565b156142eb57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f61431f8254600f81810b600160801b909204900b131590565b1561433d57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f6001600160ff1b038211156143eb5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016131f8565b5090565b80600f81900b81146144535760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b60648201526084016131f8565b919050565b5f8181526001830160205260408120548015614532575f61447a60018361548f565b85549091505f9061448d9060019061548f565b90508181146144ec575f865f0182815481106144ab576144ab615287565b905f5260205f200154905080875f0184815481106144cb576144cb615287565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806144fd576144fd61585e565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061099a565b5f91505061099a565b82545f908161454c86868385614686565b9050801561457957614563866140dd60018461548f565b54600160201b90046001600160e01b0316610771565b5091949350505050565b82548015614639575f61459b856140dd60018561548f565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b0316602084015291925090851610156145ed5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff808616911603614637578261460e866140dd60018661548f565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b5f5b81831015610961575f61469b84846146d9565b5f8781526020902090915063ffffffff86169082015463ffffffff1611156146c5578092506146d3565b6146d081600161584b565b93505b50614688565b5f6146e76002848418615872565b6107769084841661584b565b6001600160a01b0381168114613425575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561473d5761473d614707565b60405290565b604051601f8201601f191681016001600160401b038111828210171561476b5761476b614707565b604052919050565b803563ffffffff81168114614453575f5ffd5b5f60408284031215614796575f5ffd5b604080519081016001600160401b03811182821017156147b8576147b8614707565b60405290508082356147c9816146f3565b81526147d760208401614773565b60208201525092915050565b5f5f5f608084860312156147f5575f5ffd5b8335614800816146f3565b925061480f8560208601614786565b9150606084013561481f816146f3565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff16908201526060810161099a565b5f6020828403121561486d575f5ffd5b5035919050565b5f60208284031215614884575f5ffd5b8135610776816146f3565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b828110156148e8576148d286835161488f565b60409590950194602091909101906001016148bf565b5093949350505050565b602081525f61077660208301846148ad565b5f60408284031215614914575f5ffd5b6107768383614786565b5f5f83601f84011261492e575f5ffd5b5081356001600160401b03811115614944575f5ffd5b6020830191508360208260051b85010111156118e5575f5ffd5b5f5f5f60408486031215614970575f5ffd5b833561497b816146f3565b925060208401356001600160401b03811115614995575f5ffd5b6149a18682870161491e565b9497909650939450505050565b5f6001600160401b038211156149c6576149c6614707565b5060051b60200190565b5f82601f8301126149df575f5ffd5b81356149f26149ed826149ae565b614743565b8082825260208201915060208360051b860101925085831115614a13575f5ffd5b602085015b83811015614a39578035614a2b816146f3565b835260209283019201614a18565b5095945050505050565b5f5f5f5f60a08587031215614a56575f5ffd5b614a608686614786565b935060408501356001600160401b03811115614a7a575f5ffd5b614a86878288016149d0565b93505060608501356001600160401b03811115614aa1575f5ffd5b614aad878288016149d0565b925050614abc60808601614773565b905092959194509250565b5f8151808452602084019350602083015f5b828110156148e8578151865260209586019590910190600101614ad9565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614b4e57603f19878603018452614b39858351614ac7565b94506020938401939190910190600101614b1d565b50929695505050505050565b5f5f60408385031215614b6b575f5ffd5b8235614b76816146f3565b915060208301356001600160401b03811115614b90575f5ffd5b830160a08186031215614ba1575f5ffd5b809150509250929050565b5f5f60408385031215614bbd575f5ffd5b8235614bc8816146f3565b91506020830135614ba1816146f3565b5f8151808452602084019350602083015f5b828110156148e857614c2386835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101614bea565b604081525f614c4b60408301856148ad565b8281036020840152611fa18185614bd8565b5f8151808452602084019350602083015f5b828110156148e85781516001600160a01b0316865260209586019590910190600101614c6f565b602081525f6107766020830184614c5d565b5f5f60408385031215614cb9575f5ffd5b82356001600160401b03811115614cce575f5ffd5b614cda858286016149d0565b9250506020830135614ba1816146f3565b602080825282518282018190525f918401906040840190835b81811015614d2b5783516001600160401b0316835260209384019390920191600101614d04565b509095945050505050565b5f5f5f5f5f60608688031215614d4a575f5ffd5b8535614d55816146f3565b945060208601356001600160401b03811115614d6f575f5ffd5b614d7b8882890161491e565b90955093505060408601356001600160401b03811115614d99575f5ffd5b614da58882890161491e565b969995985093965092949392505050565b5f5f5f5f60608587031215614dc9575f5ffd5b8435614dd4816146f3565b9350614de260208601614773565b925060408501356001600160401b03811115614dfc575f5ffd5b614e088782880161491e565b95989497509550505050565b5f5f60408385031215614e25575f5ffd5b8235614e30816146f3565b915060208301356001600160401b03811115614e4a575f5ffd5b614e56858286016149d0565b9150509250929050565b5f5f60408385031215614e71575f5ffd5b8235614e7c816146f3565b9150614e8a60208401614773565b90509250929050565b5f60208284031215614ea3575f5ffd5b813560ff81168114610776575f5ffd5b5f5f60608385031215614ec4575f5ffd5b8235614ecf816146f3565b9150614e8a8460208501614786565b5f60608284031215614eee575f5ffd5b50919050565b5f60208284031215614f04575f5ffd5b81356001600160401b03811115614f19575f5ffd5b61315a84828501614ede565b5f5f5f60808486031215614f37575f5ffd5b83356001600160401b03811115614f4c575f5ffd5b614f58868287016149d0565b93505061480f8560208601614786565b602081525f6107766020830184614bd8565b5f5f5f60608486031215614f8c575f5ffd5b8335614f97816146f3565b925060208401356001600160401b03811115614fb1575f5ffd5b614fbd868287016149d0565b925050614fcc60408501614773565b90509250925092565b5f5f60408385031215614fe6575f5ffd5b8235614ff1816146f3565b915060208301356001600160401b0381111561500b575f5ffd5b8301601f8101851361501b575f5ffd5b80356150296149ed826149ae565b8082825260208201915060208360051b85010192508783111561504a575f5ffd5b602084015b8381101561516f5780356001600160401b0381111561506c575f5ffd5b85016080818b03601f19011215615081575f5ffd5b61508961471b565b6150968b60208401614786565b815260608201356001600160401b038111156150b0575f5ffd5b6150bf8c6020838601016149d0565b60208301525060808201356001600160401b038111156150dd575f5ffd5b6020818401019250508a601f8301126150f4575f5ffd5b81356151026149ed826149ae565b8082825260208201915060208360051b86010192508d831115615123575f5ffd5b6020850194505b828510156151595784356001600160401b0381168114615148575f5ffd5b82526020948501949091019061512a565b604084015250508452506020928301920161504f565b50809450505050509250929050565b5f5f5f60408486031215615190575f5ffd5b833561519b816146f3565b925060208401356001600160401b038111156151b5575f5ffd5b8401601f810186136151c5575f5ffd5b80356001600160401b038111156151da575f5ffd5b8660208284010111156151eb575f5ffd5b939660209190910195509293505050565b5f5f6040838503121561520d575f5ffd5b8235615218816146f3565b915060208301356001600160401b03811115615232575f5ffd5b614e5685828601614ede565b5f5f6040838503121561524f575f5ffd5b823561525a816146f3565b946020939093013593505050565b5f60208284031215615278575f5ffd5b81518015158114610776575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235603e198336030181126152af575f5ffd5b9190910192915050565b5f602082840312156152c9575f5ffd5b61077682614773565b6040810161099a828461488f565b5f5f8335601e198436030181126152f5575f5ffd5b8301803591506001600160401b0382111561530e575f5ffd5b6020019150600581901b36038213156118e5575f5ffd5b60608101615333828561488f565b6001600160a01b039290921660409190910152919050565b604081525f61535d6040830185614c5d565b8281036020840152611fa18185614c5d565b5f6020828403121561537f575f5ffd5b81516001600160401b03811115615394575f5ffd5b8201601f810184136153a4575f5ffd5b80516153b26149ed826149ae565b8082825260208201915060208360051b8501019250868311156153d3575f5ffd5b602084015b838110156154705780516001600160401b038111156153f5575f5ffd5b8501603f81018913615405575f5ffd5b60208101516154166149ed826149ae565b808282526020820191506020808460051b8601010192508b831115615439575f5ffd5b6040840193505b8284101561545b578351825260209384019390910190615440565b865250506020938401939190910190506153d8565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561099a5761099a61547b565b6001600160401b03828116828216039081111561099a5761099a61547b565b5f81600f0b60016001607f1b031981036154dd576154dd61547b565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b03198212171561099a5761099a61547b565b6001600160a01b038616815260c0810161552f602083018761488f565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b5f5f8335601e19843603018112615578575f5ffd5b8301803591506001600160401b03821115615591575f5ffd5b6020019150368190038213156118e5575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b03881681525f60c082016155eb602084018a61488f565b60c060608401528690528660e083015f5b8881101561562c57823561560f816146f3565b6001600160a01b03168252602092830192909101906001016155fc565b50838103608085015261563f8188614ac7565b91505082810360a08401526156558185876155a5565b9a9950505050505050505050565b5f60208284031215615673575f5ffd5b813561ffff81168114610776575f5ffd5b63ffffffff818116838216019081111561099a5761099a61547b565b8183526020830192505f815f5b848110156148e85763ffffffff6156c383614773565b16865260209586019591909101906001016156ad565b6001600160a01b038581168252841660208201526060604082018190525f9061423c90830184866156a0565b602081525f61315a6020830184866155a5565b6001600160a01b038781168252861660208201526080604082018190525f9061574490830186886156a0565b82810360608401526157578185876155a5565b9998505050505050505050565b5f60208284031215615774575f5ffd5b8151610776816146f3565b80516020808301519190811015614eee575f1960209190910360031b1b16919050565b5f600182016157b3576157b361547b565b5060010190565b5f816157c8576157c861547b565b505f190190565b8082018281125f8312801582168215821617156157ee576157ee61547b565b505092915050565b600f82810b9082900b0360016001607f1b0319811260016001607f1b038213171561099a5761099a61547b565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b8082018082111561099a5761099a61547b565b634e487b7160e01b5f52603160045260245ffd5b5f8261588c57634e487b7160e01b5f52601260045260245ffd5b50049056fea264697066735822122003437a6150a69bda5aa66e8a8e31488f1ec2312d4e01e92b3843843784c9e62c64736f6c634300081b0033",
+ 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\":\"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\":\"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\":\"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\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"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\":\"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\":\"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\":\"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\":\"renounceOwnership\",\"inputs\":[],\"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\":[],\"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\":\"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\":\"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\":\"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\":\"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: "0x610140604052348015610010575f5ffd5b50604051615fb7380380615fb783398101604081905261002f916101e6565b8084878585896001600160a01b03811661005c576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05263ffffffff91821660c0521660e052166101005261008d816100a5565b610120525061009a6100eb565b50505050505061034a565b5f5f829050601f815111156100d8578260405163305a27a960e01b81526004016100cf91906102ef565b60405180910390fd5b80516100e382610324565b179392505050565b5f54610100900460ff16156101525760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100cf565b5f5460ff908116146101a1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101b7575f5ffd5b50565b805163ffffffff811681146101cd575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f60c087890312156101fb575f5ffd5b8651610206816101a3565b6020880151909650610217816101a3565b6040880151909550610228816101a3565b9350610236606088016101ba565b9250610244608088016101ba565b60a08801519092506001600160401b0381111561025f575f5ffd5b8701601f8101891361026f575f5ffd5b80516001600160401b03811115610288576102886101d2565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102b6576102b66101d2565b6040528181528282016020018b10156102cd575f5ffd5b8160208401602083015e5f602083830101528093505050509295509295509295565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610344575f198160200360031b1b821691505b50919050565b60805160a05160c05160e0516101005161012051615bd26103e55f395f611b3701525f818161044f015261356c01525f81816105b30152613dfc01525f818161036101528181611fce01526126d001525f8181610732015281816114d501528181611b6b01528181611bd5015281816129ce015261364b01525f81816105da0152818161085801528181611c7a01526131e30152615bd25ff3fe608060405234801561000f575f5ffd5b50600436106102b1575f3560e01c80636cfb44811161017b578063a9821821116100e4578063c221d8ae1161009e578063df5cf72311610079578063df5cf7231461072d578063f2fde38b14610754578063f605ce0814610767578063fabc1cbc1461077a575f5ffd5b8063c221d8ae146106f4578063cd6dc68714610707578063d3d96ff41461071a575f5ffd5b8063a982182114610666578063adc2e3d914610679578063b2447af71461068c578063b66bd9891461069f578063b9fbaed1146106b2578063ba1a84e5146106e1575f5ffd5b8063886f119511610135578063886f1195146105d55780638ce64854146105fc5780638da5cb5b1461061c57806394d7d00c1461062d578063952899ee14610640578063a9333ec814610653575f5ffd5b80636cfb4481146105425780636e3492b51461056d5780636e875dba14610580578063715018a61461059357806379ae50cd1461059b5780637bc1ef61146105ae575f5ffd5b80634177a87c1161021d57806354fd4d50116101d757806354fd4d50146104ca57806356c483e6146104df578063595c6a67146104f25780635ac86ab7146104fa5780635c975abb1461051d578063670d3ba21461052f575f5ffd5b80634177a87c1461042a5780634657e26a1461044a5780634a10ffe5146104715780634b5046ef1461049157806350feea20146104a4578063547afb87146104b7575f5ffd5b80632981eb771161026e5780632981eb771461035c5780632b453a9a146103985780632bab2c4a146103b8578063304c10cd146103cb57806336352057146103f657806340120dab14610409575f5ffd5b806310e1b9b8146102b55780631352c3e6146102de578063136439dd1461030157806315fe502814610316578063260dc75814610336578063261f84e014610349575b5f5ffd5b6102c86102c3366004614a50565b61078d565b6040516102d59190614a97565b60405180910390f35b6102f16102ec366004614aca565b6107c8565b60405190151581526020016102d5565b61031461030f366004614afe565b610843565b005b610329610324366004614b15565b610918565b6040516102d59190614b93565b6102f1610344366004614ba5565b610a2f565b610314610357366004614bff565b610a60565b6103837f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102d5565b6103ab6103a6366004614ce4565b610d3b565b6040516102d59190614d87565b6103ab6103c6366004614dea565b610d51565b6103de6103d9366004614b15565b610df0565b6040516001600160a01b0390911681526020016102d5565b610314610404366004614e6e565b610e1f565b61041c610417366004614ec0565b611629565b6040516102d5929190614f4d565b61043d610438366004614ba5565b6117a4565b6040516102d59190614faa565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b61048461047f366004614fbc565b6117c8565b6040516102d59190614fff565b61031461049f36600461504a565b611870565b6103146104b23660046150ca565b61192a565b6104846104c5366004615128565b611a88565b6104d2611b30565b6040516102d5919061516a565b6103146104ed36600461519f565b611b60565b610314611c65565b6102f16105083660046151c9565b606654600160ff9092169190911b9081161490565b6066545b6040519081526020016102d5565b6102f161053d366004614aca565b611d14565b610555610550366004614ec0565b611d25565b6040516001600160401b0390911681526020016102d5565b61031461057b3660046151ff565b611d3a565b61043d61058e366004614ba5565b61211b565b61031461212c565b6103296105a9366004614b15565b61213d565b6103837f000000000000000000000000000000000000000000000000000000000000000081565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b61060f61060a366004615230565b612217565b6040516102d59190615273565b6033546001600160a01b03166103de565b61048461063b366004615285565b6122d3565b61031461064e3660046152e0565b6123bf565b610555610661366004614ec0565b61287e565b610314610674366004615489565b6128ad565b610314610687366004615507565b61295f565b61052161069a366004614ba5565b612cbc565b6103146106ad3660046150ca565b612cde565b6106c56106c0366004614b15565b612e38565b60408051921515835263ffffffff9091166020830152016102d5565b6105216106ef366004614b15565b612ed2565b61043d610702366004614aca565b612ef2565b610314610715366004615549565b612f1b565b610314610728366004614ec0565b613038565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b610314610762366004614b15565b61315c565b610555610775366004614ec0565b6131d5565b610314610788366004614afe565b6131e1565b604080516060810182525f80825260208201819052918101829052906107bc856107b6866132f7565b8561335a565b925050505b9392505050565b6001600160a01b0382165f908152609e602052604081208190816107eb856132f7565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff16928201929092529150806108395750806020015163ffffffff164311155b9150505b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156108a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c99190615573565b6108e657604051631d77d47760e21b815260040160405180910390fd5b606654818116811461090b5760405163c61dca5d60e01b815260040160405180910390fd5b610914826134c6565b5050565b6001600160a01b0381165f908152609d602052604081206060919061093c90613503565b90505f816001600160401b0381111561095757610957614974565b60405190808252806020026020018201604052801561099b57816020015b604080518082019091525f80825260208201528152602001906001900390816109755790505b5090505f5b82811015610a27576001600160a01b0385165f908152609d60205260409020610a02906109cd908361350c565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b828281518110610a1457610a14615592565b60209081029190910101526001016109a0565b509392505050565b60208082015182516001600160a01b03165f90815260989092526040822061083d9163ffffffff9081169061351716565b82610a6a8161352e565b610a875760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b0384165f90815260a4602052604090205460ff16610abf576040516348f7dbb960e01b815260040160405180910390fd5b5f5b82811015610d34575f6040518060400160405280876001600160a01b03168152602001868685818110610af657610af6615592565b9050602002810190610b0891906155a6565b610b169060208101906155c4565b63ffffffff168152509050610b60816020015163ffffffff1660985f896001600160a01b03166001600160a01b031681526020019081526020015f206135d890919063ffffffff16565b610b7d57604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280886001600160a01b03168152602001836020015163ffffffff16815250604051610bd391906155dd565b60405180910390a15f610be5826132f7565b90505f5b868685818110610bfb57610bfb615592565b9050602002810190610c0d91906155a6565b610c1b9060208101906155eb565b9050811015610d2957610c91878786818110610c3957610c39615592565b9050602002810190610c4b91906155a6565b610c599060208101906155eb565b83818110610c6957610c69615592565b9050602002016020810190610c7e9190614b15565b5f848152609960205260409020906135e3565b507f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83888887818110610cc657610cc6615592565b9050602002810190610cd891906155a6565b610ce69060208101906155eb565b84818110610cf657610cf6615592565b9050602002016020810190610d0b9190614b15565b604051610d19929190615630565b60405180910390a1600101610be9565b505050600101610ac1565b5050505050565b6060610d49848484436135f7565b949350505050565b6060610d5f858585856135f7565b90505f5b8451811015610de757610d8f858281518110610d8157610d81615592565b6020026020010151876107c8565b610ddf575f5b8451811015610ddd575f838381518110610db157610db1615592565b60200260200101518281518110610dca57610dca615592565b6020908102919091010152600101610d95565b505b600101610d63565b50949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610e1857806107c1565b5090919050565b606654600190600290811603610e485760405163840a48d560e01b815260040160405180910390fd5b82610e528161352e565b610e6f5760405163932d94f760e01b815260040160405180910390fd5b5f6040518060400160405280866001600160a01b03168152602001856020016020810190610e9d91906155c4565b63ffffffff1690529050610eb460608501856155eb565b9050610ec360408601866155eb565b905014610ee3576040516343714afd60e01b815260040160405180910390fd5b60208082015182516001600160a01b03165f90815260989092526040909120610f159163ffffffff9081169061351716565b610f3257604051631fb1705560e21b815260040160405180910390fd5b610f48610f426020860186614b15565b826107c8565b610f655760405163ebbff49760e01b815260040160405180910390fd5b5f610f7360408601866155eb565b90506001600160401b03811115610f8c57610f8c614974565b604051908082528060200260200182016040528015610fb5578160200160208202803683370190505b5090505f5b610fc760408701876155eb565b90508110156115bb5780158061105a5750610fe560408701876155eb565b610ff060018461566a565b818110610fff57610fff615592565b90506020020160208101906110149190614b15565b6001600160a01b031661102a60408801886155eb565b8381811061103a5761103a615592565b905060200201602081019061104f9190614b15565b6001600160a01b0316115b61107757604051639f1c805360e01b815260040160405180910390fd5b61108460608701876155eb565b8281811061109457611094615592565b905060200201355f1080156110d45750670de0b6b3a76400006110ba60608801886155eb565b838181106110ca576110ca615592565b9050602002013511155b6110f157604051631353603160e01b815260040160405180910390fd5b61114d61110160408801886155eb565b8381811061111157611111615592565b90506020020160208101906111269190614b15565b60995f611132876132f7565b81526020019081526020015f206138e490919063ffffffff16565b61116a576040516331bc342760e11b815260040160405180910390fd5b5f806111bc61117c60208a018a614b15565b611185876132f7565b61119260408c018c6155eb565b878181106111a2576111a2615592565b90506020020160208101906111b79190614b15565b61335a565b805191935091506001600160401b03165f036111d95750506115b3565b5f6112146111ea60608b018b6155eb565b868181106111fa576111fa615592565b85516001600160401b031692602090910201359050613905565b835190915061122f6001600160401b0380841690831661391b565b86868151811061124157611241615592565b60200260200101818152505081835f0181815161125e919061567d565b6001600160401b031690525083518290859061127b90839061567d565b6001600160401b031690525060208401805183919061129b90839061567d565b6001600160401b031690525060208301515f600f9190910b12156113b3575f6112fe6112ca60608d018d6155eb565b888181106112da576112da615592565b9050602002013585602001516112ef9061569c565b6001600160801b031690613905565b9050806001600160401b03168460200181815161131b91906156c0565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61134f60208d018d614b15565b8961135d60408f018f6155eb565b8a81811061136d5761136d615592565b90506020020160208101906113829190614b15565b611393885f0151896020015161392f565b88604001516040516113a99594939291906156ed565b60405180910390a1505b6114056113c360208c018c614b15565b6113cc896132f7565b6113d960408e018e6155eb565b898181106113e9576113e9615592565b90506020020160208101906113fe9190614b15565b878761394e565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61143360208c018c614b15565b8861144160408e018e6155eb565b8981811061145157611451615592565b90506020020160208101906114669190614b15565b865160405161147a949392919043906156ed565b60405180910390a16114cb61149260208c018c614b15565b61149f60408d018d6155eb565b888181106114af576114af615592565b90506020020160208101906114c49190614b15565b8651613b86565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663601bb36f61150760208d018d614b15565b61151460408e018e6155eb565b8981811061152457611524615592565b90506020020160208101906115399190614b15565b875160405160e085901b6001600160e01b03191681526001600160a01b0393841660048201529290911660248301526001600160401b0380861660448401521660648201526084015f604051808303815f87803b158015611598575f5ffd5b505af11580156115aa573d5f5f3e3d5ffd5b50505050505050505b600101610fba565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe56115ea6020870187614b15565b836115f860408901896155eb565b8561160660808c018c61573e565b60405161161997969594939291906157a8565b60405180910390a1505050505050565b6001600160a01b0382165f908152609d60205260408120606091829161164e90613503565b90505f816001600160401b0381111561166957611669614974565b6040519080825280602002602001820160405280156116ad57816020015b604080518082019091525f80825260208201528152602001906001900390816116875790505b5090505f826001600160401b038111156116c9576116c9614974565b60405190808252806020026020018201604052801561171257816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816116e75790505b5090505f5b83811015611795576001600160a01b0388165f908152609d60205260408120611744906109cd908461350c565b90508084838151811061175957611759615592565b602002602001018190525061176f89828a61078d565b83838151811061178157611781615592565b602090810291909101015250600101611717565b509093509150505b9250929050565b60605f6107c160995f6117b6866132f7565b81526020019081526020015f20613c08565b60605f83516001600160401b038111156117e4576117e4614974565b60405190808252806020026020018201604052801561180d578160200160208202803683370190505b5090505f5b8451811015610a275761183e85828151811061183057611830615592565b60200260200101518561287e565b82828151811061185057611850615592565b6001600160401b0390921660209283029190910190910152600101611812565b6066545f906001908116036118985760405163840a48d560e01b815260040160405180910390fd5b8382146118b8576040516343714afd60e01b815260040160405180910390fd5b5f5b8481101561192157611919878787848181106118d8576118d8615592565b90506020020160208101906118ed9190614b15565b8686858181106118ff576118ff615592565b9050602002016020810190611914919061583e565b613c14565b6001016118ba565b50505050505050565b836119348161352e565b6119515760405163932d94f760e01b815260040160405180910390fd5b604080518082019091526001600160a01b038616815263ffffffff851660208201525f61197d826132f7565b90506119be826020015163ffffffff1660985f8a6001600160a01b03166001600160a01b031681526020019081526020015f2061351790919063ffffffff16565b6119db57604051631fb1705560e21b815260040160405180910390fd5b5f5b84811015611a7e576119fa868683818110610c6957610c69615592565b611a175760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b83878784818110611a4b57611a4b615592565b9050602002016020810190611a609190614b15565b604051611a6e929190615630565b60405180910390a16001016119dd565b5050505050505050565b60605f82516001600160401b03811115611aa457611aa4614974565b604051908082528060200260200182016040528015611acd578160200160208202803683370190505b5090505f5b8351811015610a2757611afe85858381518110611af157611af1615592565b602002602001015161287e565b828281518110611b1057611b10615592565b6001600160401b0390921660209283029190910190910152600101611ad2565b6060611b5b7f0000000000000000000000000000000000000000000000000000000000000000613d18565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c5b57611b998261352e565b611bb6576040516348f5c3ed60e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611c1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c3e9190615573565b611c5b5760405163ccea9e6f60e01b815260040160405180910390fd5b6109148282613d55565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611cc7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ceb9190615573565b611d0857604051631d77d47760e21b815260040160405180910390fd5b611d125f196134c6565b565b5f6107c183609a5f611132866132f7565b5f5f611d318484613f01565b95945050505050565b606654600290600490811603611d635760405163840a48d560e01b815260040160405180910390fd5b611d78611d736020840184614b15565b61352e565b80611d915750611d91611d736040840160208501614b15565b611dae576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b611dbd60408401846155eb565b905081101561207f575f6040518060400160405280856020016020810190611de59190614b15565b6001600160a01b03168152602001611e0060408701876155eb565b85818110611e1057611e10615592565b9050602002016020810190611e2591906155c4565b63ffffffff168152509050611e72816020015163ffffffff1660985f876020016020810190611e549190614b15565b6001600160a01b0316815260208101919091526040015f2090613517565b611e8f57604051631fb1705560e21b815260040160405180910390fd5b609e5f611e9f6020870187614b15565b6001600160a01b03166001600160a01b031681526020019081526020015f205f611ec8836132f7565b815260208101919091526040015f205460ff16611ef8576040516325131d4f60e01b815260040160405180910390fd5b611f32611f04826132f7565b609c5f611f146020890189614b15565b6001600160a01b0316815260208101919091526040015f2090614070565b50611f6a611f436020860186614b15565b609a5f611f4f856132f7565b81526020019081526020015f2061407b90919063ffffffff16565b50611f786020850185614b15565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe82604051611fb091906155dd565b60405180910390a2604080518082019091525f815260208101611ff37f00000000000000000000000000000000000000000000000000000000000000004361585f565b63ffffffff169052609e5f61200b6020880188614b15565b6001600160a01b03166001600160a01b031681526020019081526020015f205f612034846132f7565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101611db0565b506120936103d96040840160208501614b15565b6001600160a01b031663303ca9566120ae6020850185614b15565b6120be6040860160208701614b15565b6120cb60408701876155eb565b6040518563ffffffff1660e01b81526004016120ea94939291906158b4565b5f604051808303815f87803b158015612101575f5ffd5b505af1158015612113573d5f5f3e3d5ffd5b505050505050565b606061083d609a5f6117b6856132f7565b61213461408f565b611d125f6140e9565b6001600160a01b0381165f908152609c602052604081206060919061216190613503565b90505f816001600160401b0381111561217c5761217c614974565b6040519080825280602002602001820160405280156121c057816020015b604080518082019091525f808252602082015281526020019060019003908161219a5790505b5090505f5b82811015610a27576001600160a01b0385165f908152609c602052604090206121f2906109cd908361350c565b82828151811061220457612204615592565b60209081029190910101526001016121c5565b60605f84516001600160401b0381111561223357612233614974565b60405190808252806020026020018201604052801561227c57816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816122515790505b5090505f5b8551811015610de7576122ae86828151811061229f5761229f615592565b6020026020010151868661078d565b8282815181106122c0576122c0615592565b6020908102919091010152600101612281565b60605f83516001600160401b038111156122ef576122ef614974565b604051908082528060200260200182016040528015612318578160200160208202803683370190505b5090505f5b8451811015610de7576001600160a01b0386165f90815260a160205260408120865161238d9287929189908690811061235857612358615592565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2061413a90919063ffffffff16565b82828151811061239f5761239f615592565b6001600160401b039092166020928302919091019091015260010161231d565b6066545f906001908116036123e75760405163840a48d560e01b815260040160405180910390fd5b6123f08361352e565b61240d576040516348f5c3ed60e01b815260040160405180910390fd5b5f5f5f61241986612e38565b915091508161243b5760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b8351811015610d345783818151811061245c5761245c615592565b6020026020010151604001515184828151811061247b5761247b615592565b60200260200101516020015151146124a6576040516343714afd60e01b815260040160405180910390fd5b5f8482815181106124b9576124b9615592565b602090810291909101810151518082015181516001600160a01b03165f908152609890935260409092209092506124f99163ffffffff9081169061351716565b61251657604051631fb1705560e21b815260040160405180910390fd5b5f61252187836107c8565b90505f5b86848151811061253757612537615592565b60200260200101516020015151811015612873575f87858151811061255e5761255e615592565b602002602001015160200151828151811061257b5761257b615592565b60200260200101519050612592898261ffff613c14565b5f5f6125a18b6107b6886132f7565b91509150806040015163ffffffff165f146125cf57604051630d8fcbe360e41b815260040160405180910390fd5b5f6125dc8785848961414e565b9050612621825f01518c8a815181106125f7576125f7615592565b602002602001015160400151878151811061261457612614615592565b6020026020010151614184565b600f0b602083018190525f0361264a57604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b121561278e578015612710576126cb61266b886132f7565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b6126f57f00000000000000000000000000000000000000000000000000000000000000004361585f565b61270090600161585f565b63ffffffff1660408301526127fb565b6127228360200151836020015161392f565b6001600160401b031660208401528a518b908990811061274457612744615592565b602002602001015160400151858151811061276157612761615592565b6020908102919091018101516001600160401b031683525f9083015263ffffffff431660408301526127fb565b5f8260200151600f0b13156127fb576127af8360200151836020015161392f565b6001600160401b0390811660208501819052845190911610156127e557604051636c9be0bf60e01b815260040160405180910390fd5b6127ef894361585f565b63ffffffff1660408301525b6128108c612808896132f7565b86868661394e565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c8886612845865f0151876020015161392f565b866040015160405161285b9594939291906156ed565b60405180910390a15050600190920191506125259050565b505050600101612441565b6001600160a01b038083165f90815260a16020908152604080832093851683529290529081206107c19061419b565b826128b78161352e565b6128d45760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b0384165f90815260a4602052604090205460ff16612916576001600160a01b0384165f90815260a460205260409020805460ff191660011790555b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371384846040516129519291906158e0565b60405180910390a250505050565b6066546002906004908116036129885760405163840a48d560e01b815260040160405180910390fd5b826129928161352e565b6129af5760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015612a13573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a379190615573565b612a545760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b612a6360208501856155eb565b9050811015612c2b57604080518082019091525f9080612a866020880188614b15565b6001600160a01b03168152602001868060200190612aa491906155eb565b85818110612ab457612ab4615592565b9050602002016020810190612ac991906155c4565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350612b0592919081169061351716565b612b2257604051631fb1705560e21b815260040160405180910390fd5b612b2c86826107c8565b15612b4a57604051636c6c6e2760e11b815260040160405180910390fd5b612b73612b56826132f7565b6001600160a01b0388165f908152609c60205260409020906135d8565b50612b9f86609a5f612b84856132f7565b81526020019081526020015f206135e390919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e82604051612bd991906155dd565b60405180910390a26001600160a01b0386165f908152609e60205260408120600191612c04846132f7565b815260208101919091526040015f20805460ff191691151591909117905550600101612a56565b50612c3c6103d96020850185614b15565b6001600160a01b031663c63fd50285612c586020870187614b15565b612c6560208801886155eb565b612c7260408a018a61573e565b6040518763ffffffff1660e01b8152600401612c93969594939291906158f3565b5f604051808303815f87803b158015612caa575f5ffd5b505af1158015611a7e573d5f5f3e3d5ffd5b5f61083d609a5f612ccc856132f7565b81526020019081526020015f20613503565b83612ce88161352e565b612d055760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192612d44929161351716565b612d6157604051631fb1705560e21b815260040160405180910390fd5b5f612d6b826132f7565b90505f5b84811015611a7e57612db4868683818110612d8c57612d8c615592565b9050602002016020810190612da19190614b15565b5f8481526099602052604090209061407b565b612dd1576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee83878784818110612e0557612e05615592565b9050602002016020810190612e1a9190614b15565b604051612e28929190615630565b60405180910390a1600101612d6f565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b909104166060820181905284939192919015801590612eb95750826060015163ffffffff164310155b15612ec8575050604081015160015b9590945092505050565b6001600160a01b0381165f90815260986020526040812061083d90613503565b6001600160a01b0382165f908152609f602052604081206060919061083990826117b6866132f7565b5f54610100900460ff1615808015612f3957505f54600160ff909116105b80612f525750303b158015612f5257505f5460ff166001145b612fba5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612fdb575f805461ff0019166101001790555b612fe4826134c6565b612fed836140e9565b8015613033575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b505050565b816130428161352e565b61305f5760405163932d94f760e01b815260040160405180910390fd5b60405163b526578760e01b81526001600160a01b03848116600483015283169063b526578790602401602060405180830381865afa1580156130a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130c79190615573565b6130e457604051631d0b13c160e31b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf858361313c81610df0565b604080516001600160a01b0393841681529290911660208301520161302a565b61316461408f565b6001600160a01b0381166131c95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401612fb1565b6131d2816140e9565b50565b5f5f610de78484613f01565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561323d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613261919061593f565b6001600160a01b0316336001600160a01b0316146132925760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146132b95760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f815f0151826020015163ffffffff1660405160200161334292919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261083d9061595a565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906133ba9061419b565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff1691810182905291925043101561345c5790925090506134be565b61346d815f0151826020015161392f565b6001600160401b0316815260208101515f600f9190910b12156134ab5761349c8260200151826020015161392f565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61083d825490565b5f6107c183836141ae565b5f81815260018301602052604081205415156107c1565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156135b4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061083d9190615573565b5f6107c183836141d4565b5f6107c1836001600160a01b0384166141d4565b606083516001600160401b0381111561361257613612614974565b60405190808252806020026020018201604052801561364557816020015b60608152602001906001900390816136305790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b815260040161369792919061597d565b5f60405180830381865afa1580156136b1573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526136d891908101906159a1565b90505f5b85518110156138da575f8682815181106136f8576136f8615592565b6020026020010151905085516001600160401b0381111561371b5761371b614974565b604051908082528060200260200182016040528015613744578160200160208202803683370190505b5084838151811061375757613757615592565b60209081029190910101525f5b86518110156138d0575f87828151811061378057613780615592565b6020908102919091018101516001600160a01b038086165f90815260a18452604080822092841682529190935282209092506137bb9061419b565b9050806001600160401b03165f036137d45750506138c8565b5f6137e0858d8561078d565b90508863ffffffff16816040015163ffffffff161115801561380857505f8160200151600f0b125b1561382a5761381e815f0151826020015161392f565b6001600160401b031681525b80515f90613845906001600160401b0390811690851661391b565b905061388c8189898151811061385d5761385d615592565b6020026020010151878151811061387657613876615592565b602002602001015161422090919063ffffffff16565b89888151811061389e5761389e615592565b602002602001015186815181106138b7576138b7615592565b602002602001018181525050505050505b600101613764565b50506001016136dc565b5050949350505050565b6001600160a01b0381165f90815260018301602052604081205415156107c1565b5f6107c18383670de0b6b3a76400006001614234565b5f6107c183670de0b6b3a76400008461428d565b5f6107c1613946836001600160401b0386166156c0565b600f0b614372565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b03908116911614613a1457602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b15613af6576001600160a01b0385165f908152609f602090815260408083208784529091529020613ace90846135e3565b506001600160a01b0385165f908152609d60205260409020613af090856135d8565b50610d34565b80516001600160401b03165f03610d34576001600160a01b0385165f908152609f602090815260408083208784529091529020613b33908461407b565b506001600160a01b0385165f908152609f602090815260408083208784529091529020613b5f90613503565b5f03610d34576001600160a01b0385165f908152609d602052604090206121139085614070565b6001600160a01b038084165f90815260a160209081526040808320938616835292905220613bb59043836143dd565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c9060600161302a565b60605f6107c1836143f1565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f81118015613c5e57508261ffff1682105b15610d34576001600160a01b038086165f90815260a3602090815260408083209388168352929052908120613c929061444a565b90505f5f613ca188848961335a565b91509150806040015163ffffffff16431015613cbf57505050610d34565b613ccc888489858561394e565b6001600160a01b038089165f90815260a360209081526040808320938b16835292905220613cf99061449c565b50613d0385615aad565b9450613d0e84615ac5565b9350505050613c4c565b60605f613d2483614519565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b0382165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b909204166060820181905215801590613dd15750806060015163ffffffff164310155b15613deb57604081015163ffffffff168152600160208201525b63ffffffff82166040820152613e217f00000000000000000000000000000000000000000000000000000000000000004361585f565b613e2c90600161585f565b63ffffffff90811660608381019182526001600160a01b0386165f818152609b602090815260409182902087518154838a0151858b01519851928a1664ffffffffff1990921691909117600160201b91151591909102176cffffffffffffffff0000000000191665010000000000978916979097026cffffffff000000000000000000191696909617600160481b968816968702179055815192835294871694820194909452928301919091527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db910161302a565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b039091169190600f81810b600160801b909204900b03815b8181101561402c576001600160a01b038087165f90815260a3602090815260408083209389168352929052908120613f949083614540565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff1691810182905291925043101561400f57505061402c565b61401d86826020015161392f565b95505050806001019050613f5c565b506001600160a01b038086165f90815260a160209081526040808320938816835292905220839061405c9061419b565b614066919061567d565b9150509250929050565b5f6107c183836145af565b5f6107c1836001600160a01b0384166145af565b6033546001600160a01b03163314611d125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612fb1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6107c18383670de0b6b3a7640000614692565b5f61415f8460995f611132896132f7565b80156141685750815b8015611d3157505090516001600160401b031615159392505050565b5f6107c16001600160401b03808516908416615ada565b5f61083d82670de0b6b3a76400006146e7565b5f825f0182815481106141c3576141c3615592565b905f5260205f200154905092915050565b5f81815260018301602052604081205461421957508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561083d565b505f61083d565b5f6107c18383670de0b6b3a764000061428d565b5f5f61424186868661428d565b9050600183600281111561425757614257615b07565b14801561427357505f848061426e5761426e615b1b565b868809115b15611d3157614283600182615b2f565b9695505050505050565b5f80805f19858709858702925082811083820303915050805f036142c4578382816142ba576142ba615b1b565b04925050506107c1565b80841161430b5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606401612fb1565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f6001600160401b038211156143d95760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b6064820152608401612fb1565b5090565b61303383836001600160401b03841661471e565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561443e57602002820191905f5260205f20905b81548152602001906001019080831161442a575b50505050509050919050565b5f6144648254600f81810b600160801b909204900b131590565b1561448257604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f6144b68254600f81810b600160801b909204900b131590565b156144d457604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f60ff8216601f81111561083d57604051632cd44ac360e21b815260040160405180910390fd5b5f5f61456261454e84614821565b855461455d9190600f0b615b42565b61488a565b8454909150600160801b9004600f90810b9082900b1261459557604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b5f8181526001830160205260408120548015614689575f6145d160018361566a565b85549091505f906145e49060019061566a565b9050818114614643575f865f01828154811061460257614602615592565b905f5260205f200154905080875f01848154811061462257614622615592565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061465457614654615b69565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061083d565b5f91505061083d565b82545f90816146a3868683856148f3565b905080156146dd576146c7866146ba60018461566a565b5f91825260209091200190565b54600160201b90046001600160e01b03166107bc565b5091949350505050565b81545f90801561471657614700846146ba60018461566a565b54600160201b90046001600160e01b0316610839565b509092915050565b825480156147d4575f614736856146ba60018561566a565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b0316602084015291925090851610156147885760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036147d257826147a9866146ba60018661566a565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b5f6001600160ff1b038211156143d95760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608401612fb1565b80600f81900b81146148ee5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401612fb1565b919050565b5f5b81831015610a27575f6149088484614946565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561493257809250614940565b61493d816001615b2f565b93505b506148f5565b5f6149546002848418615b7d565b6107c190848416615b2f565b6001600160a01b03811681146131d2575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156149aa576149aa614974565b60405290565b604051601f8201601f191681016001600160401b03811182821017156149d8576149d8614974565b604052919050565b803563ffffffff811681146148ee575f5ffd5b5f60408284031215614a03575f5ffd5b604080519081016001600160401b0381118282101715614a2557614a25614974565b6040529050808235614a3681614960565b8152614a44602084016149e0565b60208201525092915050565b5f5f5f60808486031215614a62575f5ffd5b8335614a6d81614960565b9250614a7c85602086016149f3565b91506060840135614a8c81614960565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff16908201526060810161083d565b5f5f60608385031215614adb575f5ffd5b8235614ae681614960565b9150614af584602085016149f3565b90509250929050565b5f60208284031215614b0e575f5ffd5b5035919050565b5f60208284031215614b25575f5ffd5b81356107c181614960565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b82811015614b8957614b73868351614b30565b6040959095019460209190910190600101614b60565b5093949350505050565b602081525f6107c16020830184614b4e565b5f60408284031215614bb5575f5ffd5b6107c183836149f3565b5f5f83601f840112614bcf575f5ffd5b5081356001600160401b03811115614be5575f5ffd5b6020830191508360208260051b850101111561179d575f5ffd5b5f5f5f60408486031215614c11575f5ffd5b8335614c1c81614960565b925060208401356001600160401b03811115614c36575f5ffd5b614c4286828701614bbf565b9497909650939450505050565b5f6001600160401b03821115614c6757614c67614974565b5060051b60200190565b5f82601f830112614c80575f5ffd5b8135614c93614c8e82614c4f565b6149b0565b8082825260208201915060208360051b860101925085831115614cb4575f5ffd5b602085015b83811015614cda578035614ccc81614960565b835260209283019201614cb9565b5095945050505050565b5f5f5f60808486031215614cf6575f5ffd5b614d0085856149f3565b925060408401356001600160401b03811115614d1a575f5ffd5b614d2686828701614c71565b92505060608401356001600160401b03811115614d41575f5ffd5b614d4d86828701614c71565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614b89578151865260209586019590910190600101614d69565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614dde57603f19878603018452614dc9858351614d57565b94506020938401939190910190600101614dad565b50929695505050505050565b5f5f5f5f60a08587031215614dfd575f5ffd5b614e0786866149f3565b935060408501356001600160401b03811115614e21575f5ffd5b614e2d87828801614c71565b93505060608501356001600160401b03811115614e48575f5ffd5b614e5487828801614c71565b925050614e63608086016149e0565b905092959194509250565b5f5f60408385031215614e7f575f5ffd5b8235614e8a81614960565b915060208301356001600160401b03811115614ea4575f5ffd5b830160a08186031215614eb5575f5ffd5b809150509250929050565b5f5f60408385031215614ed1575f5ffd5b8235614edc81614960565b91506020830135614eb581614960565b5f8151808452602084019350602083015f5b82811015614b8957614f3786835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101614efe565b604081525f614f5f6040830185614b4e565b8281036020840152611d318185614eec565b5f8151808452602084019350602083015f5b82811015614b895781516001600160a01b0316865260209586019590910190600101614f83565b602081525f6107c16020830184614f71565b5f5f60408385031215614fcd575f5ffd5b82356001600160401b03811115614fe2575f5ffd5b614fee85828601614c71565b9250506020830135614eb581614960565b602080825282518282018190525f918401906040840190835b8181101561503f5783516001600160401b0316835260209384019390920191600101615018565b509095945050505050565b5f5f5f5f5f6060868803121561505e575f5ffd5b853561506981614960565b945060208601356001600160401b03811115615083575f5ffd5b61508f88828901614bbf565b90955093505060408601356001600160401b038111156150ad575f5ffd5b6150b988828901614bbf565b969995985093965092949392505050565b5f5f5f5f606085870312156150dd575f5ffd5b84356150e881614960565b93506150f6602086016149e0565b925060408501356001600160401b03811115615110575f5ffd5b61511c87828801614bbf565b95989497509550505050565b5f5f60408385031215615139575f5ffd5b823561514481614960565b915060208301356001600160401b0381111561515e575f5ffd5b61406685828601614c71565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f604083850312156151b0575f5ffd5b82356151bb81614960565b9150614af5602084016149e0565b5f602082840312156151d9575f5ffd5b813560ff811681146107c1575f5ffd5b5f606082840312156151f9575f5ffd5b50919050565b5f6020828403121561520f575f5ffd5b81356001600160401b03811115615224575f5ffd5b610839848285016151e9565b5f5f5f60808486031215615242575f5ffd5b83356001600160401b03811115615257575f5ffd5b61526386828701614c71565b935050614a7c85602086016149f3565b602081525f6107c16020830184614eec565b5f5f5f60608486031215615297575f5ffd5b83356152a281614960565b925060208401356001600160401b038111156152bc575f5ffd5b6152c886828701614c71565b9250506152d7604085016149e0565b90509250925092565b5f5f604083850312156152f1575f5ffd5b82356152fc81614960565b915060208301356001600160401b03811115615316575f5ffd5b8301601f81018513615326575f5ffd5b8035615334614c8e82614c4f565b8082825260208201915060208360051b850101925087831115615355575f5ffd5b602084015b8381101561547a5780356001600160401b03811115615377575f5ffd5b85016080818b03601f1901121561538c575f5ffd5b615394614988565b6153a18b602084016149f3565b815260608201356001600160401b038111156153bb575f5ffd5b6153ca8c602083860101614c71565b60208301525060808201356001600160401b038111156153e8575f5ffd5b6020818401019250508a601f8301126153ff575f5ffd5b813561540d614c8e82614c4f565b8082825260208201915060208360051b86010192508d83111561542e575f5ffd5b6020850194505b828510156154645784356001600160401b0381168114615453575f5ffd5b825260209485019490910190615435565b604084015250508452506020928301920161535a565b50809450505050509250929050565b5f5f5f6040848603121561549b575f5ffd5b83356154a681614960565b925060208401356001600160401b038111156154c0575f5ffd5b8401601f810186136154d0575f5ffd5b80356001600160401b038111156154e5575f5ffd5b8660208284010111156154f6575f5ffd5b939660209190910195509293505050565b5f5f60408385031215615518575f5ffd5b823561552381614960565b915060208301356001600160401b0381111561553d575f5ffd5b614066858286016151e9565b5f5f6040838503121561555a575f5ffd5b823561556581614960565b946020939093013593505050565b5f60208284031215615583575f5ffd5b815180151581146107c1575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235603e198336030181126155ba575f5ffd5b9190910192915050565b5f602082840312156155d4575f5ffd5b6107c1826149e0565b6040810161083d8284614b30565b5f5f8335601e19843603018112615600575f5ffd5b8301803591506001600160401b03821115615619575f5ffd5b6020019150600581901b360382131561179d575f5ffd5b6060810161563e8285614b30565b6001600160a01b039290921660409190910152919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561083d5761083d615656565b6001600160401b03828116828216039081111561083d5761083d615656565b5f81600f0b60016001607f1b031981036156b8576156b8615656565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b03198212171561083d5761083d615656565b6001600160a01b038616815260c0810161570a6020830187614b30565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b5f5f8335601e19843603018112615753575f5ffd5b8301803591506001600160401b0382111561576c575f5ffd5b60200191503681900382131561179d575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b03881681525f60c082016157c6602084018a614b30565b60c060608401528690528660e083015f5b888110156158075782356157ea81614960565b6001600160a01b03168252602092830192909101906001016157d7565b50838103608085015261581a8188614d57565b91505082810360a0840152615830818587615780565b9a9950505050505050505050565b5f6020828403121561584e575f5ffd5b813561ffff811681146107c1575f5ffd5b63ffffffff818116838216019081111561083d5761083d615656565b8183526020830192505f815f5b84811015614b895763ffffffff61589e836149e0565b1686526020958601959190910190600101615888565b6001600160a01b038581168252841660208201526060604082018190525f90614283908301848661587b565b602081525f610d49602083018486615780565b6001600160a01b038781168252861660208201526080604082018190525f9061591f908301868861587b565b8281036060840152615932818587615780565b9998505050505050505050565b5f6020828403121561594f575f5ffd5b81516107c181614960565b805160208083015191908110156151f9575f1960209190910360031b1b16919050565b604081525f61598f6040830185614f71565b8281036020840152611d318185614f71565b5f602082840312156159b1575f5ffd5b81516001600160401b038111156159c6575f5ffd5b8201601f810184136159d6575f5ffd5b80516159e4614c8e82614c4f565b8082825260208201915060208360051b850101925086831115615a05575f5ffd5b602084015b83811015615aa25780516001600160401b03811115615a27575f5ffd5b8501603f81018913615a37575f5ffd5b6020810151615a48614c8e82614c4f565b808282526020820191506020808460051b8601010192508b831115615a6b575f5ffd5b6040840193505b82841015615a8d578351825260209384019390910190615a72565b86525050602093840193919091019050615a0a565b509695505050505050565b5f60018201615abe57615abe615656565b5060010190565b5f81615ad357615ad3615656565b505f190190565b600f82810b9082900b0360016001607f1b0319811260016001607f1b038213171561083d5761083d615656565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b8082018082111561083d5761083d615656565b8082018281125f831280158216821582161715615b6157615b61615656565b505092915050565b634e487b7160e01b5f52603160045260245ffd5b5f82615b9757634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220eb9c1f2290fb8dd6dd060f601e3b3d489683796b0ae15caffe25b8fdb623b55464736f6c634300081b0033",
}
// 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) (common.Address, *types.Transaction, *AllocationManager, error) {
+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) {
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)
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(AllocationManagerBin), backend, _delegation, _pauserRegistry, _permissionController, _DEALLOCATION_DELAY, _ALLOCATION_CONFIGURATION_DELAY, _version)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -344,37 +344,6 @@ func (_AllocationManager *AllocationManagerCallerSession) Delegation() (common.A
return _AllocationManager.Contract.Delegation(&_AllocationManager.CallOpts)
}
-// EncumberedMagnitude is a free data retrieval call binding the contract method 0xa984eb3a.
-//
-// Solidity: function encumberedMagnitude(address operator, address strategy) view returns(uint64)
-func (_AllocationManager *AllocationManagerCaller) EncumberedMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error) {
- var out []interface{}
- err := _AllocationManager.contract.Call(opts, &out, "encumberedMagnitude", operator, strategy)
-
- if err != nil {
- return *new(uint64), err
- }
-
- out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
-
- return out0, err
-
-}
-
-// EncumberedMagnitude is a free data retrieval call binding the contract method 0xa984eb3a.
-//
-// Solidity: function encumberedMagnitude(address operator, address strategy) view returns(uint64)
-func (_AllocationManager *AllocationManagerSession) EncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) {
- return _AllocationManager.Contract.EncumberedMagnitude(&_AllocationManager.CallOpts, operator, strategy)
-}
-
-// EncumberedMagnitude is a free data retrieval call binding the contract method 0xa984eb3a.
-//
-// Solidity: function encumberedMagnitude(address operator, address strategy) view returns(uint64)
-func (_AllocationManager *AllocationManagerCallerSession) EncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) {
- return _AllocationManager.Contract.EncumberedMagnitude(&_AllocationManager.CallOpts, operator, strategy)
-}
-
// GetAVSRegistrar is a free data retrieval call binding the contract method 0x304c10cd.
//
// Solidity: function getAVSRegistrar(address avs) view returns(address)
@@ -468,6 +437,37 @@ func (_AllocationManager *AllocationManagerCallerSession) GetAllocatedSets(opera
return _AllocationManager.Contract.GetAllocatedSets(&_AllocationManager.CallOpts, operator)
}
+// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a.
+//
+// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][])
+func (_AllocationManager *AllocationManagerCaller) GetAllocatedStake(opts *bind.CallOpts, operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) {
+ var out []interface{}
+ err := _AllocationManager.contract.Call(opts, &out, "getAllocatedStake", operatorSet, operators, strategies)
+
+ if err != nil {
+ return *new([][]*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([][]*big.Int)).(*[][]*big.Int)
+
+ return out0, err
+
+}
+
+// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a.
+//
+// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][])
+func (_AllocationManager *AllocationManagerSession) GetAllocatedStake(operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) {
+ return _AllocationManager.Contract.GetAllocatedStake(&_AllocationManager.CallOpts, operatorSet, operators, strategies)
+}
+
+// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a.
+//
+// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][])
+func (_AllocationManager *AllocationManagerCallerSession) GetAllocatedStake(operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) {
+ return _AllocationManager.Contract.GetAllocatedStake(&_AllocationManager.CallOpts, operatorSet, operators, strategies)
+}
+
// GetAllocatedStrategies is a free data retrieval call binding the contract method 0xc221d8ae.
//
// Solidity: function getAllocatedStrategies(address operator, (address,uint32) operatorSet) view returns(address[])
@@ -593,6 +593,37 @@ func (_AllocationManager *AllocationManagerCallerSession) GetAllocations(operato
return _AllocationManager.Contract.GetAllocations(&_AllocationManager.CallOpts, operators, operatorSet, strategy)
}
+// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08.
+//
+// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64)
+func (_AllocationManager *AllocationManagerCaller) GetEncumberedMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error) {
+ var out []interface{}
+ err := _AllocationManager.contract.Call(opts, &out, "getEncumberedMagnitude", operator, strategy)
+
+ if err != nil {
+ return *new(uint64), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+ return out0, err
+
+}
+
+// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08.
+//
+// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64)
+func (_AllocationManager *AllocationManagerSession) GetEncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) {
+ return _AllocationManager.Contract.GetEncumberedMagnitude(&_AllocationManager.CallOpts, operator, strategy)
+}
+
+// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08.
+//
+// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64)
+func (_AllocationManager *AllocationManagerCallerSession) GetEncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) {
+ return _AllocationManager.Contract.GetEncumberedMagnitude(&_AllocationManager.CallOpts, operator, strategy)
+}
+
// GetMaxMagnitude is a free data retrieval call binding the contract method 0xa9333ec8.
//
// Solidity: function getMaxMagnitude(address operator, address strategy) view returns(uint64)
@@ -997,6 +1028,37 @@ func (_AllocationManager *AllocationManagerCallerSession) IsOperatorSet(operator
return _AllocationManager.Contract.IsOperatorSet(&_AllocationManager.CallOpts, operatorSet)
}
+// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6.
+//
+// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool)
+func (_AllocationManager *AllocationManagerCaller) IsOperatorSlashable(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) (bool, error) {
+ var out []interface{}
+ err := _AllocationManager.contract.Call(opts, &out, "isOperatorSlashable", operator, operatorSet)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6.
+//
+// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool)
+func (_AllocationManager *AllocationManagerSession) IsOperatorSlashable(operator common.Address, operatorSet OperatorSet) (bool, error) {
+ return _AllocationManager.Contract.IsOperatorSlashable(&_AllocationManager.CallOpts, operator, operatorSet)
+}
+
+// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6.
+//
+// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool)
+func (_AllocationManager *AllocationManagerCallerSession) IsOperatorSlashable(operator common.Address, operatorSet OperatorSet) (bool, error) {
+ return _AllocationManager.Contract.IsOperatorSlashable(&_AllocationManager.CallOpts, operator, operatorSet)
+}
+
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
//
// Solidity: function owner() view returns(address)
@@ -1152,6 +1214,37 @@ func (_AllocationManager *AllocationManagerCallerSession) PermissionController()
return _AllocationManager.Contract.PermissionController(&_AllocationManager.CallOpts)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_AllocationManager *AllocationManagerCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _AllocationManager.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_AllocationManager *AllocationManagerSession) Version() (string, error) {
+ return _AllocationManager.Contract.Version(&_AllocationManager.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_AllocationManager *AllocationManagerCallerSession) Version() (string, error) {
+ return _AllocationManager.Contract.Version(&_AllocationManager.CallOpts)
+}
+
// AddStrategiesToOperatorSet is a paid mutator transaction binding the contract method 0x50feea20.
//
// Solidity: function addStrategiesToOperatorSet(address avs, uint32 operatorSetId, address[] strategies) returns()
diff --git a/pkg/bindings/AllocationManagerStorage/binding.go b/pkg/bindings/AllocationManagerStorage/binding.go
index fd74bd41af..730029b9d0 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\":\"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\":\"encumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"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\":\"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\":\"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\":\"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\":\"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\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"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\":\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":\"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\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"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\":\"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\":\"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\":\"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\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"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\":\"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\":[],\"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\":\"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\":\"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,37 +322,6 @@ func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) Delegati
return _AllocationManagerStorage.Contract.Delegation(&_AllocationManagerStorage.CallOpts)
}
-// EncumberedMagnitude is a free data retrieval call binding the contract method 0xa984eb3a.
-//
-// Solidity: function encumberedMagnitude(address operator, address strategy) view returns(uint64)
-func (_AllocationManagerStorage *AllocationManagerStorageCaller) EncumberedMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error) {
- var out []interface{}
- err := _AllocationManagerStorage.contract.Call(opts, &out, "encumberedMagnitude", operator, strategy)
-
- if err != nil {
- return *new(uint64), err
- }
-
- out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
-
- return out0, err
-
-}
-
-// EncumberedMagnitude is a free data retrieval call binding the contract method 0xa984eb3a.
-//
-// Solidity: function encumberedMagnitude(address operator, address strategy) view returns(uint64)
-func (_AllocationManagerStorage *AllocationManagerStorageSession) EncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) {
- return _AllocationManagerStorage.Contract.EncumberedMagnitude(&_AllocationManagerStorage.CallOpts, operator, strategy)
-}
-
-// EncumberedMagnitude is a free data retrieval call binding the contract method 0xa984eb3a.
-//
-// Solidity: function encumberedMagnitude(address operator, address strategy) view returns(uint64)
-func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) EncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) {
- return _AllocationManagerStorage.Contract.EncumberedMagnitude(&_AllocationManagerStorage.CallOpts, operator, strategy)
-}
-
// GetAVSRegistrar is a free data retrieval call binding the contract method 0x304c10cd.
//
// Solidity: function getAVSRegistrar(address avs) view returns(address)
@@ -446,6 +415,37 @@ func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) GetAlloc
return _AllocationManagerStorage.Contract.GetAllocatedSets(&_AllocationManagerStorage.CallOpts, operator)
}
+// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a.
+//
+// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][] slashableStake)
+func (_AllocationManagerStorage *AllocationManagerStorageCaller) GetAllocatedStake(opts *bind.CallOpts, operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) {
+ var out []interface{}
+ err := _AllocationManagerStorage.contract.Call(opts, &out, "getAllocatedStake", operatorSet, operators, strategies)
+
+ if err != nil {
+ return *new([][]*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([][]*big.Int)).(*[][]*big.Int)
+
+ return out0, err
+
+}
+
+// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a.
+//
+// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][] slashableStake)
+func (_AllocationManagerStorage *AllocationManagerStorageSession) GetAllocatedStake(operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) {
+ return _AllocationManagerStorage.Contract.GetAllocatedStake(&_AllocationManagerStorage.CallOpts, operatorSet, operators, strategies)
+}
+
+// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a.
+//
+// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][] slashableStake)
+func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) GetAllocatedStake(operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) {
+ return _AllocationManagerStorage.Contract.GetAllocatedStake(&_AllocationManagerStorage.CallOpts, operatorSet, operators, strategies)
+}
+
// GetAllocatedStrategies is a free data retrieval call binding the contract method 0xc221d8ae.
//
// Solidity: function getAllocatedStrategies(address operator, (address,uint32) operatorSet) view returns(address[])
@@ -584,6 +584,37 @@ func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) GetAlloc
return _AllocationManagerStorage.Contract.GetAllocations(&_AllocationManagerStorage.CallOpts, operators, operatorSet, strategy)
}
+// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08.
+//
+// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64)
+func (_AllocationManagerStorage *AllocationManagerStorageCaller) GetEncumberedMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error) {
+ var out []interface{}
+ err := _AllocationManagerStorage.contract.Call(opts, &out, "getEncumberedMagnitude", operator, strategy)
+
+ if err != nil {
+ return *new(uint64), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+ return out0, err
+
+}
+
+// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08.
+//
+// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64)
+func (_AllocationManagerStorage *AllocationManagerStorageSession) GetEncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) {
+ return _AllocationManagerStorage.Contract.GetEncumberedMagnitude(&_AllocationManagerStorage.CallOpts, operator, strategy)
+}
+
+// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08.
+//
+// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64)
+func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) GetEncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) {
+ return _AllocationManagerStorage.Contract.GetEncumberedMagnitude(&_AllocationManagerStorage.CallOpts, operator, strategy)
+}
+
// GetMaxMagnitude is a free data retrieval call binding the contract method 0xa9333ec8.
//
// Solidity: function getMaxMagnitude(address operator, address strategy) view returns(uint64)
@@ -988,6 +1019,68 @@ func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) IsOperat
return _AllocationManagerStorage.Contract.IsOperatorSet(&_AllocationManagerStorage.CallOpts, operatorSet)
}
+// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6.
+//
+// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool)
+func (_AllocationManagerStorage *AllocationManagerStorageCaller) IsOperatorSlashable(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) (bool, error) {
+ var out []interface{}
+ err := _AllocationManagerStorage.contract.Call(opts, &out, "isOperatorSlashable", operator, operatorSet)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6.
+//
+// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool)
+func (_AllocationManagerStorage *AllocationManagerStorageSession) IsOperatorSlashable(operator common.Address, operatorSet OperatorSet) (bool, error) {
+ return _AllocationManagerStorage.Contract.IsOperatorSlashable(&_AllocationManagerStorage.CallOpts, operator, operatorSet)
+}
+
+// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6.
+//
+// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool)
+func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) IsOperatorSlashable(operator common.Address, operatorSet OperatorSet) (bool, error) {
+ return _AllocationManagerStorage.Contract.IsOperatorSlashable(&_AllocationManagerStorage.CallOpts, operator, operatorSet)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_AllocationManagerStorage *AllocationManagerStorageCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _AllocationManagerStorage.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_AllocationManagerStorage *AllocationManagerStorageSession) Version() (string, error) {
+ return _AllocationManagerStorage.Contract.Version(&_AllocationManagerStorage.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) Version() (string, error) {
+ return _AllocationManagerStorage.Contract.Version(&_AllocationManagerStorage.CallOpts)
+}
+
// AddStrategiesToOperatorSet is a paid mutator transaction binding the contract method 0x50feea20.
//
// Solidity: function addStrategiesToOperatorSet(address avs, uint32 operatorSetId, address[] strategies) returns()
diff --git a/pkg/bindings/BackingEigen/binding.go b/pkg/bindings/BackingEigen/binding.go
index 773e13f221..7504e8e66d 100644
--- a/pkg/bindings/BackingEigen/binding.go
+++ b/pkg/bindings/BackingEigen/binding.go
@@ -38,7 +38,7 @@ type ERC20VotesUpgradeableCheckpoint struct {
// BackingEigenMetaData contains all meta data concerning the BackingEigen contract.
var BackingEigenMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedFrom\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMinter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setIsMinter\",\"inputs\":[{\"name\":\"minterAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newStatus\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferRestrictionsDisabledAfter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Backed\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"IsMinterModified\",\"inputs\":[{\"name\":\"minterAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newStatus\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"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\":\"SetAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferRestrictionsDisabled\",\"inputs\":[],\"anonymous\":false}]",
- Bin: "0x60a060405234801561000f575f5ffd5b50604051612d11380380612d1183398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b608051612bb261015f5f395f81816105e901528181610dae01528181610dd90152610e040152612bb25ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80637ecebe0011610135578063aa271e1a116100b4578063dd62ed3e11610079578063dd62ed3e14610579578063eb415f451461058c578063f1127ed814610594578063f2fde38b146105d1578063fdc371ce146105e4575f5ffd5b8063aa271e1a1461050a578063b8c255941461052d578063c3cda52014610540578063c4d66de814610553578063d505accf14610566575f5ffd5b806395d89b41116100fa57806395d89b41146104bf5780639ab24eb0146104c75780639aec4bae146104da578063a457c2d7146104e4578063a9059cbb146104f7575f5ffd5b80637ecebe001461044e57806384b0196e146104615780638da5cb5b1461047c5780638e539e8c1461048d57806391ddadf4146104a0575f5ffd5b806340c10f19116101c157806366eb399f1161018657806366eb399f146103c05780636fcfff45146103d357806370a08231146103fb578063715018a61461042357806378aa33ba1461042b575f5ffd5b806340c10f191461031a57806342966c681461032d5780634bf5d7e914610340578063587cde1e1461036a5780635c19a95c146103ad575f5ffd5b806323b872dd1161020757806323b872dd146102ca578063313ce567146102dd5780633644e515146102ec57806339509351146102f45780633a46b1a814610307575f5ffd5b80630455e6941461024357806306fdde031461027b578063095ea7b31461029057806318160ddd146102a35780631ffacdef146102b5575b5f5ffd5b610266610251366004612682565b6101316020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61028361060b565b60405161027291906126c9565b61026661029e3660046126db565b61069b565b6067545b604051908152602001610272565b6102c86102c3366004612703565b6106b4565b005b6102666102d836600461273c565b6106ca565b60405160128152602001610272565b6102a76106ed565b6102666103023660046126db565b6106fb565b6102a76103153660046126db565b61071c565b6102c86103283660046126db565b6107a4565b6102c861033b366004612776565b61081f565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610283565b610395610378366004612682565b6001600160a01b039081165f90815260fe60205260409020541690565b6040516001600160a01b039091168152602001610272565b6102c86103bb366004612682565b61082c565b6102c86103ce366004612703565b610836565b6103e66103e1366004612682565b6108ae565b60405163ffffffff9091168152602001610272565b6102a7610409366004612682565b6001600160a01b03165f9081526065602052604090205490565b6102c86108cf565b610266610439366004612682565b6101326020525f908152604090205460ff1681565b6102a761045c366004612682565b6108e2565b6104696108ff565b604051610272979695949392919061278d565b6033546001600160a01b0316610395565b6102a761049b366004612776565b610998565b6104a86109ff565b60405165ffffffffffff9091168152602001610272565b610283610a09565b6102a76104d5366004612682565b610a18565b6102a76101305481565b6102666104f23660046126db565b610a95565b6102666105053660046126db565b610b0f565b610266610518366004612682565b6101336020525f908152604090205460ff1681565b6102c861053b366004612703565b610b1c565b6102c861054e366004612833565b610b2e565b6102c8610561366004612682565b610c63565b6102c8610574366004612887565b610ea5565b6102a76105873660046128ed565b611006565b6102c8611030565b6105a76105a236600461291e565b6110fe565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610272565b6102c86105df366004612682565b61117f565b6103957f000000000000000000000000000000000000000000000000000000000000000081565b60606068805461061a90612950565b80601f016020809104026020016040519081016040528092919081815260200182805461064690612950565b80156106915780601f1061066857610100808354040283529160200191610691565b820191905f5260205f20905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b5f336106a88185856111f5565b60019150505b92915050565b6106bc611318565b6106c68282611372565b5050565b5f336106d78582856113d2565b6106e285858561144a565b506001949350505050565b5f6106f6611604565b905090565b5f336106a881858561070d8383611006565b6107179190612996565b6111f5565b5f6107256109ff565b65ffffffffffff16821061077c5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b0383165f90815260ff6020526040902061079d908361160d565b9392505050565b335f908152610133602052604090205460ff166108155760405162461bcd60e51b815260206004820152602960248201527f4261636b696e67456967656e2e6d696e743a2063616c6c6572206973206e6f7460448201526810309036b4b73a32b960b91b6064820152608401610773565b6106c682826116ee565b6108293382611779565b50565b6108293382611792565b61083e611318565b816001600160a01b03167f0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde8260405161087b911515815260200190565b60405180910390a26001600160a01b03919091165f90815261013360205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260ff60205260408120546106ae9061180b565b6108d7611318565b6108e05f611873565b565b6001600160a01b0381165f90815260cb60205260408120546106ae565b5f6060805f5f5f60606097545f5f1b14801561091b5750609854155b61095f5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610773565b6109676118c4565b61096f6118d3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f6109a16109ff565b65ffffffffffff1682106109f35760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610773565b6106ae6101008361160d565b5f6106f6426118e2565b60606069805461061a90612950565b6001600160a01b0381165f90815260ff60205260408120548015610a83576001600160a01b0383165f90815260ff6020526040902080545f198301908110610a6257610a626129bd565b5f9182526020909120015464010000000090046001600160e01b0316610a85565b5f5b6001600160e01b03169392505050565b5f3381610aa28286611006565b905083811015610b025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610773565b6106e282868684036111f5565b5f336106a881858561144a565b610b24611318565b6106c68282611948565b83421115610b7e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610773565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90610bf790610bef9060a001604051602081830303815290604052805190602001206119a0565b8585856119cc565b9050610c02816119f2565b8614610c505760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610773565b610c5a8188611792565b50505050505050565b5f54610100900460ff1615808015610c8157505f54600160ff909116105b80610c9a5750303b158015610c9a57505f5460ff166001145b610cfd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610773565b5f805460ff191660011790558015610d1e575f805461ff0019166101001790555b610d26611a19565b610d736040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b815250611a47565b610d7c82611873565b610da3604051806040016040528060068152602001653122a4a3a2a760d11b815250611a77565b5f1961013055610dd47f00000000000000000000000000000000000000000000000000000000000000006001611372565b610dff7f00000000000000000000000000000000000000000000000000000000000000006001611948565b610e357f00000000000000000000000000000000000000000000000000000000000000006b05686877afb5cbccbf7340006116ee565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d26905f90a180156106c6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610ef55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610773565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610f238c6119f2565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610f7d826119a0565b90505f610f8c828787876119cc565b9050896001600160a01b0316816001600160a01b031614610fef5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610773565b610ffa8a8a8a6111f5565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611038611318565b5f1961013054146110ce5760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a401610773565b5f6101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611140576111406129bd565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b611187611318565b6001600160a01b0381166111ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610773565b61082981611873565b6001600160a01b0383166112575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610773565b6001600160a01b0382166112b85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610773565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146108e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610773565b6001600160a01b0382165f8181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f6113dd8484611006565b90505f19811461144457818110156114375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610773565b61144484848484036111f5565b50505050565b6001600160a01b0383166114ae5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610773565b6001600160a01b0382166115105760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610773565b61151b838383611ac0565b6001600160a01b0383165f90815260656020526040902054818110156115925760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610773565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115f19086815260200190565b60405180910390a3611444848484611b9c565b5f6106f6611bcd565b81545f9081816005811115611664575f61162684611c40565b61163090856129d1565b5f88815260209020909150869082015463ffffffff16111561165457809150611662565b61165f816001612996565b92505b505b808210156116af575f6116778383611d24565b5f88815260209020909150869082015463ffffffff16111561169b578091506116a9565b6116a6816001612996565b92505b50611664565b80156116d9575f8681526020902081015f19015464010000000090046001600160e01b03166116db565b5f5b6001600160e01b03169695505050505050565b6116f88282611d3e565b6067546001600160e01b03101561176a5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610773565b611444610100611e0f83611e1a565b6117838282611f86565b6114446101006120c983611e1a565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46114448284836120d4565b5f63ffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610773565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461061a90612950565b6060609a805461061a90612950565b5f65ffffffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610773565b6001600160a01b0382165f8181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016113c6565b5f6106ae6119ac611604565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f6119db8787878761220e565b915091506119e8816122cb565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b5f54610100900460ff16611a3f5760405162461bcd60e51b8152600401610773906129e4565b6108e0612414565b5f54610100900460ff16611a6d5760405162461bcd60e51b8152600401610773906129e4565b6106c68282612443565b5f54610100900460ff16611a9d5760405162461bcd60e51b8152600401610773906129e4565b61082981604051806040016040528060018152602001603160f81b815250612482565b610130544211611b97576001600160a01b0383165f908152610131602052604090205460ff1680611b0957506001600160a01b0382165f908152610132602052604090205460ff165b80611b1b57506001600160a01b038316155b611b975760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a401610773565b505050565b6001600160a01b038381165f90815260fe6020526040808220548584168352912054611b97929182169116836120d4565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611bf76124cf565b611bff612527565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f03611c4f57505f919050565b5f6001611c5b84612557565b901c6001901b90506001818481611c7457611c74612a2f565b048201901c90506001818481611c8c57611c8c612a2f565b048201901c90506001818481611ca457611ca4612a2f565b048201901c90506001818481611cbc57611cbc612a2f565b048201901c90506001818481611cd457611cd4612a2f565b048201901c90506001818481611cec57611cec612a2f565b048201901c90506001818481611d0457611d04612a2f565b048201901c905061079d81828581611d1e57611d1e612a2f565b046125ea565b5f611d326002848418612a43565b61079d90848416612996565b6001600160a01b038216611d945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610773565b611d9f5f8383611ac0565b8060675f828254611db09190612996565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36106c65f8383611b9c565b5f61079d8284612996565b82545f908190818115611e64575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611e78565b604080518082019091525f80825260208201525b905080602001516001600160e01b03169350611e9884868863ffffffff16565b92505f82118015611ec05750611eac6109ff565b65ffffffffffff16815f015163ffffffff16145b15611f0357611ece836125ff565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611f7c565b866040518060400160405280611f27611f1a6109ff565b65ffffffffffff1661180b565b63ffffffff168152602001611f3b866125ff565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6001600160a01b038216611fe65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610773565b611ff1825f83611ac0565b6001600160a01b0382165f90815260656020526040902054818110156120645760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610773565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611b97835f84611b9c565b5f61079d82846129d1565b816001600160a01b0316836001600160a01b0316141580156120f557505f81115b15611b97576001600160a01b03831615612182576001600160a01b0383165f90815260ff60205260408120819061212f906120c985611e1a565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612177929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611b97576001600160a01b0382165f90815260ff6020526040812081906121b790611e0f85611e1a565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121ff929190918252602082015260400190565b60405180910390a25050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561224357505f905060036122c2565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612294573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122bc575f600192509250506122c2565b91505f90505b94509492505050565b5f8160048111156122de576122de612a62565b036122e65750565b60018160048111156122fa576122fa612a62565b036123475760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610773565b600281600481111561235b5761235b612a62565b036123a85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610773565b60038160048111156123bc576123bc612a62565b036108295760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610773565b5f54610100900460ff1661243a5760405162461bcd60e51b8152600401610773906129e4565b6108e033611873565b5f54610100900460ff166124695760405162461bcd60e51b8152600401610773906129e4565b60686124758382612ac1565b506069611b978282612ac1565b5f54610100900460ff166124a85760405162461bcd60e51b8152600401610773906129e4565b60996124b48382612ac1565b50609a6124c18282612ac1565b50505f609781905560985550565b5f5f6124d96118c4565b8051909150156124f0578051602090910120919050565b60975480156124ff5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f6125316118d3565b805190915015612548578051602090910120919050565b60985480156124ff5792915050565b5f80608083901c1561256b57608092831c92015b604083901c1561257d57604092831c92015b602083901c1561258f57602092831c92015b601083901c156125a157601092831c92015b600883901c156125b357600892831c92015b600483901c156125c557600492831c92015b600283901c156125d757600292831c92015b600183901c156106ae5760010192915050565b5f8183106125f8578161079d565b5090919050565b5f6001600160e01b0382111561186f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610773565b80356001600160a01b038116811461267d575f5ffd5b919050565b5f60208284031215612692575f5ffd5b61079d82612667565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61079d602083018461269b565b5f5f604083850312156126ec575f5ffd5b6126f583612667565b946020939093013593505050565b5f5f60408385031215612714575f5ffd5b61271d83612667565b915060208301358015158114612731575f5ffd5b809150509250929050565b5f5f5f6060848603121561274e575f5ffd5b61275784612667565b925061276560208501612667565b929592945050506040919091013590565b5f60208284031215612786575f5ffd5b5035919050565b60ff60f81b8816815260e060208201525f6127ab60e083018961269b565b82810360408401526127bd818961269b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156128125783518352602093840193909201916001016127f4565b50909b9a5050505050505050505050565b803560ff8116811461267d575f5ffd5b5f5f5f5f5f5f60c08789031215612848575f5ffd5b61285187612667565b9550602087013594506040870135935061286d60608801612823565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561289d575f5ffd5b6128a688612667565b96506128b460208901612667565b955060408801359450606088013593506128d060808901612823565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156128fe575f5ffd5b61290783612667565b915061291560208401612667565b90509250929050565b5f5f6040838503121561292f575f5ffd5b61293883612667565b9150602083013563ffffffff81168114612731575f5ffd5b600181811c9082168061296457607f821691505b602082108103611a1357634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ae576106ae612982565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b818103818111156106ae576106ae612982565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82612a5d57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b601f821115611b9757805f5260205f20601f840160051c81016020851015612a9b5750805b601f840160051c820191505b81811015612aba575f8155600101612aa7565b5050505050565b815167ffffffffffffffff811115612adb57612adb6129a9565b612aef81612ae98454612950565b84612a76565b6020601f821160018114612b21575f8315612b0a5750848201515b5f19600385901b1c1916600184901b178455612aba565b5f84815260208120601f198516915b82811015612b505787850151825560209485019460019092019101612b30565b5084821015612b6d57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220e867b134dc261d7025b320d04b24d156f209a884537e24f3f733872669a3444264736f6c634300081b0033",
+ Bin: "0x60a060405234801561000f575f5ffd5b50604051612d11380380612d1183398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b608051612bb261015f5f395f81816105e901528181610dae01528181610dd90152610e040152612bb25ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80637ecebe0011610135578063aa271e1a116100b4578063dd62ed3e11610079578063dd62ed3e14610579578063eb415f451461058c578063f1127ed814610594578063f2fde38b146105d1578063fdc371ce146105e4575f5ffd5b8063aa271e1a1461050a578063b8c255941461052d578063c3cda52014610540578063c4d66de814610553578063d505accf14610566575f5ffd5b806395d89b41116100fa57806395d89b41146104bf5780639ab24eb0146104c75780639aec4bae146104da578063a457c2d7146104e4578063a9059cbb146104f7575f5ffd5b80637ecebe001461044e57806384b0196e146104615780638da5cb5b1461047c5780638e539e8c1461048d57806391ddadf4146104a0575f5ffd5b806340c10f19116101c157806366eb399f1161018657806366eb399f146103c05780636fcfff45146103d357806370a08231146103fb578063715018a61461042357806378aa33ba1461042b575f5ffd5b806340c10f191461031a57806342966c681461032d5780634bf5d7e914610340578063587cde1e1461036a5780635c19a95c146103ad575f5ffd5b806323b872dd1161020757806323b872dd146102ca578063313ce567146102dd5780633644e515146102ec57806339509351146102f45780633a46b1a814610307575f5ffd5b80630455e6941461024357806306fdde031461027b578063095ea7b31461029057806318160ddd146102a35780631ffacdef146102b5575b5f5ffd5b610266610251366004612682565b6101316020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61028361060b565b60405161027291906126c9565b61026661029e3660046126db565b61069b565b6067545b604051908152602001610272565b6102c86102c3366004612703565b6106b4565b005b6102666102d836600461273c565b6106ca565b60405160128152602001610272565b6102a76106ed565b6102666103023660046126db565b6106fb565b6102a76103153660046126db565b61071c565b6102c86103283660046126db565b6107a4565b6102c861033b366004612776565b61081f565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610283565b610395610378366004612682565b6001600160a01b039081165f90815260fe60205260409020541690565b6040516001600160a01b039091168152602001610272565b6102c86103bb366004612682565b61082c565b6102c86103ce366004612703565b610836565b6103e66103e1366004612682565b6108ae565b60405163ffffffff9091168152602001610272565b6102a7610409366004612682565b6001600160a01b03165f9081526065602052604090205490565b6102c86108cf565b610266610439366004612682565b6101326020525f908152604090205460ff1681565b6102a761045c366004612682565b6108e2565b6104696108ff565b604051610272979695949392919061278d565b6033546001600160a01b0316610395565b6102a761049b366004612776565b610998565b6104a86109ff565b60405165ffffffffffff9091168152602001610272565b610283610a09565b6102a76104d5366004612682565b610a18565b6102a76101305481565b6102666104f23660046126db565b610a95565b6102666105053660046126db565b610b0f565b610266610518366004612682565b6101336020525f908152604090205460ff1681565b6102c861053b366004612703565b610b1c565b6102c861054e366004612833565b610b2e565b6102c8610561366004612682565b610c63565b6102c8610574366004612887565b610ea5565b6102a76105873660046128ed565b611006565b6102c8611030565b6105a76105a236600461291e565b6110fe565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610272565b6102c86105df366004612682565b61117f565b6103957f000000000000000000000000000000000000000000000000000000000000000081565b60606068805461061a90612950565b80601f016020809104026020016040519081016040528092919081815260200182805461064690612950565b80156106915780601f1061066857610100808354040283529160200191610691565b820191905f5260205f20905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b5f336106a88185856111f5565b60019150505b92915050565b6106bc611318565b6106c68282611372565b5050565b5f336106d78582856113d2565b6106e285858561144a565b506001949350505050565b5f6106f6611604565b905090565b5f336106a881858561070d8383611006565b6107179190612996565b6111f5565b5f6107256109ff565b65ffffffffffff16821061077c5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b0383165f90815260ff6020526040902061079d908361160d565b9392505050565b335f908152610133602052604090205460ff166108155760405162461bcd60e51b815260206004820152602960248201527f4261636b696e67456967656e2e6d696e743a2063616c6c6572206973206e6f7460448201526810309036b4b73a32b960b91b6064820152608401610773565b6106c682826116ee565b6108293382611779565b50565b6108293382611792565b61083e611318565b816001600160a01b03167f0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde8260405161087b911515815260200190565b60405180910390a26001600160a01b03919091165f90815261013360205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260ff60205260408120546106ae9061180b565b6108d7611318565b6108e05f611873565b565b6001600160a01b0381165f90815260cb60205260408120546106ae565b5f6060805f5f5f60606097545f5f1b14801561091b5750609854155b61095f5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610773565b6109676118c4565b61096f6118d3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f6109a16109ff565b65ffffffffffff1682106109f35760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610773565b6106ae6101008361160d565b5f6106f6426118e2565b60606069805461061a90612950565b6001600160a01b0381165f90815260ff60205260408120548015610a83576001600160a01b0383165f90815260ff6020526040902080545f198301908110610a6257610a626129bd565b5f9182526020909120015464010000000090046001600160e01b0316610a85565b5f5b6001600160e01b03169392505050565b5f3381610aa28286611006565b905083811015610b025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610773565b6106e282868684036111f5565b5f336106a881858561144a565b610b24611318565b6106c68282611948565b83421115610b7e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610773565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90610bf790610bef9060a001604051602081830303815290604052805190602001206119a0565b8585856119cc565b9050610c02816119f2565b8614610c505760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610773565b610c5a8188611792565b50505050505050565b5f54610100900460ff1615808015610c8157505f54600160ff909116105b80610c9a5750303b158015610c9a57505f5460ff166001145b610cfd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610773565b5f805460ff191660011790558015610d1e575f805461ff0019166101001790555b610d26611a19565b610d736040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b815250611a47565b610d7c82611873565b610da3604051806040016040528060068152602001653122a4a3a2a760d11b815250611a77565b5f1961013055610dd47f00000000000000000000000000000000000000000000000000000000000000006001611372565b610dff7f00000000000000000000000000000000000000000000000000000000000000006001611948565b610e357f00000000000000000000000000000000000000000000000000000000000000006b05686877afb5cbccbf7340006116ee565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d26905f90a180156106c6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610ef55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610773565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610f238c6119f2565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610f7d826119a0565b90505f610f8c828787876119cc565b9050896001600160a01b0316816001600160a01b031614610fef5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610773565b610ffa8a8a8a6111f5565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611038611318565b5f1961013054146110ce5760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a401610773565b5f6101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611140576111406129bd565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b611187611318565b6001600160a01b0381166111ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610773565b61082981611873565b6001600160a01b0383166112575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610773565b6001600160a01b0382166112b85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610773565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146108e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610773565b6001600160a01b0382165f8181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f6113dd8484611006565b90505f19811461144457818110156114375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610773565b61144484848484036111f5565b50505050565b6001600160a01b0383166114ae5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610773565b6001600160a01b0382166115105760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610773565b61151b838383611ac0565b6001600160a01b0383165f90815260656020526040902054818110156115925760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610773565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115f19086815260200190565b60405180910390a3611444848484611b9c565b5f6106f6611bcd565b81545f9081816005811115611664575f61162684611c40565b61163090856129d1565b5f88815260209020909150869082015463ffffffff16111561165457809150611662565b61165f816001612996565b92505b505b808210156116af575f6116778383611d24565b5f88815260209020909150869082015463ffffffff16111561169b578091506116a9565b6116a6816001612996565b92505b50611664565b80156116d9575f8681526020902081015f19015464010000000090046001600160e01b03166116db565b5f5b6001600160e01b03169695505050505050565b6116f88282611d3e565b6067546001600160e01b03101561176a5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610773565b611444610100611e0f83611e1a565b6117838282611f86565b6114446101006120c983611e1a565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46114448284836120d4565b5f63ffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610773565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461061a90612950565b6060609a805461061a90612950565b5f65ffffffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610773565b6001600160a01b0382165f8181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016113c6565b5f6106ae6119ac611604565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f6119db8787878761220e565b915091506119e8816122cb565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b5f54610100900460ff16611a3f5760405162461bcd60e51b8152600401610773906129e4565b6108e0612414565b5f54610100900460ff16611a6d5760405162461bcd60e51b8152600401610773906129e4565b6106c68282612443565b5f54610100900460ff16611a9d5760405162461bcd60e51b8152600401610773906129e4565b61082981604051806040016040528060018152602001603160f81b815250612482565b610130544211611b97576001600160a01b0383165f908152610131602052604090205460ff1680611b0957506001600160a01b0382165f908152610132602052604090205460ff165b80611b1b57506001600160a01b038316155b611b975760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a401610773565b505050565b6001600160a01b038381165f90815260fe6020526040808220548584168352912054611b97929182169116836120d4565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611bf76124cf565b611bff612527565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f03611c4f57505f919050565b5f6001611c5b84612557565b901c6001901b90506001818481611c7457611c74612a2f565b048201901c90506001818481611c8c57611c8c612a2f565b048201901c90506001818481611ca457611ca4612a2f565b048201901c90506001818481611cbc57611cbc612a2f565b048201901c90506001818481611cd457611cd4612a2f565b048201901c90506001818481611cec57611cec612a2f565b048201901c90506001818481611d0457611d04612a2f565b048201901c905061079d81828581611d1e57611d1e612a2f565b046125ea565b5f611d326002848418612a43565b61079d90848416612996565b6001600160a01b038216611d945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610773565b611d9f5f8383611ac0565b8060675f828254611db09190612996565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36106c65f8383611b9c565b5f61079d8284612996565b82545f908190818115611e64575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611e78565b604080518082019091525f80825260208201525b905080602001516001600160e01b03169350611e9884868863ffffffff16565b92505f82118015611ec05750611eac6109ff565b65ffffffffffff16815f015163ffffffff16145b15611f0357611ece836125ff565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611f7c565b866040518060400160405280611f27611f1a6109ff565b65ffffffffffff1661180b565b63ffffffff168152602001611f3b866125ff565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6001600160a01b038216611fe65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610773565b611ff1825f83611ac0565b6001600160a01b0382165f90815260656020526040902054818110156120645760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610773565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611b97835f84611b9c565b5f61079d82846129d1565b816001600160a01b0316836001600160a01b0316141580156120f557505f81115b15611b97576001600160a01b03831615612182576001600160a01b0383165f90815260ff60205260408120819061212f906120c985611e1a565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612177929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611b97576001600160a01b0382165f90815260ff6020526040812081906121b790611e0f85611e1a565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121ff929190918252602082015260400190565b60405180910390a25050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561224357505f905060036122c2565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612294573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122bc575f600192509250506122c2565b91505f90505b94509492505050565b5f8160048111156122de576122de612a62565b036122e65750565b60018160048111156122fa576122fa612a62565b036123475760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610773565b600281600481111561235b5761235b612a62565b036123a85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610773565b60038160048111156123bc576123bc612a62565b036108295760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610773565b5f54610100900460ff1661243a5760405162461bcd60e51b8152600401610773906129e4565b6108e033611873565b5f54610100900460ff166124695760405162461bcd60e51b8152600401610773906129e4565b60686124758382612ac1565b506069611b978282612ac1565b5f54610100900460ff166124a85760405162461bcd60e51b8152600401610773906129e4565b60996124b48382612ac1565b50609a6124c18282612ac1565b50505f609781905560985550565b5f5f6124d96118c4565b8051909150156124f0578051602090910120919050565b60975480156124ff5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f6125316118d3565b805190915015612548578051602090910120919050565b60985480156124ff5792915050565b5f80608083901c1561256b57608092831c92015b604083901c1561257d57604092831c92015b602083901c1561258f57602092831c92015b601083901c156125a157601092831c92015b600883901c156125b357600892831c92015b600483901c156125c557600492831c92015b600283901c156125d757600292831c92015b600183901c156106ae5760010192915050565b5f8183106125f8578161079d565b5090919050565b5f6001600160e01b0382111561186f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610773565b80356001600160a01b038116811461267d575f5ffd5b919050565b5f60208284031215612692575f5ffd5b61079d82612667565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61079d602083018461269b565b5f5f604083850312156126ec575f5ffd5b6126f583612667565b946020939093013593505050565b5f5f60408385031215612714575f5ffd5b61271d83612667565b915060208301358015158114612731575f5ffd5b809150509250929050565b5f5f5f6060848603121561274e575f5ffd5b61275784612667565b925061276560208501612667565b929592945050506040919091013590565b5f60208284031215612786575f5ffd5b5035919050565b60ff60f81b8816815260e060208201525f6127ab60e083018961269b565b82810360408401526127bd818961269b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156128125783518352602093840193909201916001016127f4565b50909b9a5050505050505050505050565b803560ff8116811461267d575f5ffd5b5f5f5f5f5f5f60c08789031215612848575f5ffd5b61285187612667565b9550602087013594506040870135935061286d60608801612823565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561289d575f5ffd5b6128a688612667565b96506128b460208901612667565b955060408801359450606088013593506128d060808901612823565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156128fe575f5ffd5b61290783612667565b915061291560208401612667565b90509250929050565b5f5f6040838503121561292f575f5ffd5b61293883612667565b9150602083013563ffffffff81168114612731575f5ffd5b600181811c9082168061296457607f821691505b602082108103611a1357634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ae576106ae612982565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b818103818111156106ae576106ae612982565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82612a5d57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b601f821115611b9757805f5260205f20601f840160051c81016020851015612a9b5750805b601f840160051c820191505b81811015612aba575f8155600101612aa7565b5050505050565b815167ffffffffffffffff811115612adb57612adb6129a9565b612aef81612ae98454612950565b84612a76565b6020601f821160018114612b21575f8315612b0a5750848201515b5f19600385901b1c1916600184901b178455612aba565b5f84815260208120601f198516915b82811015612b505787850151825560209485019460019092019101612b30565b5084821015612b6d57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fea26469706673582212204d66d264e26eb29dc6d603de8476699b4c65770c330fb1795e98870e3842b59064736f6c634300081b0033",
}
// BackingEigenABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/BeaconChainProofs/binding.go b/pkg/bindings/BeaconChainProofs/binding.go
index bca107b999..e5f8736a63 100644
--- a/pkg/bindings/BeaconChainProofs/binding.go
+++ b/pkg/bindings/BeaconChainProofs/binding.go
@@ -32,7 +32,7 @@ var (
// BeaconChainProofsMetaData contains all meta data concerning the BeaconChainProofs contract.
var BeaconChainProofsMetaData = &bind.MetaData{
ABI: "[{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]}]",
- Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122008cce030eef89bfa5bdc495fd3132a80b290f7c5211b5ff5314d2604022ce60764736f6c634300081b0033",
+ Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220bc00bd74e89effe2aa4cd060bd92c2a3553695b3a5d129d2f5a88577444944a964736f6c634300081b0033",
}
// BeaconChainProofsABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/BytesLib/binding.go b/pkg/bindings/BytesLib/binding.go
index 23d7c38887..fee37a8692 100644
--- a/pkg/bindings/BytesLib/binding.go
+++ b/pkg/bindings/BytesLib/binding.go
@@ -32,7 +32,7 @@ var (
// BytesLibMetaData contains all meta data concerning the BytesLib contract.
var BytesLibMetaData = &bind.MetaData{
ABI: "[{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Overflow\",\"inputs\":[]}]",
- Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212201c49718c32c7b9955558fe081b9edb8db636f523f0b3ec1bfeea2696a9f7424464736f6c634300081b0033",
+ Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212203ee1cf4e70ed42e70db49ca1d8f71ffd8fde66973bbd68b3a1083aa370f1158f64736f6c634300081b0033",
}
// BytesLibABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/DelegationManager/binding.go b/pkg/bindings/DelegationManager/binding.go
index b72d303dc6..ffe773261d 100644
--- a/pkg/bindings/DelegationManager/binding.go
+++ b/pkg/bindings/DelegationManager/binding.go
@@ -47,16 +47,16 @@ type IDelegationManagerTypesWithdrawal struct {
ScaledShares []*big.Int
}
-// ISignatureUtilsSignatureWithExpiry is an auto generated low-level Go binding around an user-defined struct.
-type ISignatureUtilsSignatureWithExpiry struct {
+// ISignatureUtilsMixinTypesSignatureWithExpiry is an auto generated low-level Go binding around an user-defined struct.
+type ISignatureUtilsMixinTypesSignatureWithExpiry struct {
Signature []byte
Expiry *big.Int
}
// DelegationManagerMetaData contains all meta data concerning the DelegationManager contract.
var DelegationManagerMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_MIN_WITHDRAWAL_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertToDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"totalQueued\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"curDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"beaconChainSlashingFactorDecrease\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"spent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositScalingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDepositedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorsShares\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawalRoots\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawals\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashableSharesInQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addedShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"pending\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"__deprecated_withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"redelegate\",\"inputs\":[{\"name\":\"newOperator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newOperatorApproverSig\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"initDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allocationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"DelegationApproverUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositScalingFactorUpdated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"newDepositScalingFactor\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"sharesToWithdraw\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FullySlashed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAllocationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManagerOrEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalNotQueued\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotCaller\",\"inputs\":[]}]",
- Bin: "0x610180604052348015610010575f5ffd5b50604051615e0d380380615e0d83398101604081905261002f9161021c565b8186868684876001600160a01b03811661005c576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05290911660e05263ffffffff16610100524661012052610125604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b610140526001600160a01b03166101605261013e610149565b5050505050506102a7565b5f54610100900460ff16156101b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610203575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610219575f5ffd5b50565b5f5f5f5f5f5f60c08789031215610231575f5ffd5b865161023c81610205565b602088015190965061024d81610205565b604088015190955061025e81610205565b606088015190945061026f81610205565b608088015190935061028081610205565b60a088015190925063ffffffff81168114610299575f5ffd5b809150509295509295509295565b60805160a05160c05160e05161010051610120516101405161016051615a7161039c5f395f818161042c01526132fa01525f61271601525f61265601525f818161070001528181611504015281816134f5015261383101525f818161075001528181610da901528181610f5a0152818161169f0152818161185e01528181611cb2015281816128eb01526133b101525f818161045301528181610ee0015281816117c501528181611a23015281816130e3015261363b01525f818161038901528181610eae01528181611977015261361501525f81816105ee01528181610b410152818161107a015261273a0152615a715ff3fe608060405234801561000f575f5ffd5b50600436106102cb575f3560e01c8063715018a61161017b578063bfae3fd2116100e4578063e4cc3f901161009e578063f2fde38b11610079578063f2fde38b146107de578063f698da25146107f1578063fabc1cbc146107f9578063fd8aa88d1461080c575f5ffd5b8063e4cc3f9014610798578063eea9064b146107ab578063f0e0e676146107be575f5ffd5b8063bfae3fd2146106e3578063c448feb8146106f6578063c978f7ac1461072a578063ca8aa7c71461074b578063cd6dc68714610772578063da8be86414610785575f5ffd5b80639104c319116101355780639104c319146106345780639435bb431461064f578063a178848414610662578063a33a343314610681578063b7f06ebe14610694578063bb45fef2146106b6575f5ffd5b8063715018a6146105a4578063778e55f3146105ac57806378296ec5146105d6578063886f1195146105e95780638da5cb5b146106105780639004134714610621575f5ffd5b806354b7c96c116102375780635dd68579116101f157806365da1264116101cc57806365da12641461053557806366d5ba931461055d5780636d70f7ae1461057e5780636e17444814610591575f5ffd5b80635dd68579146104ee578063601bb36f1461050f57806360a0d1ce14610522575f5ffd5b806354b7c96c14610475578063595c6a6714610488578063597b36da146104905780635ac86ab7146104a35780635c975abb146104c65780635d975e88146104ce575f5ffd5b806339b70e381161028857806339b70e38146103845780633c651cf2146103c35780633cdeb5e0146103d65780633e28391d146104045780634657e26a146104275780634665bcda1461044e575f5ffd5b806304a4f979146102cf5780630b9f487a146103095780630dd8dd021461031c578063136439dd1461033c57806325df922e146103515780632aa6d88814610371575b5f5ffd5b6102f67f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b6102f661031736600461498e565b61081f565b61032f61032a366004614a25565b6108a7565b6040516103009190614a63565b61034f61034a366004614a9a565b610b2c565b005b61036461035f366004614c2f565b610c01565b6040516103009190614cdd565b61034f61037f366004614d3f565b610d61565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610300565b61034f6103d1366004614d9d565b610ea3565b6103ab6103e4366004614de0565b6001600160a01b039081165f908152609960205260409020600101541690565b610417610412366004614de0565b610fea565b6040519015158152602001610300565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f610483366004614dfb565b611009565b61034f611065565b6102f661049e366004614eee565b611114565b6104176104b1366004614f1f565b606654600160ff9092169190911b9081161490565b6066546102f6565b6104e16104dc366004614a9a565b611143565b6040516103009190614ff6565b6105016104fc366004614de0565b61125f565b604051610300929190615056565b61034f61051d3660046150d7565b611694565b61034f610530366004615130565b6117ba565b6103ab610543366004614de0565b609a6020525f90815260409020546001600160a01b031681565b61057061056b366004614de0565b61194f565b60405161030092919061516f565b61041761058c366004614de0565b611c4f565b6102f661059f366004614dfb565b611c87565b61034f611d31565b6102f66105ba366004614dfb565b609860209081525f928352604080842090915290825290205481565b61034f6105e4366004615193565b611d42565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166103ab565b61036461062f3660046151e3565b611dca565b6103ab73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61034f61065d36600461522f565b611ea0565b6102f6610670366004614de0565b609f6020525f908152604090205481565b61032f61068f3660046152cb565b611f70565b6104176106a2366004614a9a565b609e6020525f908152604090205460ff1681565b6104176106c43660046153b2565b609c60209081525f928352604080842090915290825290205460ff1681565b6102f66106f1366004614dfb565b611f88565b60405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610300565b61073d6107383660046151e3565b611fc4565b6040516103009291906153dc565b6103ab7f000000000000000000000000000000000000000000000000000000000000000081565b61034f6107803660046153b2565b612251565b61032f610793366004614de0565b61236c565b61034f6107a63660046153fb565b61247c565b61034f6107b93660046152cb565b6124d2565b6107d16107cc36600461546e565b612535565b604051610300919061551b565b61034f6107ec366004614de0565b6125da565b6102f6612653565b61034f610807366004614a9a565b612738565b61032f61081a366004614de0565b61284f565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f9061089d9060e00160405160208183030381529060405280519060200120612872565b9695505050505050565b6066546060906001906002908116036108d35760405163840a48d560e01b815260040160405180910390fd5b5f836001600160401b038111156108ec576108ec614ab1565b604051908082528060200260200182016040528015610915578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610b215786868281811061094f5761094f61552d565b90506020028101906109619190615541565b61096f90602081019061555f565b90508787838181106109835761098361552d565b90506020028101906109959190615541565b61099f908061555f565b9050146109bf576040516343714afd60e01b815260040160405180910390fd5b5f610a2933848a8a868181106109d7576109d761552d565b90506020028101906109e99190615541565b6109f3908061555f565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506128a092505050565b9050610afb33848a8a86818110610a4257610a4261552d565b9050602002810190610a549190615541565b610a5e908061555f565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610aa357610aa361552d565b9050602002810190610ab59190615541565b610ac390602081019061555f565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508892506129e7915050565b848381518110610b0d57610b0d61552d565b602090810291909101015250600101610935565b509095945050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b8e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb291906155a4565b610bcf57604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610bf45760405163c61dca5d60e01b815260040160405180910390fd5b610bfd82612edc565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610c2a8683876128a0565b90505f85516001600160401b03811115610c4657610c46614ab1565b604051908082528060200260200182016040528015610c6f578160200160208202803683370190505b5090505f5b8651811015610d54576001600160a01b0388165f90815260a260205260408120885182908a9085908110610caa57610caa61552d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610d2e878381518110610cfc57610cfc61552d565b6020026020010151858481518110610d1657610d1661552d565b602002602001015183612f199092919063ffffffff16565b838381518110610d4057610d4061552d565b602090810291909101015250600101610c74565b50925050505b9392505050565b610d6a33610fea565b15610d8857604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610df2575f5ffd5b505af1158015610e04573d5f5f3e3d5ffd5b50505050610e123385612f37565b610e1c3333612f99565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610e959291906155bf565b60405180910390a250505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f025750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610f1f5760405163045206a560e21b815260040160405180910390fd5b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015610f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc391906155ed565b90505f610fd187878461309c565b9050610fe183888888888661317e565b50505050505050565b6001600160a01b039081165f908152609a602052604090205416151590565b81611013816132bc565b6110305760405163932d94f760e01b815260040160405180910390fd5b61103983611c4f565b611056576040516325ec6c1f60e01b815260040160405180910390fd5b6110608383612f37565b505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156110c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110eb91906155a4565b61110857604051631d77d47760e21b815260040160405180910390fd5b6111125f19612edc565b565b5f816040516020016111269190614ff6565b604051602081830303815290604052805190602001209050919050565b61114b61484a565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a086019392908301828280156111f957602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116111db575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561124f57602002820191905f5260205f20905b81548152602001906001019080831161123b575b5050505050815250509050919050565b6060805f61126c8461284f565b8051909150806001600160401b0381111561128957611289614ab1565b6040519080825280602002602001820160405280156112c257816020015b6112af61484a565b8152602001906001900390816112a75790505b509350806001600160401b038111156112dd576112dd614ab1565b60405190808252806020026020018201604052801561131057816020015b60608152602001906001900390816112fb5790505b506001600160a01b038087165f908152609a60205260408120549295509116905b8281101561168b5760a45f85838151811061134e5761134e61552d565b60209081029190910181015182528181019290925260409081015f20815160e08101835281546001600160a01b03908116825260018301548116828601526002830154168184015260038201546060820152600482015463ffffffff1660808201526005820180548451818702810187019095528085529194929360a086019390929083018282801561140857602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116113ea575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561145e57602002820191905f5260205f20905b81548152602001906001019080831161144a575b5050505050815250508682815181106114795761147961552d565b60200260200101819052508581815181106114965761149661552d565b602002602001015160a00151516001600160401b038111156114ba576114ba614ab1565b6040519080825280602002602001820160405280156114e3578160200160208202803683370190505b508582815181106114f6576114f661552d565b60200260200101819052505f7f00000000000000000000000000000000000000000000000000000000000000008783815181106115355761153561552d565b60200260200101516080015161154b919061561c565b905060604363ffffffff168263ffffffff1610156115935761158c89858a868151811061157a5761157a61552d565b602002602001015160a0015185613366565b90506115be565b6115bb89858a86815181106115aa576115aa61552d565b602002602001015160a001516128a0565b90505b5f5b8884815181106115d2576115d261552d565b602002602001015160a001515181101561167d5761163f8985815181106115fb576115fb61552d565b602002602001015160c0015182815181106116185761161861552d565b60200260200101518383815181106116325761163261552d565b6020026020010151613494565b8885815181106116515761165161552d565b6020026020010151828151811061166a5761166a61552d565b60209081029190910101526001016115c0565b505050806001019050611331565b50505050915091565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116dd576040516323d871a560e01b815260040160405180910390fd5b6001600160a01b038085165f90815260986020908152604080832093871683529290529081205461171b906001600160401b0380861690851661349f565b90505f61172a868686866134b7565b90505f6117378284615638565b9050611745875f8886613574565b5f61174f876135ee565b60405163debe1eab60e01b81526001600160a01b038981166004830152602482018590529192509082169063debe1eab906044015f604051808303815f87803b15801561179a575f5ffd5b505af11580156117ac573d5f5f3e3d5ffd5b505050505050505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461180357604051633213a66160e21b815260040160405180910390fd5b61180c83610fea565b15611060576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156118a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c791906155ed565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084528252808320815192830190915254815291925061192d866119256001600160401b03808716908916613660565b849190613674565b9050610fe1848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084613574565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa1580156119bb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119e291908101906156a6565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa158015611a68573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8c9190615761565b9050805f03611aa057509094909350915050565b5f83516001611aaf9190615638565b6001600160401b03811115611ac657611ac6614ab1565b604051908082528060200260200182016040528015611aef578160200160208202803683370190505b5090505f84516001611b019190615638565b6001600160401b03811115611b1857611b18614ab1565b604051908082528060200260200182016040528015611b41578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082865181518110611b6c57611b6c61552d565b60200260200101906001600160a01b031690816001600160a01b0316815250508281865181518110611ba057611ba061552d565b60209081029190910101525f5b8551811015611c4157858181518110611bc857611bc861552d565b6020026020010151838281518110611be257611be261552d565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611c1457611c1461552d565b6020026020010151828281518110611c2e57611c2e61552d565b6020908102919091010152600101611bad565b509097909650945050505050565b5f6001600160a01b03821615801590611c8157506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611cf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1b91906155ed565b9050611d298484835f6134b7565b949350505050565b611d39613692565b6111125f6136ec565b82611d4c816132bc565b611d695760405163932d94f760e01b815260040160405180910390fd5b611d7284611c4f565b611d8f576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610e959291906155bf565b60605f82516001600160401b03811115611de657611de6614ab1565b604051908082528060200260200182016040528015611e0f578160200160208202803683370190505b5090505f5b8351811015611e98576001600160a01b0385165f9081526098602052604081208551909190869084908110611e4b57611e4b61552d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110611e8557611e8561552d565b6020908102919091010152600101611e14565b509392505050565b606654600290600490811603611ec95760405163840a48d560e01b815260040160405180910390fd5b611ed161373d565b855f5b81811015611f6457611f5c898983818110611ef157611ef161552d565b9050602002810190611f039190615778565b611f0c9061578c565b888884818110611f1e57611f1e61552d565b9050602002810190611f30919061555f565b888886818110611f4257611f4261552d565b9050602002016020810190611f579190615797565b613796565b600101611ed4565b5050610fe1600160c955565b6060611f7b3361236c565b9050610d5a8484846124d2565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610d5a90613c0f565b60608082516001600160401b03811115611fe057611fe0614ab1565b604051908082528060200260200182016040528015612009578160200160208202803683370190505b50915082516001600160401b0381111561202557612025614ab1565b60405190808252806020026020018201604052801561204e578160200160208202803683370190505b506001600160a01b038086165f908152609a60205260408120549293509116906120798683876128a0565b90505f5b8551811015612246575f6120a987838151811061209c5761209c61552d565b60200260200101516135ee565b9050806001600160a01b031663fe243a17898985815181106120cd576120cd61552d565b60200260200101516040518363ffffffff1660e01b81526004016121079291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015612122573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121469190615761565b8583815181106121585761215861552d565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f89858151811061219b5761219b61552d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f82015481525050905061221f8684815181106121ed576121ed61552d565b60200260200101518585815181106122075761220761552d565b6020026020010151836136749092919063ffffffff16565b8784815181106122315761223161552d565b6020908102919091010152505060010161207d565b5050505b9250929050565b5f54610100900460ff161580801561226f57505f54600160ff909116105b806122885750303b15801561228857505f5460ff166001145b6122f05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612311575f805461ff0019166101001790555b61231a82612edc565b612323836136ec565b8015611060575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b606061237782610fea565b6123945760405163a5c7c44560e01b815260040160405180910390fd5b61239d82611c4f565b156123bb576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b03831614612473576001600160a01b038083165f908152609a6020526040902054166123ee816132bc565b8061241457506001600160a01b038181165f908152609960205260409020600101541633145b61243157604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b611c8182613c2e565b6066546002906004908116036124a55760405163840a48d560e01b815260040160405180910390fd5b6124ad61373d565b6124c16124b98661578c565b858585613796565b6124cb600160c955565b5050505050565b6124db33610fea565b156124f957604051633bf2b50360e11b815260040160405180910390fd5b61250283611c4f565b61251f576040516325ec6c1f60e01b815260040160405180910390fd5b61252b33848484613e8d565b6110603384612f99565b60605f83516001600160401b0381111561255157612551614ab1565b60405190808252806020026020018201604052801561258457816020015b606081526020019060019003908161256f5790505b5090505f5b8451811015611e98576125b58582815181106125a7576125a761552d565b602002602001015185611dca565b8282815181106125c7576125c761552d565b6020908102919091010152600101612589565b6125e2613692565b6001600160a01b0381166126475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016122e7565b612650816136ec565b50565b5f7f000000000000000000000000000000000000000000000000000000000000000046146127135750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612794573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b891906157b2565b6001600160a01b0316336001600160a01b0316146127e95760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146128105760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a360205260409020606090611c8190613f52565b5f61287b612653565b60405161190160f01b6020820152602281019190915260428101839052606201611126565b60605f82516001600160401b038111156128bc576128bc614ab1565b6040519080825280602002602001820160405280156128e5578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b81526004016129379291906157cd565b5f60405180830381865afa158015612951573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261297891908101906157f0565b90505f5b8451811015610b21576129c28786838151811061299b5761299b61552d565b60200260200101518484815181106129b5576129b561552d565b602002602001015161309c565b8382815181106129d4576129d461552d565b602090810291909101015260010161297c565b5f6001600160a01b038616612a0f576040516339b190bb60e11b815260040160405180910390fd5b83515f03612a305760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b03811115612a4a57612a4a614ab1565b604051908082528060200260200182016040528015612a73578160200160208202803683370190505b5090505f85516001600160401b03811115612a9057612a90614ab1565b604051908082528060200260200182016040528015612ab9578160200160208202803683370190505b5090505f5b8651811015612d0f575f612add88838151811061209c5761209c61552d565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a8581518110612b1657612b1661552d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612b82888481518110612b6857612b6861552d565b60200260200101518885815181106122075761220761552d565b848481518110612b9457612b9461552d565b602002602001018181525050612bcc888481518110612bb557612bb561552d565b602002602001015182613f5e90919063ffffffff16565b858481518110612bde57612bde61552d565b60209081029190910101526001600160a01b038a1615612c7357612c358a8a8581518110612c0e57612c0e61552d565b6020026020010151878681518110612c2857612c2861552d565b6020026020010151613f72565b612c738a8c8b8681518110612c4c57612c4c61552d565b6020026020010151878781518110612c6657612c6661552d565b6020026020010151613574565b816001600160a01b031663724af4238c8b8681518110612c9557612c9561552d565b60200260200101518b8781518110612caf57612caf61552d565b60200260200101516040518463ffffffff1660e01b8152600401612cd59392919061587f565b5f604051808303815f87803b158015612cec575f5ffd5b505af1158015612cfe573d5f5f3e3d5ffd5b505050505050806001019050612abe565b506001600160a01b0388165f908152609f60205260408120805491829190612d36836158a3565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f612d9c82611114565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612e5292600585019201906148a3565b5060c08201518051612e6e916006840191602090910190614906565b5050506001600160a01b038b165f90815260a360205260409020612e929082614000565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612ec6939291906158bb565b60405180910390a19a9950505050505050505050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f611d2982612f31612f2a87613c0f565b869061400b565b9061400b565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69101612843565b6066545f90600190811603612fc15760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038381165f818152609a602052604080822080546001600160a01b0319169487169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a35f5f61301e8561194f565b915091505f61302e8686856128a0565b90505f5b8351811015610fe15761309486888684815181106130525761305261552d565b60200260200101515f87868151811061306d5761306d61552d565b60200260200101518787815181106130875761308761552d565b602002602001015161317e565b600101613032565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b0384160161316e5760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa15801561312a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061314e91906155ed565b90506131666001600160401b03848116908316613660565b915050610d5a565b506001600160401b031692915050565b805f0361319e57604051630a33bc6960e21b815260040160405180910390fd5b6001600160a01b038086165f90815260a2602090815260408083209388168352929052206131ce8185858561401f565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f908790879061320c90613c0f565b60405161321b9392919061587f565b60405180910390a161322c86610fea565b15610fe1576001600160a01b038088165f90815260986020908152604080832093891683529290529081208054859290613267908490615638565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c8787866040516132ab9392919061587f565b60405180910390a250505050505050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015613342573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c8191906155a4565b60605f83516001600160401b0381111561338257613382614ab1565b6040519080825280602002602001820160405280156133ab578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b81526004016133ff939291906158e5565b5f60405180830381865afa158015613419573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261344091908101906157f0565b90505f5b8551811015613488576134638887838151811061299b5761299b61552d565b8382815181106134755761347561552d565b6020908102919091010152600101613444565b50909695505050505050565b5f610d5a8383613660565b5f6134ad848385600161408e565b611d29908561591e565b6001600160a01b038085165f90815260a560209081526040808320938716835292905290812081906134e8906140e9565b90505f61354e600161351a7f000000000000000000000000000000000000000000000000000000000000000043615931565b6135249190615931565b6001600160a01b03808a165f90815260a560209081526040808320938c1683529290522090614103565b90505f61355b828461591e565b905061356881878761411f565b98975050505050505050565b6001600160a01b038085165f908152609860209081526040808320938616835292905290812080548392906135aa90849061591e565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610e959392919061587f565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014613639577f0000000000000000000000000000000000000000000000000000000000000000611c81565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b5f610d5a8383670de0b6b3a764000061413d565b5f611d298261368c61368587613c0f565b8690613660565b90613660565b6033546001600160a01b031633146111125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016122e7565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600260c9540361378f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016122e7565b600260c955565b60a08401515182146137bb576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b0316146137f1576040516316110d3560e21b815260040160405180910390fd5b5f6137fb85611114565b5f818152609e602052604090205490915060ff1661382c576040516387c9d21960e01b815260040160405180910390fd5b60605f7f0000000000000000000000000000000000000000000000000000000000000000876080015161385f919061561c565b90508063ffffffff164363ffffffff161161388d576040516378f67ae160e11b815260040160405180910390fd5b6138a4875f015188602001518960a0015184613366565b87516001600160a01b03165f90815260a3602052604090209092506138ca915083614222565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff1916905590613921600583018261493f565b61392e600683015f61493f565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00906139779084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a015191909316926139b19184906128a0565b90505f5b8860a0015151811015613c04575f6139dc8a60a00151838151811061209c5761209c61552d565b90505f613a128b60c0015184815181106139f8576139f861552d565b60200260200101518785815181106116325761163261552d565b90508715613ae257816001600160a01b0316632eae418c8c5f01518d60a001518681518110613a4357613a4361552d565b60200260200101518d8d88818110613a5d57613a5d61552d565b9050602002016020810190613a729190614de0565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b158015613ac7575f5ffd5b505af1158015613ad9573d5f5f3e3d5ffd5b50505050613bfa565b5f5f836001600160a01b031663c4623ea18e5f01518f60a001518881518110613b0d57613b0d61552d565b60200260200101518f8f8a818110613b2757613b2761552d565b9050602002016020810190613b3c9190614de0565b60405160e085901b6001600160e01b03191681526001600160a01b039384166004820152918316602483015290911660448201526064810186905260840160408051808303815f875af1158015613b95573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bb9919061594d565b91509150613bf7878e5f01518f60a001518881518110613bdb57613bdb61552d565b602002602001015185858b8b815181106130875761308761552d565b50505b50506001016139b5565b505050505050505050565b80515f9015613c1f578151611c81565b670de0b6b3a764000092915050565b606654606090600190600290811603613c5a5760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613cb98661194f565b9150915081515f03613ccd57505050613e87565b81516001600160401b03811115613ce657613ce6614ab1565b604051908082528060200260200182016040528015613d0f578160200160208202803683370190505b5094505f613d1e8785856128a0565b90505f5b8351811015613e81576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613da257613da261552d565b6020026020010151835f81518110613dbc57613dbc61552d565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613dee57613dee61552d565b6020026020010151825f81518110613e0857613e0861552d565b602002602001018181525050848481518110613e2657613e2661552d565b6020026020010151815f81518110613e4057613e4061552d565b602002602001018181525050613e598b898585856129e7565b8a8581518110613e6b57613e6b61552d565b6020908102919091010152505050600101613d22565b50505050505b50919050565b6001600160a01b038084165f908152609960205260409020600101541680613eb55750613f4c565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff1615613ef957604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff191660011790558301516124cb908290613f4090889088908490889061081f565b8551602087015161422d565b50505050565b60605f610d5a8361427f565b5f610d5a613f6b84613c0f565b8390613660565b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014611060576001600160a01b038084165f90815260a5602090815260408083209386168352929052908120613fc5906140e9565b9050613f4c43613fd58484615638565b6001600160a01b038088165f90815260a560209081526040808320938a1683529290522091906142d8565b5f610d5a83836142e3565b5f610d5a83670de0b6b3a76400008461413d565b825f0361403f57614038670de0b6b3a76400008261400b565b8455613f4c565b6040805160208101909152845481525f9061405b908584613674565b90505f6140688483615638565b90505f61408384612f3161407c888a615638565b859061400b565b875550505050505050565b5f5f61409b86868661413d565b905060018360028111156140b1576140b161596f565b1480156140cd57505f84806140c8576140c8615983565b868809115b156140e0576140dd600182615638565b90505b95945050505050565b5f6140f4828261432f565b6001600160e01b031692915050565b5f61410f838383614374565b6001600160e01b03169392505050565b5f611d2961412d8385615997565b85906001600160401b0316613660565b5f80805f19858709858702925082811083820303915050805f036141745783828161416a5761416a615983565b0492505050610d5a565b8084116141bb5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016122e7565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610d5a83836143bd565b4281101561424e57604051630819bdcd60e01b815260040160405180910390fd5b6142626001600160a01b03851684846144a0565b613f4c57604051638baa579f60e01b815260040160405180910390fd5b6060815f018054806020026020016040519081016040528092919081815260200182805480156142cc57602002820191905f5260205f20905b8154815260200190600101908083116142b8575b50505050509050919050565b6110608383836144f4565b5f81815260018301602052604081205461432857508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611c81565b505f611c81565b81545f90801561436c576143558461434860018461591e565b5f91825260209091200190565b5464010000000090046001600160e01b0316611d29565b509092915050565b82545f9081614385868683856145fa565b905080156143b35761439c8661434860018461591e565b5464010000000090046001600160e01b031661089d565b5091949350505050565b5f8181526001830160205260408120548015614497575f6143df60018361591e565b85549091505f906143f29060019061591e565b9050818114614451575f865f0182815481106144105761441061552d565b905f5260205f200154905080875f0184815481106144305761443061552d565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080614462576144626159b6565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611c81565b5f915050611c81565b5f5f5f6144ad858561464d565b90925090505f8160048111156144c5576144c561596f565b1480156144e35750856001600160a01b0316826001600160a01b0316145b8061089d575061089d86868661468c565b825480156145ac575f61450c8561434860018561591e565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b03166020840152919250908516101561455f5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036145aa57826145808661434860018661591e565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b81831015611e98575f61460f8484614773565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561463957809250614647565b614644816001615638565b93505b506145fc565b5f5f8251604103614681576020830151604084015160608501515f1a6146758782858561478d565b9450945050505061224a565b505f9050600261224a565b5f5f5f856001600160a01b0316631626ba7e60e01b86866040516024016146b49291906159ca565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516146f29190615a06565b5f60405180830381855afa9150503d805f811461472a576040519150601f19603f3d011682016040523d82523d5f602084013e61472f565b606091505b509150915081801561474357506020815110155b801561089d57508051630b135d3f60e11b906147689083016020908101908401615761565b149695505050505050565b5f6147816002848418615a1c565b610d5a90848416615638565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156147c257505f90506003614841565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614813573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661483b575f60019250925050614841565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f209081019282156148f6579160200282015b828111156148f657825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906148c1565b50614902929150614956565b5090565b828054828255905f5260205f209081019282156148f6579160200282015b828111156148f6578251825591602001919060010190614924565b5080545f8255905f5260205f209081019061265091905b5b80821115614902575f8155600101614957565b6001600160a01b0381168114612650575f5ffd5b80356149898161496a565b919050565b5f5f5f5f5f60a086880312156149a2575f5ffd5b85356149ad8161496a565b945060208601356149bd8161496a565b935060408601356149cd8161496a565b94979396509394606081013594506080013592915050565b5f5f83601f8401126149f5575f5ffd5b5081356001600160401b03811115614a0b575f5ffd5b6020830191508360208260051b850101111561224a575f5ffd5b5f5f60208385031215614a36575f5ffd5b82356001600160401b03811115614a4b575f5ffd5b614a57858286016149e5565b90969095509350505050565b602080825282518282018190525f918401906040840190835b81811015610b21578351835260209384019390920191600101614a7c565b5f60208284031215614aaa575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614ae757614ae7614ab1565b60405290565b604080519081016001600160401b0381118282101715614ae757614ae7614ab1565b604051601f8201601f191681016001600160401b0381118282101715614b3757614b37614ab1565b604052919050565b5f6001600160401b03821115614b5757614b57614ab1565b5060051b60200190565b5f82601f830112614b70575f5ffd5b8135614b83614b7e82614b3f565b614b0f565b8082825260208201915060208360051b860101925085831115614ba4575f5ffd5b602085015b83811015614bca578035614bbc8161496a565b835260209283019201614ba9565b5095945050505050565b5f82601f830112614be3575f5ffd5b8135614bf1614b7e82614b3f565b8082825260208201915060208360051b860101925085831115614c12575f5ffd5b602085015b83811015614bca578035835260209283019201614c17565b5f5f5f60608486031215614c41575f5ffd5b8335614c4c8161496a565b925060208401356001600160401b03811115614c66575f5ffd5b614c7286828701614b61565b92505060408401356001600160401b03811115614c8d575f5ffd5b614c9986828701614bd4565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614cd3578151865260209586019590910190600101614cb5565b5093949350505050565b602081525f610d5a6020830184614ca3565b803563ffffffff81168114614989575f5ffd5b5f5f83601f840112614d12575f5ffd5b5081356001600160401b03811115614d28575f5ffd5b60208301915083602082850101111561224a575f5ffd5b5f5f5f5f60608587031215614d52575f5ffd5b8435614d5d8161496a565b9350614d6b60208601614cef565b925060408501356001600160401b03811115614d85575f5ffd5b614d9187828801614d02565b95989497509550505050565b5f5f5f5f60808587031215614db0575f5ffd5b8435614dbb8161496a565b93506020850135614dcb8161496a565b93969395505050506040820135916060013590565b5f60208284031215614df0575f5ffd5b8135610d5a8161496a565b5f5f60408385031215614e0c575f5ffd5b8235614e178161496a565b91506020830135614e278161496a565b809150509250929050565b5f60e08284031215614e42575f5ffd5b614e4a614ac5565b9050614e558261497e565b8152614e636020830161497e565b6020820152614e746040830161497e565b604082015260608281013590820152614e8f60808301614cef565b608082015260a08201356001600160401b03811115614eac575f5ffd5b614eb884828501614b61565b60a08301525060c08201356001600160401b03811115614ed6575f5ffd5b614ee284828501614bd4565b60c08301525092915050565b5f60208284031215614efe575f5ffd5b81356001600160401b03811115614f13575f5ffd5b611d2984828501614e32565b5f60208284031215614f2f575f5ffd5b813560ff81168114610d5a575f5ffd5b5f8151808452602084019350602083015f5b82811015614cd35781516001600160a01b0316865260209586019590910190600101614f51565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f91614fc39085018263ffffffff169052565b5060a082015160e060a0850152614fdd60e0850182614f3f565b905060c083015184820360c08601526140e08282614ca3565b602081525f610d5a6020830184614f78565b5f82825180855260208501945060208160051b830101602085015f5b8381101561348857601f19858403018852615040838351614ca3565b6020988901989093509190910190600101615024565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b828110156150ad57605f19878603018452615098858351614f78565b9450602093840193919091019060010161507c565b5050505082810360208401526140e08185615008565b6001600160401b0381168114612650575f5ffd5b5f5f5f5f608085870312156150ea575f5ffd5b84356150f58161496a565b935060208501356151058161496a565b92506040850135615115816150c3565b91506060850135615125816150c3565b939692955090935050565b5f5f5f60608486031215615142575f5ffd5b833561514d8161496a565b9250602084013591506040840135615164816150c3565b809150509250925092565b604081525f6151816040830185614f3f565b82810360208401526140e08185614ca3565b5f5f5f604084860312156151a5575f5ffd5b83356151b08161496a565b925060208401356001600160401b038111156151ca575f5ffd5b6151d686828701614d02565b9497909650939450505050565b5f5f604083850312156151f4575f5ffd5b82356151ff8161496a565b915060208301356001600160401b03811115615219575f5ffd5b61522585828601614b61565b9150509250929050565b5f5f5f5f5f5f60608789031215615244575f5ffd5b86356001600160401b03811115615259575f5ffd5b61526589828a016149e5565b90975095505060208701356001600160401b03811115615283575f5ffd5b61528f89828a016149e5565b90955093505060408701356001600160401b038111156152ad575f5ffd5b6152b989828a016149e5565b979a9699509497509295939492505050565b5f5f5f606084860312156152dd575f5ffd5b83356152e88161496a565b925060208401356001600160401b03811115615302575f5ffd5b840160408187031215615313575f5ffd5b61531b614aed565b81356001600160401b03811115615330575f5ffd5b8201601f81018813615340575f5ffd5b80356001600160401b0381111561535957615359614ab1565b61536c601f8201601f1916602001614b0f565b818152896020838501011115615380575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f604083850312156153c3575f5ffd5b82356153ce8161496a565b946020939093013593505050565b604081525f6151816040830185614ca3565b8015158114612650575f5ffd5b5f5f5f5f6060858703121561540e575f5ffd5b84356001600160401b03811115615423575f5ffd5b850160e08188031215615434575f5ffd5b935060208501356001600160401b0381111561544e575f5ffd5b61545a878288016149e5565b9094509250506040850135615125816153ee565b5f5f6040838503121561547f575f5ffd5b82356001600160401b03811115615494575f5ffd5b8301601f810185136154a4575f5ffd5b80356154b2614b7e82614b3f565b8082825260208201915060208360051b8501019250878311156154d3575f5ffd5b6020840193505b828410156154fe5783356154ed8161496a565b8252602093840193909101906154da565b945050505060208301356001600160401b03811115615219575f5ffd5b602081525f610d5a6020830184615008565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615555575f5ffd5b9190910192915050565b5f5f8335601e19843603018112615574575f5ffd5b8301803591506001600160401b0382111561558d575f5ffd5b6020019150600581901b360382131561224a575f5ffd5b5f602082840312156155b4575f5ffd5b8151610d5a816153ee565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156155fd575f5ffd5b8151610d5a816150c3565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115611c8157611c81615608565b80820180821115611c8157611c81615608565b5f82601f83011261565a575f5ffd5b8151615668614b7e82614b3f565b8082825260208201915060208360051b860101925085831115615689575f5ffd5b602085015b83811015614bca57805183526020928301920161568e565b5f5f604083850312156156b7575f5ffd5b82516001600160401b038111156156cc575f5ffd5b8301601f810185136156dc575f5ffd5b80516156ea614b7e82614b3f565b8082825260208201915060208360051b85010192508783111561570b575f5ffd5b6020840193505b828410156157365783516157258161496a565b825260209384019390910190615712565b8095505050505060208301516001600160401b03811115615755575f5ffd5b6152258582860161564b565b5f60208284031215615771575f5ffd5b5051919050565b5f823560de19833603018112615555575f5ffd5b5f611c813683614e32565b5f602082840312156157a7575f5ffd5b8135610d5a816153ee565b5f602082840312156157c2575f5ffd5b8151610d5a8161496a565b6001600160a01b03831681526040602082018190525f90611d2990830184614f3f565b5f60208284031215615800575f5ffd5b81516001600160401b03811115615815575f5ffd5b8201601f81018413615825575f5ffd5b8051615833614b7e82614b3f565b8082825260208201915060208360051b850101925086831115615854575f5ffd5b6020840193505b8284101561089d57835161586e816150c3565b82526020938401939091019061585b565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f600182016158b4576158b4615608565b5060010190565b838152606060208201525f6158d36060830185614f78565b828103604084015261089d8185614ca3565b6001600160a01b03841681526060602082018190525f9061590890830185614f3f565b905063ffffffff83166040830152949350505050565b81810381811115611c8157611c81615608565b63ffffffff8281168282160390811115611c8157611c81615608565b5f5f6040838503121561595e575f5ffd5b505080516020909101519092909150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160401b038281168282160390811115611c8157611c81615608565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b5f82518060208501845e5f920191825250919050565b5f82615a3657634e487b7160e01b5f52601260045260245ffd5b50049056fea264697066735822122057f7bd810db4ed58c974e637c477b6ccbb7f4101a2bcaa7880fa5c371fd27d6164736f6c634300081b0033",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_MIN_WITHDRAWAL_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertToDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"totalQueued\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"curDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"beaconChainSlashingFactorDecrease\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtilsMixinTypes.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"spent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositScalingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDepositedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorsShares\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawalRoots\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawals\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashableSharesInQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addedShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"pending\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"__deprecated_withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"queuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"redelegate\",\"inputs\":[{\"name\":\"newOperator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newOperatorApproverSig\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtilsMixinTypes.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"initDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allocationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"operator\",\"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\":\"DelegationApproverUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositScalingFactorUpdated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"newDepositScalingFactor\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"totalSlashedShares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"sharesToWithdraw\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FullySlashed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAllocationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManagerOrEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalNotQueued\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotCaller\",\"inputs\":[]}]",
+ Bin: "0x610160604052348015610010575f5ffd5b5060405161627a38038061627a83398101604081905261002f916101d9565b808084898989878a6001600160a01b03811661005e576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c052821660e05263ffffffff16610100521661012052610095816100b0565b61014052506100a490506100f6565b50505050505050610364565b5f5f829050601f815111156100e3578260405163305a27a960e01b81526004016100da9190610309565b60405180910390fd5b80516100ee8261033e565b179392505050565b5f54610100900460ff161561015d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100da565b5f5460ff908116146101ac575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101c2575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f5f60e0888a0312156101ef575f5ffd5b87516101fa816101ae565b602089015190975061020b816101ae565b604089015190965061021c816101ae565b606089015190955061022d816101ae565b608089015190945061023e816101ae565b60a089015190935063ffffffff81168114610257575f5ffd5b60c08901519092506001600160401b03811115610272575f5ffd5b88015f601f82018b13610283575f5ffd5b81516001600160401b0381111561029c5761029c6101c5565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102ca576102ca6101c5565b6040528181528382016020018d10156102e1575f5ffd5b8160208501602083015e5f602083830101528092508094505050505092959891949750929550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561035e575f198160200360031b1b821691505b50919050565b60805160a05160c05160e051610100516101205161014051615e1d61045d5f395f818161111201526140f901525f818161046001526133d801525f818161076a015281816135e80152818161372a0152613a0d01525f81816107ba01528181610e2701528181610fea0152818161136b01528181611584015281816119e6015281816127a0015261432301525f818161048701528181610f68015281816114e30152818161175701528181612fe0015281816131c1015261387001525f81816103bd01528181610f36015281816116ab015261384a01525f818161063801528181610bb70152818161115001526125960152615e1d5ff3fe608060405234801561000f575f5ffd5b50600436106102ff575f3560e01c8063715018a611610195578063bfae3fd2116100e4578063e4cc3f901161009e578063f2fde38b11610079578063f2fde38b14610848578063f698da251461085b578063fabc1cbc14610863578063fd8aa88d14610876575f5ffd5b8063e4cc3f9014610802578063eea9064b14610815578063f0e0e67614610828575f5ffd5b8063bfae3fd21461074d578063c448feb814610760578063c978f7ac14610794578063ca8aa7c7146107b5578063cd6dc687146107dc578063da8be864146107ef575f5ffd5b80639104c3191161014f578063a17884841161012a578063a1788484146106cc578063a33a3433146106eb578063b7f06ebe146106fe578063bb45fef214610720575f5ffd5b80639104c3191461067e5780639435bb431461069957806399f5371b146106ac575f5ffd5b8063715018a6146105ee578063778e55f3146105f657806378296ec514610620578063886f1195146106335780638da5cb5b1461065a578063900413471461066b575f5ffd5b806354fd4d50116102515780635dd685791161020b57806365da1264116101e657806365da12641461057f57806366d5ba93146105a75780636d70f7ae146105c85780636e174448146105db575f5ffd5b80635dd6857914610538578063601bb36f1461055957806360a0d1ce1461056c575f5ffd5b806354fd4d50146104bc578063595c6a67146104d1578063597b36da146104d95780635ac86ab7146104ec5780635c975abb1461050f5780635d975e8814610517575f5ffd5b806339b70e38116102bc5780633e28391d116102975780633e28391d146104385780634657e26a1461045b5780634665bcda1461048257806354b7c96c146104a9575f5ffd5b806339b70e38146103b85780633c651cf2146103f75780633cdeb5e01461040a575f5ffd5b806304a4f979146103035780630b9f487a1461033d5780630dd8dd0214610350578063136439dd1461037057806325df922e146103855780632aa6d888146103a5575b5f5ffd5b61032a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b61032a61034b366004614d0c565b610889565b61036361035e366004614da3565b610911565b6040516103349190614de1565b61038361037e366004614e18565b610ba2565b005b610398610393366004614fad565b610c77565b604051610334919061505b565b6103836103b33660046150bd565b610dd7565b6103df7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610334565b61038361040536600461511b565b610f2b565b6103df61041836600461515e565b6001600160a01b039081165f908152609960205260409020600101541690565b61044b61044636600461515e565b61107e565b6040519015158152602001610334565b6103df7f000000000000000000000000000000000000000000000000000000000000000081565b6103df7f000000000000000000000000000000000000000000000000000000000000000081565b6103836104b7366004615179565b61109d565b6104c461110b565b60405161033491906151de565b61038361113b565b61032a6104e73660046152ac565b6111ea565b61044b6104fa3660046152dd565b606654600160ff9092169190911b9081161490565b60665461032a565b61052a610525366004614e18565b611219565b6040516103349291906153b4565b61054b61054636600461515e565b611236565b604051610334929190615426565b6103836105673660046154a7565b611360565b61038361057a366004615500565b6114d8565b6103df61058d36600461515e565b609a6020525f90815260409020546001600160a01b031681565b6105ba6105b536600461515e565b611683565b60405161033492919061553f565b61044b6105d636600461515e565b611983565b61032a6105e9366004615179565b6119bb565b610383611a65565b61032a610604366004615179565b609860209081525f928352604080842090915290825290205481565b61038361062e366004615551565b611a76565b6103df7f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166103df565b6103986106793660046155a1565b611b0c565b6103df73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103836106a73660046155ed565b611be2565b6106bf6106ba366004614e18565b611cbb565b6040516103349190615689565b61032a6106da36600461515e565b609f6020525f908152604090205481565b6103636106f936600461569b565b611dd7565b61044b61070c366004614e18565b609e6020525f908152604090205460ff1681565b61044b61072e366004615782565b609c60209081525f928352604080842090915290825290205460ff1681565b61032a61075b366004615179565b611def565b60405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610334565b6107a76107a23660046155a1565b611e2b565b6040516103349291906157ac565b6103df7f000000000000000000000000000000000000000000000000000000000000000081565b6103836107ea366004615782565b6120b8565b6103636107fd36600461515e565b6121d3565b6103836108103660046157cb565b6122fc565b61038361082336600461569b565b612352565b61083b61083636600461583e565b6123bd565b60405161033491906158eb565b61038361085636600461515e565b612462565b61032a6124db565b610383610871366004614e18565b612594565b61036361088436600461515e565b6126ab565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f906109079060e001604051602081830303815290604052805190602001206126ce565b9695505050505050565b60665460609060019060029081160361093d5760405163840a48d560e01b815260040160405180910390fd5b6109456126fc565b5f836001600160401b0381111561095e5761095e614e2f565b604051908082528060200260200182016040528015610987578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610b93578686828181106109c1576109c16158fd565b90506020028101906109d39190615911565b6109e190602081019061592f565b90508787838181106109f5576109f56158fd565b9050602002810190610a079190615911565b610a11908061592f565b905014610a31576040516343714afd60e01b815260040160405180910390fd5b5f610a9b33848a8a86818110610a4957610a496158fd565b9050602002810190610a5b9190615911565b610a65908061592f565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061275592505050565b9050610b6d33848a8a86818110610ab457610ab46158fd565b9050602002810190610ac69190615911565b610ad0908061592f565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610b1557610b156158fd565b9050602002810190610b279190615911565b610b3590602081019061592f565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508892506128a7915050565b848381518110610b7f57610b7f6158fd565b6020908102919091010152506001016109a7565b5050600160c955949350505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610c04573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c289190615974565b610c4557604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610c6a5760405163c61dca5d60e01b815260040160405180910390fd5b610c7382612e16565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610ca0868387612755565b90505f85516001600160401b03811115610cbc57610cbc614e2f565b604051908082528060200260200182016040528015610ce5578160200160208202803683370190505b5090505f5b8651811015610dca576001600160a01b0388165f90815260a260205260408120885182908a9085908110610d2057610d206158fd565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610da4878381518110610d7257610d726158fd565b6020026020010151858481518110610d8c57610d8c6158fd565b602002602001015183612e539092919063ffffffff16565b838381518110610db657610db66158fd565b602090810291909101015250600101610cea565b50925050505b9392505050565b610ddf6126fc565b610de83361107e565b15610e0657604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610e70575f5ffd5b505af1158015610e82573d5f5f3e3d5ffd5b50505050610e903385612e71565b610e9a3333612ed3565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610f1392919061598f565b60405180910390a2610f25600160c955565b50505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f8a5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610fa75760405163045206a560e21b815260040160405180910390fd5b610faf6126fc565b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa15801561102f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105391906159bd565b90505f61106187878461317a565b905061107183888888888661325c565b505050610f25600160c955565b6001600160a01b039081165f908152609a602052604090205416151590565b816110a78161339a565b6110c45760405163932d94f760e01b815260040160405180910390fd5b6110cc6126fc565b6110d583611983565b6110f2576040516325ec6c1f60e01b815260040160405180910390fd5b6110fc8383612e71565b611106600160c955565b505050565b60606111367f0000000000000000000000000000000000000000000000000000000000000000613444565b905090565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561119d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c19190615974565b6111de57604051631d77d47760e21b815260040160405180910390fd5b6111e85f19612e16565b565b5f816040516020016111fc9190615689565b604051602081830303815290604052805190602001209050919050565b611221614bcd565b606061122c83613481565b9094909350915050565b6060805f611243846126ab565b8051909150806001600160401b0381111561126057611260614e2f565b60405190808252806020026020018201604052801561129957816020015b611286614bcd565b81526020019060019003908161127e5790505b509350806001600160401b038111156112b4576112b4614e2f565b6040519080825280602002602001820160405280156112e757816020015b60608152602001906001900390816112d25790505b5092505f5b8181101561135857611316838281518110611309576113096158fd565b6020026020010151613481565b868381518110611328576113286158fd565b60200260200101868481518110611341576113416158fd565b6020908102919091010191909152526001016112ec565b505050915091565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113a9576040516323d871a560e01b815260040160405180910390fd5b6113b16126fc565b6001600160a01b038085165f9081526098602090815260408083209387168352929052908120546113ef906001600160401b038086169085166136d4565b90505f6113fe868686866136ec565b90505f61140b82846159ec565b9050611419875f88866137a9565b604080516001600160a01b038881168252602082018490528916917fdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30910160405180910390a25f61146987613823565b60405163debe1eab60e01b81526001600160a01b038981166004830152602482018590529192509082169063debe1eab906044015f604051808303815f87803b1580156114b4575f5ffd5b505af11580156114c6573d5f5f3e3d5ffd5b5050505050505050610f25600160c955565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461152157604051633213a66160e21b815260040160405180910390fd5b6115296126fc565b6115328361107e565b156110fc576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156115c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ed91906159bd565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08452825280832081519283019091525481529192506116538661164b6001600160401b03808716908916613895565b8491906138a9565b9050611675848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0846137a9565b50505050611106600160c955565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa1580156116ef573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117169190810190615a5a565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa15801561179c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117c09190615b15565b9050805f036117d457509094909350915050565b5f835160016117e391906159ec565b6001600160401b038111156117fa576117fa614e2f565b604051908082528060200260200182016040528015611823578160200160208202803683370190505b5090505f8451600161183591906159ec565b6001600160401b0381111561184c5761184c614e2f565b604051908082528060200260200182016040528015611875578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0828651815181106118a0576118a06158fd565b60200260200101906001600160a01b031690816001600160a01b03168152505082818651815181106118d4576118d46158fd565b60209081029190910101525f5b8551811015611975578581815181106118fc576118fc6158fd565b6020026020010151838281518110611916576119166158fd565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611948576119486158fd565b6020026020010151828281518110611962576119626158fd565b60209081029190910101526001016118e1565b509097909650945050505050565b5f6001600160a01b038216158015906119b557506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611a2b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a4f91906159bd565b9050611a5d8484835f6136ec565b949350505050565b611a6d6138c7565b6111e85f613921565b82611a808161339a565b611a9d5760405163932d94f760e01b815260040160405180910390fd5b611aa684611983565b611ac3576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051611afe92919061598f565b60405180910390a250505050565b60605f82516001600160401b03811115611b2857611b28614e2f565b604051908082528060200260200182016040528015611b51578160200160208202803683370190505b5090505f5b8351811015611bda576001600160a01b0385165f9081526098602052604081208551909190869084908110611b8d57611b8d6158fd565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110611bc757611bc76158fd565b6020908102919091010152600101611b56565b509392505050565b606654600290600490811603611c0b5760405163840a48d560e01b815260040160405180910390fd5b611c136126fc565b855f5b81811015611ca657611c9e898983818110611c3357611c336158fd565b9050602002810190611c459190615b2c565b611c4e90615b40565b888884818110611c6057611c606158fd565b9050602002810190611c72919061592f565b888886818110611c8457611c846158fd565b9050602002016020810190611c999190615b4b565b613972565b600101611c16565b5050611cb2600160c955565b50505050505050565b611cc3614bcd565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a08601939290830182828015611d7157602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611d53575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015611dc757602002820191905f5260205f20905b815481526020019060010190808311611db3575b5050505050815250509050919050565b6060611de2336121d3565b9050610dd0848484612352565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610dd090613db4565b60608082516001600160401b03811115611e4757611e47614e2f565b604051908082528060200260200182016040528015611e70578160200160208202803683370190505b50915082516001600160401b03811115611e8c57611e8c614e2f565b604051908082528060200260200182016040528015611eb5578160200160208202803683370190505b506001600160a01b038086165f908152609a6020526040812054929350911690611ee0868387612755565b90505f5b85518110156120ad575f611f10878381518110611f0357611f036158fd565b6020026020010151613823565b9050806001600160a01b031663fe243a1789898581518110611f3457611f346158fd565b60200260200101516040518363ffffffff1660e01b8152600401611f6e9291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015611f89573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fad9190615b15565b858381518110611fbf57611fbf6158fd565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f898581518110612002576120026158fd565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612086868481518110612054576120546158fd565b602002602001015185858151811061206e5761206e6158fd565b6020026020010151836138a99092919063ffffffff16565b878481518110612098576120986158fd565b60209081029190910101525050600101611ee4565b5050505b9250929050565b5f54610100900460ff16158080156120d657505f54600160ff909116105b806120ef5750303b1580156120ef57505f5460ff166001145b6121575760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612178575f805461ff0019166101001790555b61218182612e16565b61218a83613921565b8015611106575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b60606121dd6126fc565b6121e68261107e565b6122035760405163a5c7c44560e01b815260040160405180910390fd5b61220c82611983565b1561222a576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b038316146122e2576001600160a01b038083165f908152609a60205260409020541661225d8161339a565b8061228357506001600160a01b038181165f908152609960205260409020600101541633145b6122a057604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b6122eb82613dd3565b90506122f7600160c955565b919050565b6066546002906004908116036123255760405163840a48d560e01b815260040160405180910390fd5b61232d6126fc565b61234161233986615b40565b858585613972565b61234b600160c955565b5050505050565b61235a6126fc565b6123633361107e565b1561238157604051633bf2b50360e11b815260040160405180910390fd5b61238a83611983565b6123a7576040516325ec6c1f60e01b815260040160405180910390fd5b6123b333848484614032565b6110fc3384612ed3565b60605f83516001600160401b038111156123d9576123d9614e2f565b60405190808252806020026020018201604052801561240c57816020015b60608152602001906001900390816123f75790505b5090505f5b8451811015611bda5761243d85828151811061242f5761242f6158fd565b602002602001015185611b0c565b82828151811061244f5761244f6158fd565b6020908102919091010152600101612411565b61246a6138c7565b6001600160a01b0381166124cf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161214e565b6124d881613921565b50565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea6125486140f1565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126149190615b66565b6001600160a01b0316336001600160a01b0316146126455760405163794821ff60e01b815260040160405180910390fd5b6066548019821981161461266c5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a3602052604090206060906119b59061418d565b5f6126d76124db565b60405161190160f01b60208201526022810191909152604281018390526062016111fc565b600260c9540361274e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161214e565b600260c955565b60605f82516001600160401b0381111561277157612771614e2f565b60405190808252806020026020018201604052801561279a578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b81526004016127ec929190615b81565b5f60405180830381865afa158015612806573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261282d9190810190615ba4565b90505f5b845181101561289c5761287787868381518110612850576128506158fd565b602002602001015184848151811061286a5761286a6158fd565b602002602001015161317a565b838281518110612889576128896158fd565b6020908102919091010152600101612831565b509095945050505050565b5f6001600160a01b0386166128cf576040516339b190bb60e11b815260040160405180910390fd5b83515f036128f05760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b0381111561290a5761290a614e2f565b604051908082528060200260200182016040528015612933578160200160208202803683370190505b5090505f85516001600160401b0381111561295057612950614e2f565b604051908082528060200260200182016040528015612979578160200160208202803683370190505b5090505f5b8651811015612c49575f61299d888381518110611f0357611f036158fd565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a85815181106129d6576129d66158fd565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612a42888481518110612a2857612a286158fd565b602002602001015188858151811061206e5761206e6158fd565b848481518110612a5457612a546158fd565b602002602001018181525050612a8c888481518110612a7557612a756158fd565b60200260200101518261419990919063ffffffff16565b858481518110612a9e57612a9e6158fd565b60209081029190910101526001600160a01b038a1615612b3357612af58a8a8581518110612ace57612ace6158fd565b6020026020010151878681518110612ae857612ae86158fd565b60200260200101516141ad565b612b338a8c8b8681518110612b0c57612b0c6158fd565b6020026020010151878781518110612b2657612b266158fd565b60200260200101516137a9565b5f826001600160a01b031663724af4238d8c8781518110612b5657612b566158fd565b60200260200101518c8881518110612b7057612b706158fd565b60200260200101516040518463ffffffff1660e01b8152600401612b9693929190615c33565b6020604051808303815f875af1158015612bb2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bd69190615b15565b9050805f03612c3b576001600160a01b038c165f90815260a2602052604081208b51612c3b92908d9088908110612c0f57612c0f6158fd565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9055565b50505080600101905061297e565b506001600160a01b0388165f908152609f60205260408120805491829190612c7083615c57565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f612cd6826111ea565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612d8c9260058501920190614c26565b5060c08201518051612da8916006840191602090910190614c89565b5050506001600160a01b038b165f90815260a360205260409020612dcc9082614217565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612e0093929190615c6f565b60405180910390a19a9950505050505050505050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f611a5d82612e6b612e6487613db4565b8690614222565b90614222565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c6910161269f565b6066545f90600190811603612efb5760405163840a48d560e01b815260040160405180910390fd5b5f5f612f0685611683565b915091505f612f165f8685612755565b6001600160a01b038781165f818152609a602052604080822080546001600160a01b031916948b16948517905551939450919290917fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d874330491a35f5b8351811015611cb25773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b0316848281518110612fa957612fa96158fd565b60200260200101516001600160a01b0316036131195760405163a3d75e0960e01b81526001600160a01b0388811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa158015613027573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061304b91906159bd565b90505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f878581518110613084576130846158fd565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f8201548152505090506130f88584815181106130d6576130d66158fd565b6020026020010151836001600160401b0316836138a99092919063ffffffff16565b85848151811061310a5761310a6158fd565b60200260200101818152505050505b6131728688868481518110613130576131306158fd565b60200260200101515f87868151811061314b5761314b6158fd565b6020026020010151878781518110613165576131656158fd565b602002602001015161325c565b600101612f70565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b0384160161324c5760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa158015613208573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061322c91906159bd565b90506132446001600160401b03848116908316613895565b915050610dd0565b506001600160401b031692915050565b805f0361327c57604051630a33bc6960e21b815260040160405180910390fd5b6001600160a01b038086165f90815260a2602090815260408083209388168352929052206132ac81858585614236565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f90879087906132ea90613db4565b6040516132f993929190615c33565b60405180910390a161330a8661107e565b15611cb2576001600160a01b038088165f908152609860209081526040808320938916835292905290812080548592906133459084906159ec565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c87878660405161338993929190615c33565b60405180910390a250505050505050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015613420573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119b59190615974565b60605f613450836142b1565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b613489614bcd565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b0390811682526001830154811682850152600283015416818501526003820154606082810191909152600483015463ffffffff1660808301526005830180548651818702810187019097528087529195929460a0860193929083018282801561353b57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161351d575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561359157602002820191905f5260205f20905b81548152602001906001019080831161357d575b50505050508152505091508160a00151516001600160401b038111156135b9576135b9614e2f565b6040519080825280602002602001820160405280156135e2578160200160208202803683370190505b5090505f7f000000000000000000000000000000000000000000000000000000000000000083608001516136169190615c99565b90505f4363ffffffff168263ffffffff161061364757613642845f015185602001518660a00151612755565b61365e565b61365e845f015185602001518660a00151856142d8565b90505f5b8460a0015151811015611358576136af8560c001518281518110613688576136886158fd565b60200260200101518383815181106136a2576136a26158fd565b6020026020010151614406565b8482815181106136c1576136c16158fd565b6020908102919091010152600101613662565b5f6136e28483856001614411565b611a5d9085615cb5565b6001600160a01b038085165f90815260a5602090815260408083209387168352929052908120819061371d9061446c565b90505f613783600161374f7f000000000000000000000000000000000000000000000000000000000000000043615cc8565b6137599190615cc8565b6001600160a01b03808a165f90815260a560209081526040808320938c1683529290522090614486565b90505f6137908284615cb5565b905061379d8187876144a2565b98975050505050505050565b6001600160a01b038085165f908152609860209081526040808320938616835292905290812080548392906137df908490615cb5565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051611afe93929190615c33565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461386e577f00000000000000000000000000000000000000000000000000000000000000006119b5565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b5f610dd08383670de0b6b3a76400006144c0565b5f611a5d826138c16138ba87613db4565b8690613895565b90613895565b6033546001600160a01b031633146111e85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161214e565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60a0840151518214613997576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b0316146139cd576040516316110d3560e21b815260040160405180910390fd5b5f6139d7856111ea565b5f818152609e602052604090205490915060ff16613a08576040516387c9d21960e01b815260040160405180910390fd5b60605f7f00000000000000000000000000000000000000000000000000000000000000008760800151613a3b9190615c99565b90508063ffffffff164363ffffffff1611613a69576040516378f67ae160e11b815260040160405180910390fd5b613a80875f015188602001518960a00151846142d8565b87516001600160a01b03165f90815260a360205260409020909250613aa69150836145a5565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff1916905590613afd6005830182614cc2565b613b0a600683015f614cc2565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a0090613b539084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a01519190931692613b8d918490612755565b90505f5b8860a0015151811015613da9575f613bb88a60a001518381518110611f0357611f036158fd565b90505f613bee8b60c001518481518110613bd457613bd46158fd565b60200260200101518785815181106136a2576136a26158fd565b9050805f03613bfe575050613da1565b8715613ccc57816001600160a01b0316632eae418c8c5f01518d60a001518681518110613c2d57613c2d6158fd565b60200260200101518d8d88818110613c4757613c476158fd565b9050602002016020810190613c5c919061515e565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b158015613cb1575f5ffd5b505af1158015613cc3573d5f5f3e3d5ffd5b50505050613d9e565b5f5f836001600160a01b03166350ff72258e5f01518f60a001518881518110613cf757613cf76158fd565b6020026020010151866040518463ffffffff1660e01b8152600401613d1e93929190615c33565b60408051808303815f875af1158015613d39573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d5d9190615ce4565b91509150613d9b878e5f01518f60a001518881518110613d7f57613d7f6158fd565b602002602001015185858b8b81518110613165576131656158fd565b50505b50505b600101613b91565b505050505050505050565b80515f9015613dc45781516119b5565b670de0b6b3a764000092915050565b606654606090600190600290811603613dff5760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613e5e86611683565b9150915081515f03613e725750505061402c565b81516001600160401b03811115613e8b57613e8b614e2f565b604051908082528060200260200182016040528015613eb4578160200160208202803683370190505b5094505f613ec3878585612755565b90505f5b8351811015614026576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613f4757613f476158fd565b6020026020010151835f81518110613f6157613f616158fd565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613f9357613f936158fd565b6020026020010151825f81518110613fad57613fad6158fd565b602002602001018181525050848481518110613fcb57613fcb6158fd565b6020026020010151815f81518110613fe557613fe56158fd565b602002602001018181525050613ffe8b898585856128a7565b8a8581518110614010576140106158fd565b6020908102919091010152505050600101613ec7565b50505050505b50919050565b6001600160a01b038084165f90815260996020526040902060010154168061405a5750610f25565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff161561409e57604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff1916600117905583015161234b9082906140e5908890889084908890610889565b855160208701516145b0565b60605f61411d7f0000000000000000000000000000000000000000000000000000000000000000613444565b9050805f81518110614131576141316158fd565b602001015160f81c60f81b8160018151811061414f5761414f6158fd565b016020908101516040516001600160f81b03199384169281019290925291909116602182015260220160405160208183030381529060405291505090565b60605f610dd083614602565b5f610dd06141a684613db4565b8390613895565b6001600160a01b038084165f90815260a56020908152604080832093861683529290529081206141dc9061446c565b9050610f25436141ec84846159ec565b6001600160a01b038088165f90815260a560209081526040808320938a16835292905220919061465b565b5f610dd08383614666565b5f610dd083670de0b6b3a7640000846144c0565b825f036142625760408051602081019091528454815261425b908290612e6b90613db4565b8455610f25565b6040805160208101909152845481525f9061427e9085846138a9565b90505f61428b84836159ec565b90505f6142a684612e6b61429f888a6159ec565b8590614222565b875550505050505050565b5f60ff8216601f8111156119b557604051632cd44ac360e21b815260040160405180910390fd5b60605f83516001600160401b038111156142f4576142f4614e2f565b60405190808252806020026020018201604052801561431d578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b815260040161437193929190615d06565b5f60405180830381865afa15801561438b573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526143b29190810190615ba4565b90505f5b85518110156143fa576143d588878381518110612850576128506158fd565b8382815181106143e7576143e76158fd565b60209081029190910101526001016143b6565b50909695505050505050565b5f610dd08383613895565b5f5f61441e8686866144c0565b9050600183600281111561443457614434615d3f565b14801561445057505f848061444b5761444b615d53565b868809115b15614463576144606001826159ec565b90505b95945050505050565b5f61447782826146b2565b6001600160e01b031692915050565b5f6144928383836146f7565b6001600160e01b03169392505050565b5f611a5d6144b08385615d67565b85906001600160401b0316613895565b5f80805f19858709858702925082811083820303915050805f036144f7578382816144ed576144ed615d53565b0492505050610dd0565b80841161453e5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b604482015260640161214e565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610dd08383614740565b428110156145d157604051630819bdcd60e01b815260040160405180910390fd5b6145e56001600160a01b0385168484614823565b610f2557604051638baa579f60e01b815260040160405180910390fd5b6060815f0180548060200260200160405190810160405280929190818152602001828054801561464f57602002820191905f5260205f20905b81548152602001906001019080831161463b575b50505050509050919050565b611106838383614877565b5f8181526001830160205260408120546146ab57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556119b5565b505f6119b5565b81545f9080156146ef576146d8846146cb600184615cb5565b5f91825260209091200190565b5464010000000090046001600160e01b0316611a5d565b509092915050565b82545f90816147088686838561497d565b905080156147365761471f866146cb600184615cb5565b5464010000000090046001600160e01b0316610907565b5091949350505050565b5f818152600183016020526040812054801561481a575f614762600183615cb5565b85549091505f9061477590600190615cb5565b90508181146147d4575f865f018281548110614793576147936158fd565b905f5260205f200154905080875f0184815481106147b3576147b36158fd565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806147e5576147e5615d86565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506119b5565b5f9150506119b5565b5f5f5f61483085856149d0565b90925090505f81600481111561484857614848615d3f565b1480156148665750856001600160a01b0316826001600160a01b0316145b806109075750610907868686614a0f565b8254801561492f575f61488f856146cb600185615cb5565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b0316602084015291925090851610156148e25760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff80861691160361492d5782614903866146cb600186615cb5565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b81831015611bda575f6149928484614af6565b5f8781526020902090915063ffffffff86169082015463ffffffff1611156149bc578092506149ca565b6149c78160016159ec565b93505b5061497f565b5f5f8251604103614a04576020830151604084015160608501515f1a6149f887828585614b10565b945094505050506120b1565b505f905060026120b1565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401614a37929190615d9a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051614a759190615db2565b5f60405180830381855afa9150503d805f8114614aad576040519150601f19603f3d011682016040523d82523d5f602084013e614ab2565b606091505b5091509150818015614ac657506020815110155b801561090757508051630b135d3f60e11b90614aeb9083016020908101908401615b15565b149695505050505050565b5f614b046002848418615dc8565b610dd0908484166159ec565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115614b4557505f90506003614bc4565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614b96573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116614bbe575f60019250925050614bc4565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f20908101928215614c79579160200282015b82811115614c7957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614c44565b50614c85929150614cd9565b5090565b828054828255905f5260205f20908101928215614c79579160200282015b82811115614c79578251825591602001919060010190614ca7565b5080545f8255905f5260205f20908101906124d891905b5b80821115614c85575f8155600101614cda565b6001600160a01b03811681146124d8575f5ffd5b80356122f781614ced565b5f5f5f5f5f60a08688031215614d20575f5ffd5b8535614d2b81614ced565b94506020860135614d3b81614ced565b93506040860135614d4b81614ced565b94979396509394606081013594506080013592915050565b5f5f83601f840112614d73575f5ffd5b5081356001600160401b03811115614d89575f5ffd5b6020830191508360208260051b85010111156120b1575f5ffd5b5f5f60208385031215614db4575f5ffd5b82356001600160401b03811115614dc9575f5ffd5b614dd585828601614d63565b90969095509350505050565b602080825282518282018190525f918401906040840190835b8181101561289c578351835260209384019390920191600101614dfa565b5f60208284031215614e28575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614e6557614e65614e2f565b60405290565b604080519081016001600160401b0381118282101715614e6557614e65614e2f565b604051601f8201601f191681016001600160401b0381118282101715614eb557614eb5614e2f565b604052919050565b5f6001600160401b03821115614ed557614ed5614e2f565b5060051b60200190565b5f82601f830112614eee575f5ffd5b8135614f01614efc82614ebd565b614e8d565b8082825260208201915060208360051b860101925085831115614f22575f5ffd5b602085015b83811015614f48578035614f3a81614ced565b835260209283019201614f27565b5095945050505050565b5f82601f830112614f61575f5ffd5b8135614f6f614efc82614ebd565b8082825260208201915060208360051b860101925085831115614f90575f5ffd5b602085015b83811015614f48578035835260209283019201614f95565b5f5f5f60608486031215614fbf575f5ffd5b8335614fca81614ced565b925060208401356001600160401b03811115614fe4575f5ffd5b614ff086828701614edf565b92505060408401356001600160401b0381111561500b575f5ffd5b61501786828701614f52565b9150509250925092565b5f8151808452602084019350602083015f5b82811015615051578151865260209586019590910190600101615033565b5093949350505050565b602081525f610dd06020830184615021565b803563ffffffff811681146122f7575f5ffd5b5f5f83601f840112615090575f5ffd5b5081356001600160401b038111156150a6575f5ffd5b6020830191508360208285010111156120b1575f5ffd5b5f5f5f5f606085870312156150d0575f5ffd5b84356150db81614ced565b93506150e96020860161506d565b925060408501356001600160401b03811115615103575f5ffd5b61510f87828801615080565b95989497509550505050565b5f5f5f5f6080858703121561512e575f5ffd5b843561513981614ced565b9350602085013561514981614ced565b93969395505050506040820135916060013590565b5f6020828403121561516e575f5ffd5b8135610dd081614ced565b5f5f6040838503121561518a575f5ffd5b823561519581614ced565b915060208301356151a581614ced565b809150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610dd060208301846151b0565b5f60e08284031215615200575f5ffd5b615208614e43565b905061521382614d01565b815261522160208301614d01565b602082015261523260408301614d01565b60408201526060828101359082015261524d6080830161506d565b608082015260a08201356001600160401b0381111561526a575f5ffd5b61527684828501614edf565b60a08301525060c08201356001600160401b03811115615294575f5ffd5b6152a084828501614f52565b60c08301525092915050565b5f602082840312156152bc575f5ffd5b81356001600160401b038111156152d1575f5ffd5b611a5d848285016151f0565b5f602082840312156152ed575f5ffd5b813560ff81168114610dd0575f5ffd5b5f8151808452602084019350602083015f5b828110156150515781516001600160a01b031686526020958601959091019060010161530f565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f916153819085018263ffffffff169052565b5060a082015160e060a085015261539b60e08501826152fd565b905060c083015184820360c08601526144638282615021565b604081525f6153c66040830185615336565b82810360208401526144638185615021565b5f82825180855260208501945060208160051b830101602085015f5b838110156143fa57601f19858403018852615410838351615021565b60209889019890935091909101906001016153f4565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b8281101561547d57605f19878603018452615468858351615336565b9450602093840193919091019060010161544c565b50505050828103602084015261446381856153d8565b6001600160401b03811681146124d8575f5ffd5b5f5f5f5f608085870312156154ba575f5ffd5b84356154c581614ced565b935060208501356154d581614ced565b925060408501356154e581615493565b915060608501356154f581615493565b939692955090935050565b5f5f5f60608486031215615512575f5ffd5b833561551d81614ced565b925060208401359150604084013561553481615493565b809150509250925092565b604081525f6153c660408301856152fd565b5f5f5f60408486031215615563575f5ffd5b833561556e81614ced565b925060208401356001600160401b03811115615588575f5ffd5b61559486828701615080565b9497909650939450505050565b5f5f604083850312156155b2575f5ffd5b82356155bd81614ced565b915060208301356001600160401b038111156155d7575f5ffd5b6155e385828601614edf565b9150509250929050565b5f5f5f5f5f5f60608789031215615602575f5ffd5b86356001600160401b03811115615617575f5ffd5b61562389828a01614d63565b90975095505060208701356001600160401b03811115615641575f5ffd5b61564d89828a01614d63565b90955093505060408701356001600160401b0381111561566b575f5ffd5b61567789828a01614d63565b979a9699509497509295939492505050565b602081525f610dd06020830184615336565b5f5f5f606084860312156156ad575f5ffd5b83356156b881614ced565b925060208401356001600160401b038111156156d2575f5ffd5b8401604081870312156156e3575f5ffd5b6156eb614e6b565b81356001600160401b03811115615700575f5ffd5b8201601f81018813615710575f5ffd5b80356001600160401b0381111561572957615729614e2f565b61573c601f8201601f1916602001614e8d565b818152896020838501011115615750575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f60408385031215615793575f5ffd5b823561579e81614ced565b946020939093013593505050565b604081525f6153c66040830185615021565b80151581146124d8575f5ffd5b5f5f5f5f606085870312156157de575f5ffd5b84356001600160401b038111156157f3575f5ffd5b850160e08188031215615804575f5ffd5b935060208501356001600160401b0381111561581e575f5ffd5b61582a87828801614d63565b90945092505060408501356154f5816157be565b5f5f6040838503121561584f575f5ffd5b82356001600160401b03811115615864575f5ffd5b8301601f81018513615874575f5ffd5b8035615882614efc82614ebd565b8082825260208201915060208360051b8501019250878311156158a3575f5ffd5b6020840193505b828410156158ce5783356158bd81614ced565b8252602093840193909101906158aa565b945050505060208301356001600160401b038111156155d7575f5ffd5b602081525f610dd060208301846153d8565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615925575f5ffd5b9190910192915050565b5f5f8335601e19843603018112615944575f5ffd5b8301803591506001600160401b0382111561595d575f5ffd5b6020019150600581901b36038213156120b1575f5ffd5b5f60208284031215615984575f5ffd5b8151610dd0816157be565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f602082840312156159cd575f5ffd5b8151610dd081615493565b634e487b7160e01b5f52601160045260245ffd5b808201808211156119b5576119b56159d8565b5f82601f830112615a0e575f5ffd5b8151615a1c614efc82614ebd565b8082825260208201915060208360051b860101925085831115615a3d575f5ffd5b602085015b83811015614f48578051835260209283019201615a42565b5f5f60408385031215615a6b575f5ffd5b82516001600160401b03811115615a80575f5ffd5b8301601f81018513615a90575f5ffd5b8051615a9e614efc82614ebd565b8082825260208201915060208360051b850101925087831115615abf575f5ffd5b6020840193505b82841015615aea578351615ad981614ced565b825260209384019390910190615ac6565b8095505050505060208301516001600160401b03811115615b09575f5ffd5b6155e3858286016159ff565b5f60208284031215615b25575f5ffd5b5051919050565b5f823560de19833603018112615925575f5ffd5b5f6119b536836151f0565b5f60208284031215615b5b575f5ffd5b8135610dd0816157be565b5f60208284031215615b76575f5ffd5b8151610dd081614ced565b6001600160a01b03831681526040602082018190525f90611a5d908301846152fd565b5f60208284031215615bb4575f5ffd5b81516001600160401b03811115615bc9575f5ffd5b8201601f81018413615bd9575f5ffd5b8051615be7614efc82614ebd565b8082825260208201915060208360051b850101925086831115615c08575f5ffd5b6020840193505b82841015610907578351615c2281615493565b825260209384019390910190615c0f565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60018201615c6857615c686159d8565b5060010190565b838152606060208201525f615c876060830185615336565b82810360408401526109078185615021565b63ffffffff81811683821601908111156119b5576119b56159d8565b818103818111156119b5576119b56159d8565b63ffffffff82811682821603908111156119b5576119b56159d8565b5f5f60408385031215615cf5575f5ffd5b505080516020909101519092909150565b6001600160a01b03841681526060602082018190525f90615d29908301856152fd565b905063ffffffff83166040830152949350505050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160401b0382811682821603908111156119b5576119b56159d8565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f611a5d60408301846151b0565b5f82518060208501845e5f920191825250919050565b5f82615de257634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220fa80a9b11d5e9e446656b4ef99b2c5826d772a4627d30bc5d90940c31eaa4f1164736f6c634300081b0033",
}
// DelegationManagerABI is the input ABI used to generate the binding from.
@@ -68,7 +68,7 @@ var DelegationManagerABI = DelegationManagerMetaData.ABI
var DelegationManagerBin = DelegationManagerMetaData.Bin
// DeployDelegationManager deploys a new Ethereum contract, binding an instance of DelegationManager to it.
-func DeployDelegationManager(auth *bind.TransactOpts, backend bind.ContractBackend, _strategyManager common.Address, _eigenPodManager common.Address, _allocationManager common.Address, _pauserRegistry common.Address, _permissionController common.Address, _MIN_WITHDRAWAL_DELAY uint32) (common.Address, *types.Transaction, *DelegationManager, error) {
+func DeployDelegationManager(auth *bind.TransactOpts, backend bind.ContractBackend, _strategyManager common.Address, _eigenPodManager common.Address, _allocationManager common.Address, _pauserRegistry common.Address, _permissionController common.Address, _MIN_WITHDRAWAL_DELAY uint32, _version string) (common.Address, *types.Transaction, *DelegationManager, error) {
parsed, err := DelegationManagerMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
@@ -77,7 +77,7 @@ func DeployDelegationManager(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(DelegationManagerBin), backend, _strategyManager, _eigenPodManager, _allocationManager, _pauserRegistry, _permissionController, _MIN_WITHDRAWAL_DELAY)
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(DelegationManagerBin), backend, _strategyManager, _eigenPodManager, _allocationManager, _pauserRegistry, _permissionController, _MIN_WITHDRAWAL_DELAY, _version)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -725,32 +725,46 @@ func (_DelegationManager *DelegationManagerCallerSession) GetOperatorsShares(ope
// GetQueuedWithdrawal is a free data retrieval call binding the contract method 0x5d975e88.
//
-// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]))
-func (_DelegationManager *DelegationManagerCaller) GetQueuedWithdrawal(opts *bind.CallOpts, withdrawalRoot [32]byte) (IDelegationManagerTypesWithdrawal, error) {
+// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, uint256[] shares)
+func (_DelegationManager *DelegationManagerCaller) GetQueuedWithdrawal(opts *bind.CallOpts, withdrawalRoot [32]byte) (struct {
+ Withdrawal IDelegationManagerTypesWithdrawal
+ Shares []*big.Int
+}, error) {
var out []interface{}
err := _DelegationManager.contract.Call(opts, &out, "getQueuedWithdrawal", withdrawalRoot)
+ outstruct := new(struct {
+ Withdrawal IDelegationManagerTypesWithdrawal
+ Shares []*big.Int
+ })
if err != nil {
- return *new(IDelegationManagerTypesWithdrawal), err
+ return *outstruct, err
}
- out0 := *abi.ConvertType(out[0], new(IDelegationManagerTypesWithdrawal)).(*IDelegationManagerTypesWithdrawal)
+ outstruct.Withdrawal = *abi.ConvertType(out[0], new(IDelegationManagerTypesWithdrawal)).(*IDelegationManagerTypesWithdrawal)
+ outstruct.Shares = *abi.ConvertType(out[1], new([]*big.Int)).(*[]*big.Int)
- return out0, err
+ return *outstruct, err
}
// GetQueuedWithdrawal is a free data retrieval call binding the contract method 0x5d975e88.
//
-// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]))
-func (_DelegationManager *DelegationManagerSession) GetQueuedWithdrawal(withdrawalRoot [32]byte) (IDelegationManagerTypesWithdrawal, error) {
+// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, uint256[] shares)
+func (_DelegationManager *DelegationManagerSession) GetQueuedWithdrawal(withdrawalRoot [32]byte) (struct {
+ Withdrawal IDelegationManagerTypesWithdrawal
+ Shares []*big.Int
+}, error) {
return _DelegationManager.Contract.GetQueuedWithdrawal(&_DelegationManager.CallOpts, withdrawalRoot)
}
// GetQueuedWithdrawal is a free data retrieval call binding the contract method 0x5d975e88.
//
-// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]))
-func (_DelegationManager *DelegationManagerCallerSession) GetQueuedWithdrawal(withdrawalRoot [32]byte) (IDelegationManagerTypesWithdrawal, error) {
+// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, uint256[] shares)
+func (_DelegationManager *DelegationManagerCallerSession) GetQueuedWithdrawal(withdrawalRoot [32]byte) (struct {
+ Withdrawal IDelegationManagerTypesWithdrawal
+ Shares []*big.Int
+}, error) {
return _DelegationManager.Contract.GetQueuedWithdrawal(&_DelegationManager.CallOpts, withdrawalRoot)
}
@@ -1216,6 +1230,37 @@ func (_DelegationManager *DelegationManagerCallerSession) PermissionController()
return _DelegationManager.Contract.PermissionController(&_DelegationManager.CallOpts)
}
+// QueuedWithdrawals is a free data retrieval call binding the contract method 0x99f5371b.
+//
+// Solidity: function queuedWithdrawals(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal)
+func (_DelegationManager *DelegationManagerCaller) QueuedWithdrawals(opts *bind.CallOpts, withdrawalRoot [32]byte) (IDelegationManagerTypesWithdrawal, error) {
+ var out []interface{}
+ err := _DelegationManager.contract.Call(opts, &out, "queuedWithdrawals", withdrawalRoot)
+
+ if err != nil {
+ return *new(IDelegationManagerTypesWithdrawal), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(IDelegationManagerTypesWithdrawal)).(*IDelegationManagerTypesWithdrawal)
+
+ return out0, err
+
+}
+
+// QueuedWithdrawals is a free data retrieval call binding the contract method 0x99f5371b.
+//
+// Solidity: function queuedWithdrawals(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal)
+func (_DelegationManager *DelegationManagerSession) QueuedWithdrawals(withdrawalRoot [32]byte) (IDelegationManagerTypesWithdrawal, error) {
+ return _DelegationManager.Contract.QueuedWithdrawals(&_DelegationManager.CallOpts, withdrawalRoot)
+}
+
+// QueuedWithdrawals is a free data retrieval call binding the contract method 0x99f5371b.
+//
+// Solidity: function queuedWithdrawals(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal)
+func (_DelegationManager *DelegationManagerCallerSession) QueuedWithdrawals(withdrawalRoot [32]byte) (IDelegationManagerTypesWithdrawal, error) {
+ return _DelegationManager.Contract.QueuedWithdrawals(&_DelegationManager.CallOpts, withdrawalRoot)
+}
+
// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38.
//
// Solidity: function strategyManager() view returns(address)
@@ -1247,6 +1292,37 @@ func (_DelegationManager *DelegationManagerCallerSession) StrategyManager() (com
return _DelegationManager.Contract.StrategyManager(&_DelegationManager.CallOpts)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_DelegationManager *DelegationManagerCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _DelegationManager.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_DelegationManager *DelegationManagerSession) Version() (string, error) {
+ return _DelegationManager.Contract.Version(&_DelegationManager.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_DelegationManager *DelegationManagerCallerSession) Version() (string, error) {
+ return _DelegationManager.Contract.Version(&_DelegationManager.CallOpts)
+}
+
// CompleteQueuedWithdrawal is a paid mutator transaction binding the contract method 0xe4cc3f90.
//
// Solidity: function completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, address[] tokens, bool receiveAsTokens) returns()
@@ -1313,21 +1389,21 @@ func (_DelegationManager *DelegationManagerTransactorSession) DecreaseDelegatedS
// DelegateTo is a paid mutator transaction binding the contract method 0xeea9064b.
//
// Solidity: function delegateTo(address operator, (bytes,uint256) approverSignatureAndExpiry, bytes32 approverSalt) returns()
-func (_DelegationManager *DelegationManagerTransactor) DelegateTo(opts *bind.TransactOpts, operator common.Address, approverSignatureAndExpiry ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_DelegationManager *DelegationManagerTransactor) DelegateTo(opts *bind.TransactOpts, operator common.Address, approverSignatureAndExpiry ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _DelegationManager.contract.Transact(opts, "delegateTo", operator, approverSignatureAndExpiry, approverSalt)
}
// DelegateTo is a paid mutator transaction binding the contract method 0xeea9064b.
//
// Solidity: function delegateTo(address operator, (bytes,uint256) approverSignatureAndExpiry, bytes32 approverSalt) returns()
-func (_DelegationManager *DelegationManagerSession) DelegateTo(operator common.Address, approverSignatureAndExpiry ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_DelegationManager *DelegationManagerSession) DelegateTo(operator common.Address, approverSignatureAndExpiry ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _DelegationManager.Contract.DelegateTo(&_DelegationManager.TransactOpts, operator, approverSignatureAndExpiry, approverSalt)
}
// DelegateTo is a paid mutator transaction binding the contract method 0xeea9064b.
//
// Solidity: function delegateTo(address operator, (bytes,uint256) approverSignatureAndExpiry, bytes32 approverSalt) returns()
-func (_DelegationManager *DelegationManagerTransactorSession) DelegateTo(operator common.Address, approverSignatureAndExpiry ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_DelegationManager *DelegationManagerTransactorSession) DelegateTo(operator common.Address, approverSignatureAndExpiry ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _DelegationManager.Contract.DelegateTo(&_DelegationManager.TransactOpts, operator, approverSignatureAndExpiry, approverSalt)
}
@@ -1460,21 +1536,21 @@ func (_DelegationManager *DelegationManagerTransactorSession) QueueWithdrawals(p
// Redelegate is a paid mutator transaction binding the contract method 0xa33a3433.
//
// Solidity: function redelegate(address newOperator, (bytes,uint256) newOperatorApproverSig, bytes32 approverSalt) returns(bytes32[] withdrawalRoots)
-func (_DelegationManager *DelegationManagerTransactor) Redelegate(opts *bind.TransactOpts, newOperator common.Address, newOperatorApproverSig ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_DelegationManager *DelegationManagerTransactor) Redelegate(opts *bind.TransactOpts, newOperator common.Address, newOperatorApproverSig ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _DelegationManager.contract.Transact(opts, "redelegate", newOperator, newOperatorApproverSig, approverSalt)
}
// Redelegate is a paid mutator transaction binding the contract method 0xa33a3433.
//
// Solidity: function redelegate(address newOperator, (bytes,uint256) newOperatorApproverSig, bytes32 approverSalt) returns(bytes32[] withdrawalRoots)
-func (_DelegationManager *DelegationManagerSession) Redelegate(newOperator common.Address, newOperatorApproverSig ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_DelegationManager *DelegationManagerSession) Redelegate(newOperator common.Address, newOperatorApproverSig ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _DelegationManager.Contract.Redelegate(&_DelegationManager.TransactOpts, newOperator, newOperatorApproverSig, approverSalt)
}
// Redelegate is a paid mutator transaction binding the contract method 0xa33a3433.
//
// Solidity: function redelegate(address newOperator, (bytes,uint256) newOperatorApproverSig, bytes32 approverSalt) returns(bytes32[] withdrawalRoots)
-func (_DelegationManager *DelegationManagerTransactorSession) Redelegate(newOperator common.Address, newOperatorApproverSig ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_DelegationManager *DelegationManagerTransactorSession) Redelegate(newOperator common.Address, newOperatorApproverSig ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _DelegationManager.Contract.Redelegate(&_DelegationManager.TransactOpts, newOperator, newOperatorApproverSig, approverSalt)
}
@@ -2624,6 +2700,152 @@ func (_DelegationManager *DelegationManagerFilterer) ParseOperatorSharesIncrease
return event, nil
}
+// DelegationManagerOperatorSharesSlashedIterator is returned from FilterOperatorSharesSlashed and is used to iterate over the raw logs and unpacked data for OperatorSharesSlashed events raised by the DelegationManager contract.
+type DelegationManagerOperatorSharesSlashedIterator struct {
+ Event *DelegationManagerOperatorSharesSlashed // Event containing the contract specifics and raw log
+
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
+
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *DelegationManagerOperatorSharesSlashedIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
+ }
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(DelegationManagerOperatorSharesSlashed)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(DelegationManagerOperatorSharesSlashed)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *DelegationManagerOperatorSharesSlashedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DelegationManagerOperatorSharesSlashedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DelegationManagerOperatorSharesSlashed represents a OperatorSharesSlashed event raised by the DelegationManager contract.
+type DelegationManagerOperatorSharesSlashed struct {
+ Operator common.Address
+ Strategy common.Address
+ TotalSlashedShares *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterOperatorSharesSlashed is a free log retrieval operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
+//
+// Solidity: event OperatorSharesSlashed(address indexed operator, address strategy, uint256 totalSlashedShares)
+func (_DelegationManager *DelegationManagerFilterer) FilterOperatorSharesSlashed(opts *bind.FilterOpts, operator []common.Address) (*DelegationManagerOperatorSharesSlashedIterator, error) {
+
+ var operatorRule []interface{}
+ for _, operatorItem := range operator {
+ operatorRule = append(operatorRule, operatorItem)
+ }
+
+ logs, sub, err := _DelegationManager.contract.FilterLogs(opts, "OperatorSharesSlashed", operatorRule)
+ if err != nil {
+ return nil, err
+ }
+ return &DelegationManagerOperatorSharesSlashedIterator{contract: _DelegationManager.contract, event: "OperatorSharesSlashed", logs: logs, sub: sub}, nil
+}
+
+// WatchOperatorSharesSlashed is a free log subscription operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
+//
+// Solidity: event OperatorSharesSlashed(address indexed operator, address strategy, uint256 totalSlashedShares)
+func (_DelegationManager *DelegationManagerFilterer) WatchOperatorSharesSlashed(opts *bind.WatchOpts, sink chan<- *DelegationManagerOperatorSharesSlashed, operator []common.Address) (event.Subscription, error) {
+
+ var operatorRule []interface{}
+ for _, operatorItem := range operator {
+ operatorRule = append(operatorRule, operatorItem)
+ }
+
+ logs, sub, err := _DelegationManager.contract.WatchLogs(opts, "OperatorSharesSlashed", operatorRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(DelegationManagerOperatorSharesSlashed)
+ if err := _DelegationManager.contract.UnpackLog(event, "OperatorSharesSlashed", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+// ParseOperatorSharesSlashed is a log parse operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
+//
+// Solidity: event OperatorSharesSlashed(address indexed operator, address strategy, uint256 totalSlashedShares)
+func (_DelegationManager *DelegationManagerFilterer) ParseOperatorSharesSlashed(log types.Log) (*DelegationManagerOperatorSharesSlashed, error) {
+ event := new(DelegationManagerOperatorSharesSlashed)
+ if err := _DelegationManager.contract.UnpackLog(event, "OperatorSharesSlashed", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
// DelegationManagerOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the DelegationManager contract.
type DelegationManagerOwnershipTransferredIterator struct {
Event *DelegationManagerOwnershipTransferred // Event containing the contract specifics and raw log
diff --git a/pkg/bindings/DelegationManagerStorage/binding.go b/pkg/bindings/DelegationManagerStorage/binding.go
index 82f7a6fdf4..e915ae2bed 100644
--- a/pkg/bindings/DelegationManagerStorage/binding.go
+++ b/pkg/bindings/DelegationManagerStorage/binding.go
@@ -47,15 +47,15 @@ type IDelegationManagerTypesWithdrawal struct {
ScaledShares []*big.Int
}
-// ISignatureUtilsSignatureWithExpiry is an auto generated low-level Go binding around an user-defined struct.
-type ISignatureUtilsSignatureWithExpiry struct {
+// ISignatureUtilsMixinTypesSignatureWithExpiry is an auto generated low-level Go binding around an user-defined struct.
+type ISignatureUtilsMixinTypesSignatureWithExpiry struct {
Signature []byte
Expiry *big.Int
}
// DelegationManagerStorageMetaData contains all meta data concerning the DelegationManagerStorage contract.
var DelegationManagerStorageMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertToDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"totalQueued\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"curDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"beaconChainSlashingFactorDecrease\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"spent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositScalingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDepositedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorsShares\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawalRoots\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawals\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashableSharesInQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addedShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"pending\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"__deprecated_withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"redelegate\",\"inputs\":[{\"name\":\"newOperator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newOperatorApproverSig\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"initDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allocationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"DelegationApproverUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositScalingFactorUpdated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"newDepositScalingFactor\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"sharesToWithdraw\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FullySlashed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAllocationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManagerOrEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalNotQueued\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotCaller\",\"inputs\":[]}]",
+ ABI: "[{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertToDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"totalQueued\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"curDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"beaconChainSlashingFactorDecrease\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtilsMixinTypes.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"spent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositScalingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDepositedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorsShares\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawalRoots\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawals\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashableSharesInQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addedShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"pending\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"__deprecated_withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"redelegate\",\"inputs\":[{\"name\":\"newOperator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newOperatorApproverSig\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtilsMixinTypes.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"initDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allocationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"operator\",\"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\":\"DelegationApproverUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositScalingFactorUpdated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"newDepositScalingFactor\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"totalSlashedShares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"sharesToWithdraw\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FullySlashed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAllocationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManagerOrEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalNotQueued\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotCaller\",\"inputs\":[]}]",
}
// DelegationManagerStorageABI is the input ABI used to generate the binding from.
@@ -545,6 +545,37 @@ func (_DelegationManagerStorage *DelegationManagerStorageCallerSession) DepositS
return _DelegationManagerStorage.Contract.DepositScalingFactor(&_DelegationManagerStorage.CallOpts, staker, strategy)
}
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_DelegationManagerStorage *DelegationManagerStorageCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error) {
+ var out []interface{}
+ err := _DelegationManagerStorage.contract.Call(opts, &out, "domainSeparator")
+
+ if err != nil {
+ return *new([32]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+ return out0, err
+
+}
+
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_DelegationManagerStorage *DelegationManagerStorageSession) DomainSeparator() ([32]byte, error) {
+ return _DelegationManagerStorage.Contract.DomainSeparator(&_DelegationManagerStorage.CallOpts)
+}
+
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_DelegationManagerStorage *DelegationManagerStorageCallerSession) DomainSeparator() ([32]byte, error) {
+ return _DelegationManagerStorage.Contract.DomainSeparator(&_DelegationManagerStorage.CallOpts)
+}
+
// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda.
//
// Solidity: function eigenPodManager() view returns(address)
@@ -672,32 +703,46 @@ func (_DelegationManagerStorage *DelegationManagerStorageCallerSession) GetOpera
// GetQueuedWithdrawal is a free data retrieval call binding the contract method 0x5d975e88.
//
-// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]))
-func (_DelegationManagerStorage *DelegationManagerStorageCaller) GetQueuedWithdrawal(opts *bind.CallOpts, withdrawalRoot [32]byte) (IDelegationManagerTypesWithdrawal, error) {
+// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, uint256[] shares)
+func (_DelegationManagerStorage *DelegationManagerStorageCaller) GetQueuedWithdrawal(opts *bind.CallOpts, withdrawalRoot [32]byte) (struct {
+ Withdrawal IDelegationManagerTypesWithdrawal
+ Shares []*big.Int
+}, error) {
var out []interface{}
err := _DelegationManagerStorage.contract.Call(opts, &out, "getQueuedWithdrawal", withdrawalRoot)
+ outstruct := new(struct {
+ Withdrawal IDelegationManagerTypesWithdrawal
+ Shares []*big.Int
+ })
if err != nil {
- return *new(IDelegationManagerTypesWithdrawal), err
+ return *outstruct, err
}
- out0 := *abi.ConvertType(out[0], new(IDelegationManagerTypesWithdrawal)).(*IDelegationManagerTypesWithdrawal)
+ outstruct.Withdrawal = *abi.ConvertType(out[0], new(IDelegationManagerTypesWithdrawal)).(*IDelegationManagerTypesWithdrawal)
+ outstruct.Shares = *abi.ConvertType(out[1], new([]*big.Int)).(*[]*big.Int)
- return out0, err
+ return *outstruct, err
}
// GetQueuedWithdrawal is a free data retrieval call binding the contract method 0x5d975e88.
//
-// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]))
-func (_DelegationManagerStorage *DelegationManagerStorageSession) GetQueuedWithdrawal(withdrawalRoot [32]byte) (IDelegationManagerTypesWithdrawal, error) {
+// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, uint256[] shares)
+func (_DelegationManagerStorage *DelegationManagerStorageSession) GetQueuedWithdrawal(withdrawalRoot [32]byte) (struct {
+ Withdrawal IDelegationManagerTypesWithdrawal
+ Shares []*big.Int
+}, error) {
return _DelegationManagerStorage.Contract.GetQueuedWithdrawal(&_DelegationManagerStorage.CallOpts, withdrawalRoot)
}
// GetQueuedWithdrawal is a free data retrieval call binding the contract method 0x5d975e88.
//
-// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]))
-func (_DelegationManagerStorage *DelegationManagerStorageCallerSession) GetQueuedWithdrawal(withdrawalRoot [32]byte) (IDelegationManagerTypesWithdrawal, error) {
+// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, uint256[] shares)
+func (_DelegationManagerStorage *DelegationManagerStorageCallerSession) GetQueuedWithdrawal(withdrawalRoot [32]byte) (struct {
+ Withdrawal IDelegationManagerTypesWithdrawal
+ Shares []*big.Int
+}, error) {
return _DelegationManagerStorage.Contract.GetQueuedWithdrawal(&_DelegationManagerStorage.CallOpts, withdrawalRoot)
}
@@ -1039,6 +1084,37 @@ func (_DelegationManagerStorage *DelegationManagerStorageCallerSession) Strategy
return _DelegationManagerStorage.Contract.StrategyManager(&_DelegationManagerStorage.CallOpts)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_DelegationManagerStorage *DelegationManagerStorageCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _DelegationManagerStorage.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_DelegationManagerStorage *DelegationManagerStorageSession) Version() (string, error) {
+ return _DelegationManagerStorage.Contract.Version(&_DelegationManagerStorage.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_DelegationManagerStorage *DelegationManagerStorageCallerSession) Version() (string, error) {
+ return _DelegationManagerStorage.Contract.Version(&_DelegationManagerStorage.CallOpts)
+}
+
// CompleteQueuedWithdrawal is a paid mutator transaction binding the contract method 0xe4cc3f90.
//
// Solidity: function completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, address[] tokens, bool receiveAsTokens) returns()
@@ -1105,21 +1181,21 @@ func (_DelegationManagerStorage *DelegationManagerStorageTransactorSession) Decr
// DelegateTo is a paid mutator transaction binding the contract method 0xeea9064b.
//
// Solidity: function delegateTo(address operator, (bytes,uint256) approverSignatureAndExpiry, bytes32 approverSalt) returns()
-func (_DelegationManagerStorage *DelegationManagerStorageTransactor) DelegateTo(opts *bind.TransactOpts, operator common.Address, approverSignatureAndExpiry ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_DelegationManagerStorage *DelegationManagerStorageTransactor) DelegateTo(opts *bind.TransactOpts, operator common.Address, approverSignatureAndExpiry ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _DelegationManagerStorage.contract.Transact(opts, "delegateTo", operator, approverSignatureAndExpiry, approverSalt)
}
// DelegateTo is a paid mutator transaction binding the contract method 0xeea9064b.
//
// Solidity: function delegateTo(address operator, (bytes,uint256) approverSignatureAndExpiry, bytes32 approverSalt) returns()
-func (_DelegationManagerStorage *DelegationManagerStorageSession) DelegateTo(operator common.Address, approverSignatureAndExpiry ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_DelegationManagerStorage *DelegationManagerStorageSession) DelegateTo(operator common.Address, approverSignatureAndExpiry ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _DelegationManagerStorage.Contract.DelegateTo(&_DelegationManagerStorage.TransactOpts, operator, approverSignatureAndExpiry, approverSalt)
}
// DelegateTo is a paid mutator transaction binding the contract method 0xeea9064b.
//
// Solidity: function delegateTo(address operator, (bytes,uint256) approverSignatureAndExpiry, bytes32 approverSalt) returns()
-func (_DelegationManagerStorage *DelegationManagerStorageTransactorSession) DelegateTo(operator common.Address, approverSignatureAndExpiry ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_DelegationManagerStorage *DelegationManagerStorageTransactorSession) DelegateTo(operator common.Address, approverSignatureAndExpiry ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _DelegationManagerStorage.Contract.DelegateTo(&_DelegationManagerStorage.TransactOpts, operator, approverSignatureAndExpiry, approverSalt)
}
@@ -1210,21 +1286,21 @@ func (_DelegationManagerStorage *DelegationManagerStorageTransactorSession) Queu
// Redelegate is a paid mutator transaction binding the contract method 0xa33a3433.
//
// Solidity: function redelegate(address newOperator, (bytes,uint256) newOperatorApproverSig, bytes32 approverSalt) returns(bytes32[] withdrawalRoots)
-func (_DelegationManagerStorage *DelegationManagerStorageTransactor) Redelegate(opts *bind.TransactOpts, newOperator common.Address, newOperatorApproverSig ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_DelegationManagerStorage *DelegationManagerStorageTransactor) Redelegate(opts *bind.TransactOpts, newOperator common.Address, newOperatorApproverSig ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _DelegationManagerStorage.contract.Transact(opts, "redelegate", newOperator, newOperatorApproverSig, approverSalt)
}
// Redelegate is a paid mutator transaction binding the contract method 0xa33a3433.
//
// Solidity: function redelegate(address newOperator, (bytes,uint256) newOperatorApproverSig, bytes32 approverSalt) returns(bytes32[] withdrawalRoots)
-func (_DelegationManagerStorage *DelegationManagerStorageSession) Redelegate(newOperator common.Address, newOperatorApproverSig ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_DelegationManagerStorage *DelegationManagerStorageSession) Redelegate(newOperator common.Address, newOperatorApproverSig ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _DelegationManagerStorage.Contract.Redelegate(&_DelegationManagerStorage.TransactOpts, newOperator, newOperatorApproverSig, approverSalt)
}
// Redelegate is a paid mutator transaction binding the contract method 0xa33a3433.
//
// Solidity: function redelegate(address newOperator, (bytes,uint256) newOperatorApproverSig, bytes32 approverSalt) returns(bytes32[] withdrawalRoots)
-func (_DelegationManagerStorage *DelegationManagerStorageTransactorSession) Redelegate(newOperator common.Address, newOperatorApproverSig ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_DelegationManagerStorage *DelegationManagerStorageTransactorSession) Redelegate(newOperator common.Address, newOperatorApproverSig ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _DelegationManagerStorage.Contract.Redelegate(&_DelegationManagerStorage.TransactOpts, newOperator, newOperatorApproverSig, approverSalt)
}
@@ -2177,6 +2253,152 @@ func (_DelegationManagerStorage *DelegationManagerStorageFilterer) ParseOperator
return event, nil
}
+// DelegationManagerStorageOperatorSharesSlashedIterator is returned from FilterOperatorSharesSlashed and is used to iterate over the raw logs and unpacked data for OperatorSharesSlashed events raised by the DelegationManagerStorage contract.
+type DelegationManagerStorageOperatorSharesSlashedIterator struct {
+ Event *DelegationManagerStorageOperatorSharesSlashed // Event containing the contract specifics and raw log
+
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
+
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *DelegationManagerStorageOperatorSharesSlashedIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
+ }
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(DelegationManagerStorageOperatorSharesSlashed)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(DelegationManagerStorageOperatorSharesSlashed)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *DelegationManagerStorageOperatorSharesSlashedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DelegationManagerStorageOperatorSharesSlashedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DelegationManagerStorageOperatorSharesSlashed represents a OperatorSharesSlashed event raised by the DelegationManagerStorage contract.
+type DelegationManagerStorageOperatorSharesSlashed struct {
+ Operator common.Address
+ Strategy common.Address
+ TotalSlashedShares *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterOperatorSharesSlashed is a free log retrieval operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
+//
+// Solidity: event OperatorSharesSlashed(address indexed operator, address strategy, uint256 totalSlashedShares)
+func (_DelegationManagerStorage *DelegationManagerStorageFilterer) FilterOperatorSharesSlashed(opts *bind.FilterOpts, operator []common.Address) (*DelegationManagerStorageOperatorSharesSlashedIterator, error) {
+
+ var operatorRule []interface{}
+ for _, operatorItem := range operator {
+ operatorRule = append(operatorRule, operatorItem)
+ }
+
+ logs, sub, err := _DelegationManagerStorage.contract.FilterLogs(opts, "OperatorSharesSlashed", operatorRule)
+ if err != nil {
+ return nil, err
+ }
+ return &DelegationManagerStorageOperatorSharesSlashedIterator{contract: _DelegationManagerStorage.contract, event: "OperatorSharesSlashed", logs: logs, sub: sub}, nil
+}
+
+// WatchOperatorSharesSlashed is a free log subscription operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
+//
+// Solidity: event OperatorSharesSlashed(address indexed operator, address strategy, uint256 totalSlashedShares)
+func (_DelegationManagerStorage *DelegationManagerStorageFilterer) WatchOperatorSharesSlashed(opts *bind.WatchOpts, sink chan<- *DelegationManagerStorageOperatorSharesSlashed, operator []common.Address) (event.Subscription, error) {
+
+ var operatorRule []interface{}
+ for _, operatorItem := range operator {
+ operatorRule = append(operatorRule, operatorItem)
+ }
+
+ logs, sub, err := _DelegationManagerStorage.contract.WatchLogs(opts, "OperatorSharesSlashed", operatorRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(DelegationManagerStorageOperatorSharesSlashed)
+ if err := _DelegationManagerStorage.contract.UnpackLog(event, "OperatorSharesSlashed", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+// ParseOperatorSharesSlashed is a log parse operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
+//
+// Solidity: event OperatorSharesSlashed(address indexed operator, address strategy, uint256 totalSlashedShares)
+func (_DelegationManagerStorage *DelegationManagerStorageFilterer) ParseOperatorSharesSlashed(log types.Log) (*DelegationManagerStorageOperatorSharesSlashed, error) {
+ event := new(DelegationManagerStorageOperatorSharesSlashed)
+ if err := _DelegationManagerStorage.contract.UnpackLog(event, "OperatorSharesSlashed", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
// DelegationManagerStorageSlashingWithdrawalCompletedIterator is returned from FilterSlashingWithdrawalCompleted and is used to iterate over the raw logs and unpacked data for SlashingWithdrawalCompleted events raised by the DelegationManagerStorage contract.
type DelegationManagerStorageSlashingWithdrawalCompletedIterator struct {
Event *DelegationManagerStorageSlashingWithdrawalCompleted // Event containing the contract specifics and raw log
diff --git a/pkg/bindings/Eigen/binding.go b/pkg/bindings/Eigen/binding.go
index 093f64d84c..eead391618 100644
--- a/pkg/bindings/Eigen/binding.go
+++ b/pkg/bindings/Eigen/binding.go
@@ -38,7 +38,7 @@ type ERC20VotesUpgradeableCheckpoint struct {
// EigenMetaData contains all meta data concerning the Eigen contract.
var EigenMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedFrom\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bEIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"minters\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"mintingAllowances\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"mintAllowedAfters\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mintAllowedAfter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mintingAllowance\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"multisend\",\"inputs\":[{\"name\":\"receivers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferRestrictionsDisabledAfter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unwrap\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"wrap\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Mint\",\"inputs\":[{\"name\":\"minter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferRestrictionsDisabled\",\"inputs\":[],\"anonymous\":false}]",
- Bin: "0x60a060405234801561000f575f5ffd5b5060405161352938038061352983398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b6080516133ca61015f5f395f81816103410152818161083e0152818161149e015261158a01526133ca5ff3fe608060405234801561000f575f5ffd5b5060043610610255575f3560e01c806381b9716111610140578063a9059cbb116100bf578063dd62ed3e11610084578063dd62ed3e146105b9578063de0e9a3e146105cc578063ea598cb0146105df578063eb415f45146105f2578063f1127ed8146105fa578063f2fde38b14610637575f5ffd5b8063a9059cbb1461055a578063aad41a411461056d578063b8c2559414610580578063c3cda52014610593578063d505accf146105a6575f5ffd5b806395d89b411161010557806395d89b411461050f5780639ab24eb0146105175780639aec4bae1461052a578063a457c2d714610534578063a7d1195d14610547575f5ffd5b806381b971611461049157806384b0196e146104b15780638da5cb5b146104cc5780638e539e8c146104dd57806391ddadf4146104f0575f5ffd5b80633a46b1a8116101d75780635c19a95c1161019c5780635c19a95c146103f05780636fcfff451461040357806370a082311461042b578063715018a61461045357806378aa33ba1461045b5780637ecebe001461047e575f5ffd5b80633a46b1a8146103295780633f4da4c61461033c5780634bf5d7e91461037b57806353957125146103a5578063587cde1e146103c5575f5ffd5b80631ffacdef1161021d5780631ffacdef146102d957806323b872dd146102ec578063313ce567146102ff5780633644e5151461030e5780633950935114610316575f5ffd5b80630455e6941461025957806306fdde0314610291578063095ea7b3146102a65780631249c58b146102b957806318160ddd146102c3575b5f5ffd5b61027c610267366004612c01565b6101336020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61029961064a565b6040516102889190612c48565b61027c6102b4366004612c5a565b6106da565b6102c16106f3565b005b6102cb61083b565b604051908152602001610288565b6102c16102e7366004612c8f565b6108c1565b61027c6102fa366004612cc4565b610929565b60405160128152602001610288565b6102cb61094c565b61027c610324366004612c5a565b610955565b6102cb610337366004612c5a565b610976565b6103637f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610288565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610299565b6102cb6103b3366004612c01565b6101306020525f908152604090205481565b6103636103d3366004612c01565b6001600160a01b039081165f90815260fe60205260409020541690565b6102c16103fe366004612c01565b6109f9565b610416610411366004612c01565b610a06565b60405163ffffffff9091168152602001610288565b6102cb610439366004612c01565b6001600160a01b03165f9081526065602052604090205490565b6102c1610a27565b61027c610469366004612c01565b6101346020525f908152604090205460ff1681565b6102cb61048c366004612c01565b610a3a565b6102cb61049f366004612c01565b6101316020525f908152604090205481565b6104b9610a57565b6040516102889796959493929190612cfe565b6033546001600160a01b0316610363565b6102cb6104eb366004612d94565b610af0565b6104f8610b57565b60405165ffffffffffff9091168152602001610288565b610299610b61565b6102cb610525366004612c01565b610b70565b6102cb6101325481565b61027c610542366004612c5a565b610bed565b6102c1610555366004612e73565b610c67565b61027c610568366004612c5a565b61107b565b6102c161057b366004612fb8565b611088565b6102c161058e366004612c8f565b611158565b6102c16105a1366004613034565b6111b8565b6102c16105b4366004613088565b6112ed565b6102cb6105c73660046130ee565b61144e565b6102c16105da366004612d94565b611478565b6102c16105ed366004612d94565b611568565b6102c161165d565b61060d61060836600461311f565b611724565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610288565b6102c1610645366004612c01565b6117a5565b60606068805461065990613151565b80601f016020809104026020016040519081016040528092919081815260200182805461068590613151565b80156106d05780601f106106a7576101008083540402835291602001916106d0565b820191905f5260205f20905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b5f336106e781858561181b565b60019150505b92915050565b335f908152610131602052604090205461076c5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b335f908152610130602052604090205442116107e45760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610763565b335f81815261013160205260408120805491905590610803908261193e565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610898573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bc9190613183565b905090565b6108c96119d4565b6001600160a01b0382165f8181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f33610936858285611a2e565b610941858585611aa0565b506001949350505050565b5f6108bc611c5a565b5f336106e7818585610967838361144e565b61097191906131ae565b61181b565b5f61097f610b57565b65ffffffffffff1682106109d15760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6001600160a01b0383165f90815260ff602052604090206109f29083611c63565b9392505050565b610a033382611d44565b50565b6001600160a01b0381165f90815260ff60205260408120546106ed90611dbd565b610a2f6119d4565b610a385f611e25565b565b6001600160a01b0381165f90815260cb60205260408120546106ed565b5f6060805f5f5f60606097545f5f1b148015610a735750609854155b610ab75760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610763565b610abf611e76565b610ac7611e85565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f610af9610b57565b65ffffffffffff168210610b4b5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6106ed61010083611c63565b5f6108bc42611e94565b60606069805461065990613151565b6001600160a01b0381165f90815260ff60205260408120548015610bdb576001600160a01b0383165f90815260ff6020526040902080545f198301908110610bba57610bba6131c1565b5f9182526020909120015464010000000090046001600160e01b0316610bdd565b5f5b6001600160e01b03169392505050565b5f3381610bfa828661144e565b905083811015610c5a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610763565b610941828686840361181b565b5f54610100900460ff1615808015610c8557505f54600160ff909116105b80610c9e5750303b158015610c9e57505f5460ff166001145b610d015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610763565b5f805460ff191660011790558015610d22575f805461ff0019166101001790555b610d2a611efa565b610d6e6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250611f28565b610d7785611e25565b610d9d6040518060400160405280600581526020016422a4a3a2a760d91b815250611f5c565b8251845114610e245760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b8151845114610eab5760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b5f5b845181101561102857838181518110610ec857610ec86131c1565b60200260200101516101315f878481518110610ee657610ee66131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550828181518110610f2357610f236131c1565b60200260200101516101305f878481518110610f4157610f416131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f208190555060016101335f878481518110610f8457610f846131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550848181518110610fd357610fd36131c1565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051611018911515815260200190565b60405180910390a2600101610ead565b505f19610132558015611074575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b5f336106e7818585611aa0565b8281146110fd5760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610763565b5f5b83811015611074576111503386868481811061111d5761111d6131c1565b90506020020160208101906111329190612c01565b858585818110611144576111446131c1565b90506020020135611aa0565b6001016110ff565b6111606119d4565b6001600160a01b0382165f8181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b910161091d565b834211156112085760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610763565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90611281906112799060a00160405160208183030381529060405280519060200120611fa5565b858585611fd1565b905061128c81611ff7565b86146112da5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610763565b6112e48188611d44565b50505050505050565b8342111561133d5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610763565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861136b8c611ff7565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6113c582611fa5565b90505f6113d482878787611fd1565b9050896001600160a01b0316816001600160a01b0316146114375760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610763565b6114428a8a8a61181b565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611482338261201e565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156114ec573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151091906131d5565b610a035760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610763565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af11580156115d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fc91906131d5565b6116535760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610763565b610a03338261193e565b6116656119d4565b5f1961013254146116f45760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610763565b5f6101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611766576117666131c1565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6117ad6119d4565b6001600160a01b0381166118125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610763565b610a0381611e25565b6001600160a01b03831661187d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610763565b6001600160a01b0382166118de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610763565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6119488282612037565b6001600160e01b0361195861083b565b11156119bf5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610763565b6119ce61010061210883612113565b50505050565b6033546001600160a01b03163314610a385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b5f611a39848461144e565b90505f1981146119ce5781811015611a935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610763565b6119ce848484840361181b565b6001600160a01b038316611b045760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610763565b6001600160a01b038216611b665760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610763565b611b7183838361227f565b6001600160a01b0383165f9081526065602052604090205481811015611be85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610763565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c479086815260200190565b60405180910390a36119ce848484612363565b5f6108bc612394565b81545f9081816005811115611cba575f611c7c84612407565b611c8690856131f0565b5f88815260209020909150869082015463ffffffff161115611caa57809150611cb8565b611cb58160016131ae565b92505b505b80821015611d05575f611ccd83836124eb565b5f88815260209020909150869082015463ffffffff161115611cf157809150611cff565b611cfc8160016131ae565b92505b50611cba565b8015611d2f575f8681526020902081015f19015464010000000090046001600160e01b0316611d31565b5f5b6001600160e01b03169695505050505050565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46119ce828483612505565b5f63ffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610763565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461065990613151565b6060609a805461065990613151565b5f65ffffffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610763565b5f54610100900460ff16611f205760405162461bcd60e51b815260040161076390613203565b610a3861263f565b5f54610100900460ff16611f4e5760405162461bcd60e51b815260040161076390613203565b611f58828261266e565b5050565b5f54610100900460ff16611f825760405162461bcd60e51b815260040161076390613203565b610a0381604051806040016040528060018152602001603160f81b8152506126ad565b5f6106ed611fb1611c5a565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f611fe0878787876126fa565b91509150611fed816127b7565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b6120288282612900565b6119ce610100612a4383612113565b6001600160a01b03821661208d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610763565b6120985f838361227f565b8060675f8282546120a991906131ae565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f585f8383612363565b5f6109f282846131ae565b82545f90819081811561215d575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612171565b604080518082019091525f80825260208201525b905080602001516001600160e01b0316935061219184868863ffffffff16565b92505f821180156121b957506121a5610b57565b65ffffffffffff16815f015163ffffffff16145b156121fc576121c783612a4e565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612275565b866040518060400160405280612220612213610b57565b65ffffffffffff16611dbd565b63ffffffff16815260200161223486612a4e565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b61013254421161235e576001600160a01b03831615806122a657506001600160a01b038216155b806122c957506001600160a01b0383165f908152610133602052604090205460ff165b806122ec57506001600160a01b0382165f908152610134602052604090205460ff165b61235e5760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610763565b505050565b6001600160a01b038381165f90815260fe602052604080822054858416835291205461235e92918216911683612505565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6123be612ab6565b6123c6612b0e565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f0361241657505f919050565b5f600161242284612b3e565b901c6001901b9050600181848161243b5761243b61324e565b048201901c905060018184816124535761245361324e565b048201901c9050600181848161246b5761246b61324e565b048201901c905060018184816124835761248361324e565b048201901c9050600181848161249b5761249b61324e565b048201901c905060018184816124b3576124b361324e565b048201901c905060018184816124cb576124cb61324e565b048201901c90506109f2818285816124e5576124e561324e565b04612bd1565b5f6124f96002848418613262565b6109f2908484166131ae565b816001600160a01b0316836001600160a01b03161415801561252657505f81115b1561235e576001600160a01b038316156125b3576001600160a01b0383165f90815260ff60205260408120819061256090612a4385612113565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516125a8929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161561235e576001600160a01b0382165f90815260ff6020526040812081906125e89061210885612113565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612630929190918252602082015260400190565b60405180910390a25050505050565b5f54610100900460ff166126655760405162461bcd60e51b815260040161076390613203565b610a3833611e25565b5f54610100900460ff166126945760405162461bcd60e51b815260040161076390613203565b60686126a083826132c5565b50606961235e82826132c5565b5f54610100900460ff166126d35760405162461bcd60e51b815260040161076390613203565b60996126df83826132c5565b50609a6126ec82826132c5565b50505f609781905560985550565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561272f57505f905060036127ae565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612780573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166127a8575f600192509250506127ae565b91505f90505b94509492505050565b5f8160048111156127ca576127ca613380565b036127d25750565b60018160048111156127e6576127e6613380565b036128335760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610763565b600281600481111561284757612847613380565b036128945760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610763565b60038160048111156128a8576128a8613380565b03610a035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610763565b6001600160a01b0382166129605760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610763565b61296b825f8361227f565b6001600160a01b0382165f90815260656020526040902054818110156129de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610763565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361235e835f84612363565b5f6109f282846131f0565b5f6001600160e01b03821115611e215760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610763565b5f5f612ac0611e76565b805190915015612ad7578051602090910120919050565b6097548015612ae65792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f612b18611e85565b805190915015612b2f578051602090910120919050565b6098548015612ae65792915050565b5f80608083901c15612b5257608092831c92015b604083901c15612b6457604092831c92015b602083901c15612b7657602092831c92015b601083901c15612b8857601092831c92015b600883901c15612b9a57600892831c92015b600483901c15612bac57600492831c92015b600283901c15612bbe57600292831c92015b600183901c156106ed5760010192915050565b5f818310612bdf57816109f2565b5090919050565b80356001600160a01b0381168114612bfc575f5ffd5b919050565b5f60208284031215612c11575f5ffd5b6109f282612be6565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109f26020830184612c1a565b5f5f60408385031215612c6b575f5ffd5b612c7483612be6565b946020939093013593505050565b8015158114610a03575f5ffd5b5f5f60408385031215612ca0575f5ffd5b612ca983612be6565b91506020830135612cb981612c82565b809150509250929050565b5f5f5f60608486031215612cd6575f5ffd5b612cdf84612be6565b9250612ced60208501612be6565b929592945050506040919091013590565b60ff60f81b8816815260e060208201525f612d1c60e0830189612c1a565b8281036040840152612d2e8189612c1a565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015612d83578351835260209384019390920191600101612d65565b50909b9a5050505050505050505050565b5f60208284031215612da4575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612de857612de8612dab565b604052919050565b5f67ffffffffffffffff821115612e0957612e09612dab565b5060051b60200190565b5f82601f830112612e22575f5ffd5b8135612e35612e3082612df0565b612dbf565b8082825260208201915060208360051b860101925085831115612e56575f5ffd5b602085015b83811015611fed578035835260209283019201612e5b565b5f5f5f5f60808587031215612e86575f5ffd5b612e8f85612be6565b9350602085013567ffffffffffffffff811115612eaa575f5ffd5b8501601f81018713612eba575f5ffd5b8035612ec8612e3082612df0565b8082825260208201915060208360051b850101925089831115612ee9575f5ffd5b6020840193505b82841015612f1257612f0184612be6565b825260209384019390910190612ef0565b9550505050604085013567ffffffffffffffff811115612f30575f5ffd5b612f3c87828801612e13565b925050606085013567ffffffffffffffff811115612f58575f5ffd5b612f6487828801612e13565b91505092959194509250565b5f5f83601f840112612f80575f5ffd5b50813567ffffffffffffffff811115612f97575f5ffd5b6020830191508360208260051b8501011115612fb1575f5ffd5b9250929050565b5f5f5f5f60408587031215612fcb575f5ffd5b843567ffffffffffffffff811115612fe1575f5ffd5b612fed87828801612f70565b909550935050602085013567ffffffffffffffff81111561300c575f5ffd5b61301887828801612f70565b95989497509550505050565b803560ff81168114612bfc575f5ffd5b5f5f5f5f5f5f60c08789031215613049575f5ffd5b61305287612be6565b9550602087013594506040870135935061306e60608801613024565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561309e575f5ffd5b6130a788612be6565b96506130b560208901612be6565b955060408801359450606088013593506130d160808901613024565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156130ff575f5ffd5b61310883612be6565b915061311660208401612be6565b90509250929050565b5f5f60408385031215613130575f5ffd5b61313983612be6565b9150602083013563ffffffff81168114612cb9575f5ffd5b600181811c9082168061316557607f821691505b60208210810361201857634e487b7160e01b5f52602260045260245ffd5b5f60208284031215613193575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ed576106ed61319a565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156131e5575f5ffd5b81516109f281612c82565b818103818111156106ed576106ed61319a565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261327c57634e487b7160e01b5f52601260045260245ffd5b500490565b601f82111561235e57805f5260205f20601f840160051c810160208510156132a65750805b601f840160051c820191505b81811015611074575f81556001016132b2565b815167ffffffffffffffff8111156132df576132df612dab565b6132f3816132ed8454613151565b84613281565b6020601f821160018114613325575f831561330e5750848201515b5f19600385901b1c1916600184901b178455611074565b5f84815260208120601f198516915b828110156133545787850151825560209485019460019092019101613334565b508482101561337157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220288064199d2be90b93729dff2dcc2497b661bd2af455c43da5f6db62c74e88c364736f6c634300081b0033",
+ Bin: "0x60a060405234801561000f575f5ffd5b5060405161352938038061352983398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b6080516133ca61015f5f395f81816103410152818161083e0152818161149e015261158a01526133ca5ff3fe608060405234801561000f575f5ffd5b5060043610610255575f3560e01c806381b9716111610140578063a9059cbb116100bf578063dd62ed3e11610084578063dd62ed3e146105b9578063de0e9a3e146105cc578063ea598cb0146105df578063eb415f45146105f2578063f1127ed8146105fa578063f2fde38b14610637575f5ffd5b8063a9059cbb1461055a578063aad41a411461056d578063b8c2559414610580578063c3cda52014610593578063d505accf146105a6575f5ffd5b806395d89b411161010557806395d89b411461050f5780639ab24eb0146105175780639aec4bae1461052a578063a457c2d714610534578063a7d1195d14610547575f5ffd5b806381b971611461049157806384b0196e146104b15780638da5cb5b146104cc5780638e539e8c146104dd57806391ddadf4146104f0575f5ffd5b80633a46b1a8116101d75780635c19a95c1161019c5780635c19a95c146103f05780636fcfff451461040357806370a082311461042b578063715018a61461045357806378aa33ba1461045b5780637ecebe001461047e575f5ffd5b80633a46b1a8146103295780633f4da4c61461033c5780634bf5d7e91461037b57806353957125146103a5578063587cde1e146103c5575f5ffd5b80631ffacdef1161021d5780631ffacdef146102d957806323b872dd146102ec578063313ce567146102ff5780633644e5151461030e5780633950935114610316575f5ffd5b80630455e6941461025957806306fdde0314610291578063095ea7b3146102a65780631249c58b146102b957806318160ddd146102c3575b5f5ffd5b61027c610267366004612c01565b6101336020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61029961064a565b6040516102889190612c48565b61027c6102b4366004612c5a565b6106da565b6102c16106f3565b005b6102cb61083b565b604051908152602001610288565b6102c16102e7366004612c8f565b6108c1565b61027c6102fa366004612cc4565b610929565b60405160128152602001610288565b6102cb61094c565b61027c610324366004612c5a565b610955565b6102cb610337366004612c5a565b610976565b6103637f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610288565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610299565b6102cb6103b3366004612c01565b6101306020525f908152604090205481565b6103636103d3366004612c01565b6001600160a01b039081165f90815260fe60205260409020541690565b6102c16103fe366004612c01565b6109f9565b610416610411366004612c01565b610a06565b60405163ffffffff9091168152602001610288565b6102cb610439366004612c01565b6001600160a01b03165f9081526065602052604090205490565b6102c1610a27565b61027c610469366004612c01565b6101346020525f908152604090205460ff1681565b6102cb61048c366004612c01565b610a3a565b6102cb61049f366004612c01565b6101316020525f908152604090205481565b6104b9610a57565b6040516102889796959493929190612cfe565b6033546001600160a01b0316610363565b6102cb6104eb366004612d94565b610af0565b6104f8610b57565b60405165ffffffffffff9091168152602001610288565b610299610b61565b6102cb610525366004612c01565b610b70565b6102cb6101325481565b61027c610542366004612c5a565b610bed565b6102c1610555366004612e73565b610c67565b61027c610568366004612c5a565b61107b565b6102c161057b366004612fb8565b611088565b6102c161058e366004612c8f565b611158565b6102c16105a1366004613034565b6111b8565b6102c16105b4366004613088565b6112ed565b6102cb6105c73660046130ee565b61144e565b6102c16105da366004612d94565b611478565b6102c16105ed366004612d94565b611568565b6102c161165d565b61060d61060836600461311f565b611724565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610288565b6102c1610645366004612c01565b6117a5565b60606068805461065990613151565b80601f016020809104026020016040519081016040528092919081815260200182805461068590613151565b80156106d05780601f106106a7576101008083540402835291602001916106d0565b820191905f5260205f20905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b5f336106e781858561181b565b60019150505b92915050565b335f908152610131602052604090205461076c5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b335f908152610130602052604090205442116107e45760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610763565b335f81815261013160205260408120805491905590610803908261193e565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610898573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bc9190613183565b905090565b6108c96119d4565b6001600160a01b0382165f8181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f33610936858285611a2e565b610941858585611aa0565b506001949350505050565b5f6108bc611c5a565b5f336106e7818585610967838361144e565b61097191906131ae565b61181b565b5f61097f610b57565b65ffffffffffff1682106109d15760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6001600160a01b0383165f90815260ff602052604090206109f29083611c63565b9392505050565b610a033382611d44565b50565b6001600160a01b0381165f90815260ff60205260408120546106ed90611dbd565b610a2f6119d4565b610a385f611e25565b565b6001600160a01b0381165f90815260cb60205260408120546106ed565b5f6060805f5f5f60606097545f5f1b148015610a735750609854155b610ab75760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610763565b610abf611e76565b610ac7611e85565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f610af9610b57565b65ffffffffffff168210610b4b5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610763565b6106ed61010083611c63565b5f6108bc42611e94565b60606069805461065990613151565b6001600160a01b0381165f90815260ff60205260408120548015610bdb576001600160a01b0383165f90815260ff6020526040902080545f198301908110610bba57610bba6131c1565b5f9182526020909120015464010000000090046001600160e01b0316610bdd565b5f5b6001600160e01b03169392505050565b5f3381610bfa828661144e565b905083811015610c5a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610763565b610941828686840361181b565b5f54610100900460ff1615808015610c8557505f54600160ff909116105b80610c9e5750303b158015610c9e57505f5460ff166001145b610d015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610763565b5f805460ff191660011790558015610d22575f805461ff0019166101001790555b610d2a611efa565b610d6e6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250611f28565b610d7785611e25565b610d9d6040518060400160405280600581526020016422a4a3a2a760d91b815250611f5c565b8251845114610e245760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b8151845114610eab5760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610763565b5f5b845181101561102857838181518110610ec857610ec86131c1565b60200260200101516101315f878481518110610ee657610ee66131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550828181518110610f2357610f236131c1565b60200260200101516101305f878481518110610f4157610f416131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f208190555060016101335f878481518110610f8457610f846131c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550848181518110610fd357610fd36131c1565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051611018911515815260200190565b60405180910390a2600101610ead565b505f19610132558015611074575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b5f336106e7818585611aa0565b8281146110fd5760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610763565b5f5b83811015611074576111503386868481811061111d5761111d6131c1565b90506020020160208101906111329190612c01565b858585818110611144576111446131c1565b90506020020135611aa0565b6001016110ff565b6111606119d4565b6001600160a01b0382165f8181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b910161091d565b834211156112085760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610763565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90611281906112799060a00160405160208183030381529060405280519060200120611fa5565b858585611fd1565b905061128c81611ff7565b86146112da5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610763565b6112e48188611d44565b50505050505050565b8342111561133d5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610763565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861136b8c611ff7565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6113c582611fa5565b90505f6113d482878787611fd1565b9050896001600160a01b0316816001600160a01b0316146114375760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610763565b6114428a8a8a61181b565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611482338261201e565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156114ec573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151091906131d5565b610a035760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610763565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af11580156115d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fc91906131d5565b6116535760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610763565b610a03338261193e565b6116656119d4565b5f1961013254146116f45760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610763565b5f6101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611766576117666131c1565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6117ad6119d4565b6001600160a01b0381166118125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610763565b610a0381611e25565b6001600160a01b03831661187d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610763565b6001600160a01b0382166118de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610763565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6119488282612037565b6001600160e01b0361195861083b565b11156119bf5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610763565b6119ce61010061210883612113565b50505050565b6033546001600160a01b03163314610a385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b5f611a39848461144e565b90505f1981146119ce5781811015611a935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610763565b6119ce848484840361181b565b6001600160a01b038316611b045760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610763565b6001600160a01b038216611b665760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610763565b611b7183838361227f565b6001600160a01b0383165f9081526065602052604090205481811015611be85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610763565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c479086815260200190565b60405180910390a36119ce848484612363565b5f6108bc612394565b81545f9081816005811115611cba575f611c7c84612407565b611c8690856131f0565b5f88815260209020909150869082015463ffffffff161115611caa57809150611cb8565b611cb58160016131ae565b92505b505b80821015611d05575f611ccd83836124eb565b5f88815260209020909150869082015463ffffffff161115611cf157809150611cff565b611cfc8160016131ae565b92505b50611cba565b8015611d2f575f8681526020902081015f19015464010000000090046001600160e01b0316611d31565b5f5b6001600160e01b03169695505050505050565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46119ce828483612505565b5f63ffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610763565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461065990613151565b6060609a805461065990613151565b5f65ffffffffffff821115611e215760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610763565b5f54610100900460ff16611f205760405162461bcd60e51b815260040161076390613203565b610a3861263f565b5f54610100900460ff16611f4e5760405162461bcd60e51b815260040161076390613203565b611f58828261266e565b5050565b5f54610100900460ff16611f825760405162461bcd60e51b815260040161076390613203565b610a0381604051806040016040528060018152602001603160f81b8152506126ad565b5f6106ed611fb1611c5a565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f611fe0878787876126fa565b91509150611fed816127b7565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b6120288282612900565b6119ce610100612a4383612113565b6001600160a01b03821661208d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610763565b6120985f838361227f565b8060675f8282546120a991906131ae565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f585f8383612363565b5f6109f282846131ae565b82545f90819081811561215d575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612171565b604080518082019091525f80825260208201525b905080602001516001600160e01b0316935061219184868863ffffffff16565b92505f821180156121b957506121a5610b57565b65ffffffffffff16815f015163ffffffff16145b156121fc576121c783612a4e565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612275565b866040518060400160405280612220612213610b57565b65ffffffffffff16611dbd565b63ffffffff16815260200161223486612a4e565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b61013254421161235e576001600160a01b03831615806122a657506001600160a01b038216155b806122c957506001600160a01b0383165f908152610133602052604090205460ff165b806122ec57506001600160a01b0382165f908152610134602052604090205460ff165b61235e5760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610763565b505050565b6001600160a01b038381165f90815260fe602052604080822054858416835291205461235e92918216911683612505565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6123be612ab6565b6123c6612b0e565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f0361241657505f919050565b5f600161242284612b3e565b901c6001901b9050600181848161243b5761243b61324e565b048201901c905060018184816124535761245361324e565b048201901c9050600181848161246b5761246b61324e565b048201901c905060018184816124835761248361324e565b048201901c9050600181848161249b5761249b61324e565b048201901c905060018184816124b3576124b361324e565b048201901c905060018184816124cb576124cb61324e565b048201901c90506109f2818285816124e5576124e561324e565b04612bd1565b5f6124f96002848418613262565b6109f2908484166131ae565b816001600160a01b0316836001600160a01b03161415801561252657505f81115b1561235e576001600160a01b038316156125b3576001600160a01b0383165f90815260ff60205260408120819061256090612a4385612113565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516125a8929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161561235e576001600160a01b0382165f90815260ff6020526040812081906125e89061210885612113565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612630929190918252602082015260400190565b60405180910390a25050505050565b5f54610100900460ff166126655760405162461bcd60e51b815260040161076390613203565b610a3833611e25565b5f54610100900460ff166126945760405162461bcd60e51b815260040161076390613203565b60686126a083826132c5565b50606961235e82826132c5565b5f54610100900460ff166126d35760405162461bcd60e51b815260040161076390613203565b60996126df83826132c5565b50609a6126ec82826132c5565b50505f609781905560985550565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561272f57505f905060036127ae565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612780573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166127a8575f600192509250506127ae565b91505f90505b94509492505050565b5f8160048111156127ca576127ca613380565b036127d25750565b60018160048111156127e6576127e6613380565b036128335760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610763565b600281600481111561284757612847613380565b036128945760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610763565b60038160048111156128a8576128a8613380565b03610a035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610763565b6001600160a01b0382166129605760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610763565b61296b825f8361227f565b6001600160a01b0382165f90815260656020526040902054818110156129de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610763565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361235e835f84612363565b5f6109f282846131f0565b5f6001600160e01b03821115611e215760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610763565b5f5f612ac0611e76565b805190915015612ad7578051602090910120919050565b6097548015612ae65792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f612b18611e85565b805190915015612b2f578051602090910120919050565b6098548015612ae65792915050565b5f80608083901c15612b5257608092831c92015b604083901c15612b6457604092831c92015b602083901c15612b7657602092831c92015b601083901c15612b8857601092831c92015b600883901c15612b9a57600892831c92015b600483901c15612bac57600492831c92015b600283901c15612bbe57600292831c92015b600183901c156106ed5760010192915050565b5f818310612bdf57816109f2565b5090919050565b80356001600160a01b0381168114612bfc575f5ffd5b919050565b5f60208284031215612c11575f5ffd5b6109f282612be6565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109f26020830184612c1a565b5f5f60408385031215612c6b575f5ffd5b612c7483612be6565b946020939093013593505050565b8015158114610a03575f5ffd5b5f5f60408385031215612ca0575f5ffd5b612ca983612be6565b91506020830135612cb981612c82565b809150509250929050565b5f5f5f60608486031215612cd6575f5ffd5b612cdf84612be6565b9250612ced60208501612be6565b929592945050506040919091013590565b60ff60f81b8816815260e060208201525f612d1c60e0830189612c1a565b8281036040840152612d2e8189612c1a565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015612d83578351835260209384019390920191600101612d65565b50909b9a5050505050505050505050565b5f60208284031215612da4575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612de857612de8612dab565b604052919050565b5f67ffffffffffffffff821115612e0957612e09612dab565b5060051b60200190565b5f82601f830112612e22575f5ffd5b8135612e35612e3082612df0565b612dbf565b8082825260208201915060208360051b860101925085831115612e56575f5ffd5b602085015b83811015611fed578035835260209283019201612e5b565b5f5f5f5f60808587031215612e86575f5ffd5b612e8f85612be6565b9350602085013567ffffffffffffffff811115612eaa575f5ffd5b8501601f81018713612eba575f5ffd5b8035612ec8612e3082612df0565b8082825260208201915060208360051b850101925089831115612ee9575f5ffd5b6020840193505b82841015612f1257612f0184612be6565b825260209384019390910190612ef0565b9550505050604085013567ffffffffffffffff811115612f30575f5ffd5b612f3c87828801612e13565b925050606085013567ffffffffffffffff811115612f58575f5ffd5b612f6487828801612e13565b91505092959194509250565b5f5f83601f840112612f80575f5ffd5b50813567ffffffffffffffff811115612f97575f5ffd5b6020830191508360208260051b8501011115612fb1575f5ffd5b9250929050565b5f5f5f5f60408587031215612fcb575f5ffd5b843567ffffffffffffffff811115612fe1575f5ffd5b612fed87828801612f70565b909550935050602085013567ffffffffffffffff81111561300c575f5ffd5b61301887828801612f70565b95989497509550505050565b803560ff81168114612bfc575f5ffd5b5f5f5f5f5f5f60c08789031215613049575f5ffd5b61305287612be6565b9550602087013594506040870135935061306e60608801613024565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561309e575f5ffd5b6130a788612be6565b96506130b560208901612be6565b955060408801359450606088013593506130d160808901613024565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156130ff575f5ffd5b61310883612be6565b915061311660208401612be6565b90509250929050565b5f5f60408385031215613130575f5ffd5b61313983612be6565b9150602083013563ffffffff81168114612cb9575f5ffd5b600181811c9082168061316557607f821691505b60208210810361201857634e487b7160e01b5f52602260045260245ffd5b5f60208284031215613193575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ed576106ed61319a565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156131e5575f5ffd5b81516109f281612c82565b818103818111156106ed576106ed61319a565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261327c57634e487b7160e01b5f52601260045260245ffd5b500490565b601f82111561235e57805f5260205f20601f840160051c810160208510156132a65750805b601f840160051c820191505b81811015611074575f81556001016132b2565b815167ffffffffffffffff8111156132df576132df612dab565b6132f3816132ed8454613151565b84613281565b6020601f821160018114613325575f831561330e5750848201515b5f19600385901b1c1916600184901b178455611074565b5f84815260208120601f198516915b828110156133545787850151825560209485019460019092019101613334565b508482101561337157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220522b92449cd19815cf8a85fc41a9995dd3b7eabf721a4e8dcdc1c427d604cdc064736f6c634300081b0033",
}
// EigenABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/EigenPod/binding.go b/pkg/bindings/EigenPod/binding.go
index a98fb0db1f..fe8af3ffc3 100644
--- a/pkg/bindings/EigenPod/binding.go
+++ b/pkg/bindings/EigenPod/binding.go
@@ -73,8 +73,8 @@ type IEigenPodTypesValidatorInfo struct {
// EigenPodMetaData contains all meta data concerning the EigenPod contract.
var EigenPodMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"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\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"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\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"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\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"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\":\"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\":\"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: "0x60e060405234801561000f575f5ffd5b50604051613c7c380380613c7c83398101604081905261002e91610131565b6001600160a01b03808416608052821660a0526001600160401b03811660c05261005661005e565b505050610186565b5f54610100900460ff16156100c95760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610118575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461012e575f5ffd5b50565b5f5f5f60608486031215610143575f5ffd5b835161014e8161011a565b602085015190935061015f8161011a565b60408501519092506001600160401b038116811461017b575f5ffd5b809150509250925092565b60805160a05160c051613a7f6101fd5f395f61060401525f81816102a90152818161063f015281816106e7015281816109ab01528181610b7501528181610e4e01528181610ef50152818161112b01528181611479015281816115ad01526127bb01525f81816104c60152610f5e0152613a7f5ff3fe608060405260043610610164575f3560e01c80636fcd0e53116100cd578063c490744211610087578063dda3346c11610062578063dda3346c14610596578063ee94d67c146105b5578063f074ba62146105d4578063f2882461146105f3575f5ffd5b8063c490744214610539578063c4d66de814610558578063d06d558714610577575f5ffd5b80636fcd0e53146104545780637439841f1461048057806374cdd798146104b557806388676cad146104e85780639b4e463414610507578063b522538a1461051a575f5ffd5b80634665bcda1161011e5780634665bcda1461029857806347d28372146102cb57806352396a59146103b657806358753357146103ea57806358eaee79146104095780636c0d2d5a14610435575f5ffd5b8063039157d2146101a25780630b18ff66146101c35780632340e8d3146101ff5780633474aa16146102225780633f65cf191461025357806342ecff2a14610272575f5ffd5b3661019e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b3480156101ad575f5ffd5b506101c16101bc366004612ff3565b610626565b005b3480156101ce575f5ffd5b506033546101e2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020a575f5ffd5b5061021460395481565b6040519081526020016101f6565b34801561022d575f5ffd5b506034546001600160401b03165b6040516001600160401b0390911681526020016101f6565b34801561025e575f5ffd5b506101c161026d3660046130ac565b610952565b34801561027d575f5ffd5b50603a5461023b90600160401b90046001600160401b031681565b3480156102a3575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d6575f5ffd5b5061035b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b6040516101f691905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b3480156103c1575f5ffd5b5061023b6103d0366004613181565b603b6020525f90815260409020546001600160401b031681565b3480156103f5575f5ffd5b50603e546101e2906001600160a01b031681565b348015610414575f5ffd5b506104286104233660046131de565b610bda565b6040516101f69190613250565b348015610440575f5ffd5b5061021461044f366004613181565b610c3c565b34801561045f575f5ffd5b5061047361046e36600461325e565b610d4a565b6040516101f69190613275565b34801561048b575f5ffd5b5061042861049a36600461325e565b5f90815260366020526040902054600160c01b900460ff1690565b3480156104c0575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f3575f5ffd5b506101c16105023660046132d8565b610df5565b6101c16105153660046132f3565b610eea565b348015610525575f5ffd5b506104736105343660046131de565b611031565b348015610544575f5ffd5b506101c1610553366004613383565b611120565b348015610563575f5ffd5b506101c16105723660046133ad565b611257565b348015610582575f5ffd5b506101c16105913660046133ad565b6113a1565b3480156105a1575f5ffd5b506101c16105b0366004613498565b611435565b3480156105c0575f5ffd5b50603a5461023b906001600160401b031681565b3480156105df575f5ffd5b506101c16105ee36600461356a565b611594565b3480156105fe575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561068c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b091906135d1565b156106ce5760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610734573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075891906135d1565b156107765760405163840a48d560e01b815260040160405180910390fd5b5f6107ba61078485806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156108285761082861321c565b60028111156108395761083961321c565b81525050905080604001516001600160401b0316876001600160401b031611610875576040516337e07ffd60e01b815260040160405180910390fd5b60018160600151600281111561088d5761088d61321c565b146108ab5760405163d49e19a760e01b815260040160405180910390fd5b6108ee6108b886806135ec565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506119b392505050565b61090b5760405163161ce5ed60e31b815260040160405180910390fd5b61091d61091788610c3c565b876119db565b610940863561092c87806135ec565b61093960208a018a613631565b8651611a80565b6109495f611ba7565b50505050505050565b6033546001600160a01b03163314806109755750603e546001600160a01b031633145b6109925760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109f8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c91906135d1565b15610a3a5760405163840a48d560e01b815260040160405180910390fd5b8584148015610a4857508382145b610a65576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610a9b576040516337e07ffd60e01b815260040160405180910390fd5b610aad610aa78a610c3c565b896119db565b5f805b87811015610b4557610b318a358a8a84818110610acf57610acf613673565b9050602002016020810190610ae49190613687565b898985818110610af657610af6613673565b9050602002810190610b089190613631565b898987818110610b1a57610b1a613673565b9050602002810190610b2c91906135ec565b611d27565b610b3b90836136bf565b9150600101610ab0565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610bb8575f5ffd5b505af1158015610bca573d5f5f3e3d5ffd5b5050505050505050505050505050565b5f5f610c1a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b5f610c4a611fff600c6136d2565b610c5d6001600160401b038416426136e9565b10610c7b57604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052610cc291613713565b5f60405180830381855afa9150503d805f8114610cfa576040519150601f19603f3d011682016040523d82523d5f602084013e610cff565b606091505b5091509150818015610d1157505f8151115b610d2e5760405163558ad0a360e01b815260040160405180910390fd5b80806020019051810190610d42919061371e565b949350505050565b610d71604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610ddb57610ddb61321c565b6002811115610dec57610dec61321c565b90525092915050565b6033546001600160a01b0316331480610e185750603e546001600160a01b031633145b610e355760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906135d1565b15610edd5760405163840a48d560e01b815260040160405180910390fd5b610ee682611ba7565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f3357604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec80000014610f5c5760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610f9f61226d565b8888886040518863ffffffff1660e01b8152600401610fc39695949392919061378b565b5f604051808303818588803b158015610fda575f5ffd5b505af1158015610fec573d5f5f3e3d5ffd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516110229291906137d9565b60405180910390a15050505050565b611058604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61109985858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506121dc92505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156111055761110561321c565b60028111156111165761111661321c565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461116957604051633213a66160e21b815260040160405180910390fd5b5f611178633b9aca0083613800565b9050611191633b9aca006001600160401b0383166136d2565b6034549092506001600160401b0390811690821611156111c4576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906111e19084906001600160401b0316613813565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161124091815260200190565b60405180910390a261125283836122b1565b505050565b5f54610100900460ff161580801561127557505f54600160ff909116105b8061128e5750303b15801561128e57505f5460ff166001145b6112f65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611317575f805461ff0019166101001790555b6001600160a01b03821661133e576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015610ee6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146113cc5760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146114605760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156114c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ea91906135d1565b156115085760405163840a48d560e01b815260040160405180910390fd5b825184511461152a576040516343714afd60e01b815260040160405180910390fd5b5f5b845181101561158d576115858385838151811061154b5761154b613673565b602002602001015187848151811061156557611565613673565b60200260200101516001600160a01b03166123c69092919063ffffffff16565b60010161152c565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156115fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e91906135d1565b1561163c5760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f81900361167057604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c54808252603d5462ffffff811660208401526001600160401b0363010000008204811694840194909452600160581b810460070b6060840152600160981b90049092166080820152906116cf9087612418565b5f805b8581101561193857368787838181106116ed576116ed613673565b90506020028101906116ff9190613832565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561176f5761176f61321c565b60028111156117805761178061321c565b905250905060018160600151600281111561179d5761179d61321c565b146117a9575050611930565b856001600160401b031681604001516001600160401b0316106117cd575050611930565b5f80806117dd848a8f35886124c9565b60208b01805193965091945092506117f482613850565b62ffffff1690525060808801805184919061181090839061386d565b6001600160401b031690525060608801805183919061183090839061388c565b60070b905250611840818861386d565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156118e4576118e461321c565b021790555050845160405164ffffffffff90911691506001600160401b038b16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f905f90a350505050505b6001016116d2565b506001600160401b038084165f908152603b60205260408120805484939192916119649185911661386d565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610949826125ec565b5f815f815181106119a4576119a4613673565b60200260200101519050919050565b5f816003815181106119c7576119c7613673565b60200260200101515f5f1b14159050919050565b6119e7600360206136d2565b6119f46020830183613631565b905014611a14576040516313717da960e21b815260040160405180910390fd5b611a63611a246020830183613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508692505084359050600361281b565b610ee6576040516309bde33960e01b815260040160405180910390fd5b60088414611aa15760405163200591bd60e01b815260040160405180910390fd5b6005611aaf602860016136bf565b611ab991906136bf565b611ac49060206136d2565b8214611ae3576040516313717da960e21b815260040160405180910390fd5b5f611b1f8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061283292505050565b90505f64ffffffffff8316611b36602860016136bf565b600b901b179050611b8085858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508c925086915085905061281b565b611b9d576040516309bde33960e01b815260040160405180910390fd5b5050505050505050565b603a54600160401b90046001600160401b031615611bd75760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603611c05576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b0316611c21633b9aca0047613800565b611c2b9190613813565b9050818015611c4157506001600160401b038116155b15611c5f576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a00160405280611c7442610c3c565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff0000000000000000199092169190911790559050611cd8816125ec565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f611d648484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061199192505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611dd257611dd261321c565b6002811115611de357611de361321c565b90525090505f81606001516002811115611dff57611dff61321c565b14611e1d576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b038016611e628686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ac292505050565b6001600160401b031603611e8957604051631958236d60e21b815260040160405180910390fd5b6001600160401b038016611ece8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ae692505050565b6001600160401b031614611ef557604051632eade63760e01b815260040160405180910390fd5b611efd61226d565b611f06906138bb565b611f418686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612afd92505050565b14611f5f57604051633772dd5360e11b815260040160405180910390fd5b5f611f9b8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b1192505050565b9050611fab8a87878b8b8e611a80565b60398054905f611fba836138de565b9091555050603a545f90600160401b90046001600160401b031615611ff157603a54600160401b90046001600160401b0316611ffe565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156120d3576120d361321c565b021790555050603d80548492506013906120fe908490600160981b90046001600160401b031661386d565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c104414498a60405161215e919064ffffffffff91909116815260200190565b60405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16121cd633b9aca006001600160401b0384166136d2565b9b9a5050505050505050505050565b5f81516030146121ff57604051634f88323960e11b815260040160405180910390fd5b6040516002906122159084905f906020016138f6565b60408051601f198184030181529082905261222f91613713565b602060405180830381855afa15801561224a573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c36919061371e565b60408051600160f81b60208201525f602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b804710156123015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016112ed565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461234a576040519150601f19603f3d011682016040523d82523d5f602084013e61234f565b606091505b50509050806112525760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016112ed565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611252908490612b28565b612424600560036136bf565b61242f9060206136d2565b61243c6020830183613631565b90501461245c576040516313717da960e21b815260040160405180910390fd5b606c6124ac61246e6020840184613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525087925050853590508461281b565b611252576040516309bde33960e01b815260040160405180910390fd5b83516020850151905f908190816124e1878388612bfb565b9050846001600160401b0316816001600160401b03161461255b57612506858261391a565b6040805164ffffffffff851681526001600160401b038b8116602083015284168183015290519195507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b01525f036125e05760398054905f61258a83613949565b9091555050600260608a015261259f8461395e565b92508164ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50509450945094915050565b602081015162ffffff161561268c578051603c556020810151603d80546040840151606085015160809095015162ffffff9094166affffffffffffffffffffff199092169190911763010000006001600160401b0392831602176fffffffffffffffffffffffffffffffff60581b1916600160581b9482169490940267ffffffffffffffff60981b191693909317600160981b9390921692909202179055565b60808101516034545f916126a8916001600160401b031661386d565b90505f826060015183604001516126bf919061388c565b60408401516034805492935090915f906126e39084906001600160401b031661386d565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061273390633b9aca009085166136d2565b90505f612748633b9aca00600785900b613983565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b1580156127fe575f5ffd5b505af1158015612810573d5f5f3e3d5ffd5b505050505050505050565b5f83612828868585612cd9565b1495945050505050565b5f5f600283516128429190613800565b90505f816001600160401b0381111561285d5761285d6133c8565b604051908082528060200260200182016040528015612886578160200160208202803683370190505b5090505f5b82811015612980576002856128a083836136d2565b815181106128b0576128b0613673565b6020026020010151868360026128c691906136d2565b6128d19060016136bf565b815181106128e1576128e1613673565b6020026020010151604051602001612903929190918252602082015260400190565b60408051601f198184030181529082905261291d91613713565b602060405180830381855afa158015612938573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061295b919061371e565b82828151811061296d5761296d613673565b602090810291909101015260010161288b565b5061298c600283613800565b91505b8115612a9f575f5b82811015612a8c576002826129ac83836136d2565b815181106129bc576129bc613673565b6020026020010151838360026129d291906136d2565b6129dd9060016136bf565b815181106129ed576129ed613673565b6020026020010151604051602001612a0f929190918252602082015260400190565b60408051601f1981840301815290829052612a2991613713565b602060405180830381855afa158015612a44573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a67919061371e565b828281518110612a7957612a79613673565b6020908102919091010152600101612997565b50612a98600283613800565b915061298f565b805f81518110612ab157612ab1613673565b602002602001015192505050919050565b5f610c3682600581518110612ad957612ad9613673565b6020026020010151612dad565b5f610c3682600681518110612ad957612ad9613673565b5f816001815181106119a4576119a4613673565b5f610c3682600281518110612ad957612ad9613673565b5f612b7c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e149092919063ffffffff16565b905080515f1480612b9c575080806020019051810190612b9c91906135d1565b6112525760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016112ed565b5f612c08602660016136bf565b612c139060206136d2565b612c206040840184613631565b905014612c40576040516313717da960e21b815260040160405180910390fd5b5f612c4c6004856139b2565b64ffffffffff169050612ca5612c656040850185613631565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250505060208601358461281b565b612cc2576040516309bde33960e01b815260040160405180910390fd5b612cd0836020013585612e22565b95945050505050565b5f83515f14158015612cf6575060208451612cf491906139db565b155b612d13576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111612da357612d376002856139db565b5f03612d695781515f528086015160205260208260405f60026107d05a03fa612d5e575f5ffd5b600284049350612d91565b808601515f52815160205260208260405f60026107d05a03fa612d8a575f5ffd5b6002840493505b612d9c6020826136bf565b9050612d24565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060610d4284845f85612e4e565b5f80612e2f6004846139ee565b612e3a906040613a17565b64ffffffffff169050610d4284821b612dad565b606082471015612eaf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016112ed565b5f5f866001600160a01b03168587604051612eca9190613713565b5f6040518083038185875af1925050503d805f8114612f04576040519150601f19603f3d011682016040523d82523d5f602084013e612f09565b606091505b5091509150612f1a87838387612f25565b979650505050505050565b60608315612f935782515f03612f8c576001600160a01b0385163b612f8c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016112ed565b5081610d42565b610d428383815115612fa85781518083602001fd5b8060405162461bcd60e51b81526004016112ed9190613a37565b80356001600160401b0381168114612fd8575f5ffd5b919050565b5f60408284031215612fed575f5ffd5b50919050565b5f5f5f60608486031215613005575f5ffd5b61300e84612fc2565b925060208401356001600160401b03811115613028575f5ffd5b61303486828701612fdd565b92505060408401356001600160401b0381111561304f575f5ffd5b61305b86828701612fdd565b9150509250925092565b5f5f83601f840112613075575f5ffd5b5081356001600160401b0381111561308b575f5ffd5b6020830191508360208260051b85010111156130a5575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156130c3575f5ffd5b6130cc89612fc2565b975060208901356001600160401b038111156130e6575f5ffd5b6130f28b828c01612fdd565b97505060408901356001600160401b0381111561310d575f5ffd5b6131198b828c01613065565b90975095505060608901356001600160401b03811115613137575f5ffd5b6131438b828c01613065565b90955093505060808901356001600160401b03811115613161575f5ffd5b61316d8b828c01613065565b999c989b5096995094979396929594505050565b5f60208284031215613191575f5ffd5b61319a82612fc2565b9392505050565b5f5f83601f8401126131b1575f5ffd5b5081356001600160401b038111156131c7575f5ffd5b6020830191508360208285010111156130a5575f5ffd5b5f5f602083850312156131ef575f5ffd5b82356001600160401b03811115613204575f5ffd5b613210858286016131a1565b90969095509350505050565b634e487b7160e01b5f52602160045260245ffd5b6003811061324c57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610c368284613230565b5f6020828403121561326e575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b03604084015116604083015260608301516132c16060840182613230565b5092915050565b80151581146132d5575f5ffd5b50565b5f602082840312156132e8575f5ffd5b813561319a816132c8565b5f5f5f5f5f60608688031215613307575f5ffd5b85356001600160401b0381111561331c575f5ffd5b613328888289016131a1565b90965094505060208601356001600160401b03811115613346575f5ffd5b613352888289016131a1565b96999598509660400135949350505050565b6001600160a01b03811681146132d5575f5ffd5b8035612fd881613364565b5f5f60408385031215613394575f5ffd5b823561339f81613364565b946020939093013593505050565b5f602082840312156133bd575f5ffd5b813561319a81613364565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613404576134046133c8565b604052919050565b5f6001600160401b03821115613424576134246133c8565b5060051b60200190565b5f82601f83011261343d575f5ffd5b813561345061344b8261340c565b6133dc565b8082825260208201915060208360051b860101925085831115613471575f5ffd5b602085015b8381101561348e578035835260209283019201613476565b5095945050505050565b5f5f5f606084860312156134aa575f5ffd5b83356001600160401b038111156134bf575f5ffd5b8401601f810186136134cf575f5ffd5b80356134dd61344b8261340c565b8082825260208201915060208360051b8501019250888311156134fe575f5ffd5b6020840193505b8284101561352957833561351881613364565b825260209384019390910190613505565b955050505060208401356001600160401b03811115613546575f5ffd5b6135528682870161342e565b92505061356160408501613378565b90509250925092565b5f5f5f6040848603121561357c575f5ffd5b83356001600160401b03811115613591575f5ffd5b61359d86828701612fdd565b93505060208401356001600160401b038111156135b8575f5ffd5b6135c486828701613065565b9497909650939450505050565b5f602082840312156135e1575f5ffd5b815161319a816132c8565b5f5f8335601e19843603018112613601575f5ffd5b8301803591506001600160401b0382111561361a575f5ffd5b6020019150600581901b36038213156130a5575f5ffd5b5f5f8335601e19843603018112613646575f5ffd5b8301803591506001600160401b0382111561365f575f5ffd5b6020019150368190038213156130a5575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613697575f5ffd5b813564ffffffffff8116811461319a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c3657610c366136ab565b8082028115828204841417610c3657610c366136ab565b81810381811115610c3657610c366136ab565b5f81518060208401855e5f93019283525090919050565b5f61319a82846136fc565b5f6020828403121561372e575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f61379e60808301888a613735565b82810360208401526137b0818861375d565b905082810360408401526137c5818688613735565b915050826060830152979650505050505050565b602081525f610d42602083018486613735565b634e487b7160e01b5f52601260045260245ffd5b5f8261380e5761380e6137ec565b500490565b6001600160401b038281168282160390811115610c3657610c366136ab565b5f8235605e19833603018112613846575f5ffd5b9190910192915050565b5f62ffffff821680613864576138646136ab565b5f190192915050565b6001600160401b038181168382160190811115610c3657610c366136ab565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff1982121715610c3657610c366136ab565b80516020808301519190811015612fed575f1960209190910360031b1b16919050565b5f600182016138ef576138ef6136ab565b5060010190565b5f61390182856136fc565b6001600160801b03199390931683525050601001919050565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff82131715610c3657610c366136ab565b5f81613957576139576136ab565b505f190190565b5f8160070b677fffffffffffffff19810361397b5761397b6136ab565b5f0392915050565b8082025f8212600160ff1b8414161561399e5761399e6136ab565b8181058314821517610c3657610c366136ab565b5f64ffffffffff8316806139c8576139c86137ec565b8064ffffffffff84160491505092915050565b5f826139e9576139e96137ec565b500690565b5f64ffffffffff831680613a0457613a046137ec565b8064ffffffffff84160691505092915050565b64ffffffffff81811683821602908116908181146132c1576132c16136ab565b602081525f61319a602083018461375d56fea2646970667358221220e271b1a0e920c82094eef2e8edb78373537361f720005af1fd915a4e6ce349d164736f6c634300081b0033",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"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\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"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\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"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\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"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\":\"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: "0x610100604052348015610010575f5ffd5b50604051613eb5380380613eb583398101604081905261002f91610197565b806100398161006e565b608052506001600160a01b0380851660a052831660c0526001600160401b03821660e0526100656100b4565b505050506102e7565b5f5f829050601f815111156100a1578260405163305a27a960e01b8152600401610098919061028c565b60405180910390fd5b80516100ac826102c1565b179392505050565b5f54610100900460ff161561011b5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610098565b5f5460ff9081161461016a575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610180575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f608085870312156101aa575f5ffd5b84516101b58161016c565b60208601519094506101c68161016c565b60408601519093506001600160401b03811681146101e2575f5ffd5b60608601519092506001600160401b038111156101fd575f5ffd5b8501601f8101871361020d575f5ffd5b80516001600160401b0381111561022657610226610183565b604051601f8201601f19908116603f011681016001600160401b038111828210171561025457610254610183565b60405281815282820160200189101561026b575f5ffd5b8160208401602083015e5f6020838301015280935050505092959194509250565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102e1575f198160200360031b1b821691505b50919050565b60805160a05160c05160e051613b4e6103675f395f61063f01525f81816102c30152818161067a01528181610722015281816109e601528181610bb001528181610eb901528181610f6001528181611196015281816114e401528181611618015261286301525f81816105010152610fc901525f610c1c0152613b4e5ff3fe60806040526004361061017e575f3560e01c80636fcd0e53116100cd578063c490744211610087578063dda3346c11610062578063dda3346c146105d1578063ee94d67c146105f0578063f074ba621461060f578063f28824611461062e575f5ffd5b8063c490744214610574578063c4d66de814610593578063d06d5587146105b2575f5ffd5b80636fcd0e531461048f5780637439841f146104bb57806374cdd798146104f057806388676cad146105235780639b4e463414610542578063b522538a14610555575f5ffd5b80634665bcda1161013857806354fd4d501161011357806354fd4d5014610404578063587533571461042557806358eaee79146104445780636c0d2d5a14610470575f5ffd5b80634665bcda146102b257806347d28372146102e557806352396a59146103d0575f5ffd5b8063039157d2146101bc5780630b18ff66146101dd5780632340e8d3146102195780633474aa161461023c5780633f65cf191461026d57806342ecff2a1461028c575f5ffd5b366101b8576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b3480156101c7575f5ffd5b506101db6101d63660046130c2565b610661565b005b3480156101e8575f5ffd5b506033546101fc906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610224575f5ffd5b5061022e60395481565b604051908152602001610210565b348015610247575f5ffd5b506034546001600160401b03165b6040516001600160401b039091168152602001610210565b348015610278575f5ffd5b506101db61028736600461317b565b61098d565b348015610297575f5ffd5b50603a5461025590600160401b90046001600160401b031681565b3480156102bd575f5ffd5b506101fc7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f0575f5ffd5b506103756040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b60405161021091905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b3480156103db575f5ffd5b506102556103ea366004613250565b603b6020525f90815260409020546001600160401b031681565b34801561040f575f5ffd5b50610418610c15565b604051610210919061329e565b348015610430575f5ffd5b50603e546101fc906001600160a01b031681565b34801561044f575f5ffd5b5061046361045e3660046132ed565b610c45565b604051610210919061335f565b34801561047b575f5ffd5b5061022e61048a366004613250565b610ca7565b34801561049a575f5ffd5b506104ae6104a936600461336d565b610db5565b6040516102109190613384565b3480156104c6575f5ffd5b506104636104d536600461336d565b5f90815260366020526040902054600160c01b900460ff1690565b3480156104fb575f5ffd5b506101fc7f000000000000000000000000000000000000000000000000000000000000000081565b34801561052e575f5ffd5b506101db61053d3660046133e7565b610e60565b6101db610550366004613402565b610f55565b348015610560575f5ffd5b506104ae61056f3660046132ed565b61109c565b34801561057f575f5ffd5b506101db61058e366004613492565b61118b565b34801561059e575f5ffd5b506101db6105ad3660046134bc565b6112c2565b3480156105bd575f5ffd5b506101db6105cc3660046134bc565b61140c565b3480156105dc575f5ffd5b506101db6105eb3660046135a7565b6114a0565b3480156105fb575f5ffd5b50603a54610255906001600160401b031681565b34801561061a575f5ffd5b506101db610629366004613679565b6115ff565b348015610639575f5ffd5b506102557f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106eb91906136e0565b156107095760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561076f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079391906136e0565b156107b15760405163840a48d560e01b815260040160405180910390fd5b5f6107f56107bf85806136fb565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506119fc92505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156108635761086361332b565b60028111156108745761087461332b565b81525050905080604001516001600160401b0316876001600160401b0316116108b0576040516337e07ffd60e01b815260040160405180910390fd5b6001816060015160028111156108c8576108c861332b565b146108e65760405163d49e19a760e01b815260040160405180910390fd5b6109296108f386806136fb565b808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250611a1e92505050565b6109465760405163161ce5ed60e31b815260040160405180910390fd5b61095861095288610ca7565b87611a46565b61097b863561096787806136fb565b61097460208a018a613740565b8651611aeb565b6109845f611c12565b50505050505050565b6033546001600160a01b03163314806109b05750603e546001600160a01b031633145b6109cd5760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610a33573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5791906136e0565b15610a755760405163840a48d560e01b815260040160405180910390fd5b8584148015610a8357508382145b610aa0576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610ad6576040516337e07ffd60e01b815260040160405180910390fd5b610ae8610ae28a610ca7565b89611a46565b5f805b87811015610b8057610b6c8a358a8a84818110610b0a57610b0a613782565b9050602002016020810190610b1f9190613796565b898985818110610b3157610b31613782565b9050602002810190610b439190613740565b898987818110610b5557610b55613782565b9050602002810190610b6791906136fb565b611d92565b610b7690836137ce565b9150600101610aeb565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610bf3575f5ffd5b505af1158015610c05573d5f5f3e3d5ffd5b5050505050505050505050505050565b6060610c407f0000000000000000000000000000000000000000000000000000000000000000612247565b905090565b5f5f610c8584848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061228492505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b5f610cb5611fff600c6137e1565b610cc86001600160401b038416426137f8565b10610ce657604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052610d2d91613822565b5f60405180830381855afa9150503d805f8114610d65576040519150601f19603f3d011682016040523d82523d5f602084013e610d6a565b606091505b5091509150818015610d7c57505f8151115b610d995760405163558ad0a360e01b815260040160405180910390fd5b80806020019051810190610dad919061382d565b949350505050565b610ddc604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610e4657610e4661332b565b6002811115610e5757610e5761332b565b90525092915050565b6033546001600160a01b0316331480610e835750603e546001600160a01b031633145b610ea05760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610f06573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2a91906136e0565b15610f485760405163840a48d560e01b815260040160405180910390fd5b610f5182611c12565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f9e57604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec80000014610fc75760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec800000878761100a612315565b8888886040518863ffffffff1660e01b815260040161102e9695949392919061386c565b5f604051808303818588803b158015611045575f5ffd5b505af1158015611057573d5f5f3e3d5ffd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23858560405161108d9291906138ba565b60405180910390a15050505050565b6110c3604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61110485858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061228492505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156111705761117061332b565b60028111156111815761118161332b565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111d457604051633213a66160e21b815260040160405180910390fd5b5f6111e3633b9aca00836138e1565b90506111fc633b9aca006001600160401b0383166137e1565b6034549092506001600160401b03908116908216111561122f576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f9061124c9084906001600160401b03166138f4565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e836040516112ab91815260200190565b60405180910390a26112bd8383612359565b505050565b5f54610100900460ff16158080156112e057505f54600160ff909116105b806112f95750303b1580156112f957505f5460ff166001145b6113615760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611382575f805461ff0019166101001790555b6001600160a01b0382166113a9576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015610f51575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146114375760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146114cb5760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611531573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061155591906136e0565b156115735760405163840a48d560e01b815260040160405180910390fd5b8251845114611595576040516343714afd60e01b815260040160405180910390fd5b5f5b84518110156115f8576115f0838583815181106115b6576115b6613782565b60200260200101518784815181106115d0576115d0613782565b60200260200101516001600160a01b031661246e9092919063ffffffff16565b600101611597565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611665573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061168991906136e0565b156116a75760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f8190036116db57604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c54808252603d5462ffffff811660208401526001600160401b0363010000008204811694840194909452600160581b810460070b6060840152600160981b900490921660808201529061173a90876124c0565b5f805b858110156119a3573687878381811061175857611758613782565b905060200281019061176a9190613913565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156117da576117da61332b565b60028111156117eb576117eb61332b565b90525090506001816060015160028111156118085761180861332b565b1461181457505061199b565b856001600160401b031681604001516001600160401b03161061183857505061199b565b5f8080611848848a8f3588612571565b60208b018051939650919450925061185f82613931565b62ffffff1690525060808801805184919061187b90839061394e565b6001600160401b031690525060608801805183919061189b90839061396d565b60070b9052506118ab818861394e565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b83600281111561194f5761194f61332b565b021790555050845160405164ffffffffff90911691506001600160401b038b16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f905f90a350505050505b60010161173d565b506001600160401b038084165f908152603b60205260408120805484939192916119cf9185911661394e565b92506101000a8154816001600160401b0302191690836001600160401b0316021790555061098482612694565b5f815f81518110611a0f57611a0f613782565b60200260200101519050919050565b5f81600381518110611a3257611a32613782565b60200260200101515f5f1b14159050919050565b611a52600360206137e1565b611a5f6020830183613740565b905014611a7f576040516313717da960e21b815260040160405180910390fd5b611ace611a8f6020830183613740565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250869250508435905060036128c3565b610f51576040516309bde33960e01b815260040160405180910390fd5b60088414611b0c5760405163200591bd60e01b815260040160405180910390fd5b6005611b1a602860016137ce565b611b2491906137ce565b611b2f9060206137e1565b8214611b4e576040516313717da960e21b815260040160405180910390fd5b5f611b8a8686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506128da92505050565b90505f64ffffffffff8316611ba1602860016137ce565b600b901b179050611beb85858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508c92508691508590506128c3565b611c08576040516309bde33960e01b815260040160405180910390fd5b5050505050505050565b603a54600160401b90046001600160401b031615611c425760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603611c70576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b0316611c8c633b9aca00476138e1565b611c9691906138f4565b9050818015611cac57506001600160401b038116155b15611cca576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a00160405280611cdf42610ca7565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff0000000000000000199092169190911790559050611d4381612694565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f611dcf8484808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506119fc92505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611e3d57611e3d61332b565b6002811115611e4e57611e4e61332b565b90525090505f81606001516002811115611e6a57611e6a61332b565b14611e88576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b038016611ecd8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b6a92505050565b6001600160401b031603611ef457604051631958236d60e21b815260040160405180910390fd5b6001600160401b038016611f398686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b8e92505050565b6001600160401b031614611f6057604051632eade63760e01b815260040160405180910390fd5b611f68612315565b611f719061399c565b611fac8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612ba592505050565b14611fca57604051633772dd5360e11b815260040160405180910390fd5b5f6120068686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612bb992505050565b90506120168a87878b8b8e611aeb565b60398054905f612025836139bf565b9091555050603a545f90600160401b90046001600160401b03161561205c57603a54600160401b90046001600160401b0316612069565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b83600281111561213e5761213e61332b565b021790555050603d8054849250601390612169908490600160981b90046001600160401b031661394e565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c104414498a6040516121c9919064ffffffffff91909116815260200190565b60405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612238633b9aca006001600160401b0384166137e1565b9b9a5050505050505050505050565b60605f61225383612bd0565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f81516030146122a757604051634f88323960e11b815260040160405180910390fd5b6040516002906122bd9084905f906020016139d7565b60408051601f19818403018152908290526122d791613822565b602060405180830381855afa1580156122f2573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ca1919061382d565b60408051600160f81b60208201525f602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b804710156123a95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401611358565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146123f2576040519150601f19603f3d011682016040523d82523d5f602084013e6123f7565b606091505b50509050806112bd5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401611358565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526112bd908490612bf7565b6124cc600560036137ce565b6124d79060206137e1565b6124e46020830183613740565b905014612504576040516313717da960e21b815260040160405180910390fd5b606c6125546125166020840184613740565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792505085359050846128c3565b6112bd576040516309bde33960e01b815260040160405180910390fd5b83516020850151905f90819081612589878388612cca565b9050846001600160401b0316816001600160401b031614612603576125ae85826139fb565b6040805164ffffffffff851681526001600160401b038b8116602083015284168183015290519195507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b01525f036126885760398054905f61263283613a2a565b9091555050600260608a015261264784613a3f565b92508164ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50509450945094915050565b602081015162ffffff1615612734578051603c556020810151603d80546040840151606085015160809095015162ffffff9094166affffffffffffffffffffff199092169190911763010000006001600160401b0392831602176fffffffffffffffffffffffffffffffff60581b1916600160581b9482169490940267ffffffffffffffff60981b191693909317600160981b9390921692909202179055565b60808101516034545f91612750916001600160401b031661394e565b90505f82606001518360400151612767919061396d565b60408401516034805492935090915f9061278b9084906001600160401b031661394e565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f91506127db90633b9aca009085166137e1565b90505f6127f0633b9aca00600785900b613a64565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b1580156128a6575f5ffd5b505af11580156128b8573d5f5f3e3d5ffd5b505050505050505050565b5f836128d0868585612da8565b1495945050505050565b5f5f600283516128ea91906138e1565b90505f816001600160401b03811115612905576129056134d7565b60405190808252806020026020018201604052801561292e578160200160208202803683370190505b5090505f5b82811015612a285760028561294883836137e1565b8151811061295857612958613782565b60200260200101518683600261296e91906137e1565b6129799060016137ce565b8151811061298957612989613782565b60200260200101516040516020016129ab929190918252602082015260400190565b60408051601f19818403018152908290526129c591613822565b602060405180830381855afa1580156129e0573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a03919061382d565b828281518110612a1557612a15613782565b6020908102919091010152600101612933565b50612a346002836138e1565b91505b8115612b47575f5b82811015612b3457600282612a5483836137e1565b81518110612a6457612a64613782565b602002602001015183836002612a7a91906137e1565b612a859060016137ce565b81518110612a9557612a95613782565b6020026020010151604051602001612ab7929190918252602082015260400190565b60408051601f1981840301815290829052612ad191613822565b602060405180830381855afa158015612aec573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612b0f919061382d565b828281518110612b2157612b21613782565b6020908102919091010152600101612a3f565b50612b406002836138e1565b9150612a37565b805f81518110612b5957612b59613782565b602002602001015192505050919050565b5f610ca182600581518110612b8157612b81613782565b6020026020010151612e7c565b5f610ca182600681518110612b8157612b81613782565b5f81600181518110611a0f57611a0f613782565b5f610ca182600281518110612b8157612b81613782565b5f60ff8216601f811115610ca157604051632cd44ac360e21b815260040160405180910390fd5b5f612c4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612ee39092919063ffffffff16565b905080515f1480612c6b575080806020019051810190612c6b91906136e0565b6112bd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611358565b5f612cd7602660016137ce565b612ce29060206137e1565b612cef6040840184613740565b905014612d0f576040516313717da960e21b815260040160405180910390fd5b5f612d1b600485613a93565b64ffffffffff169050612d74612d346040850185613740565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525089925050506020860135846128c3565b612d91576040516309bde33960e01b815260040160405180910390fd5b612d9f836020013585612ef1565b95945050505050565b5f83515f14158015612dc5575060208451612dc39190613abc565b155b612de2576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111612e7257612e06600285613abc565b5f03612e385781515f528086015160205260208260405f60026107d05a03fa612e2d575f5ffd5b600284049350612e60565b808601515f52815160205260208260405f60026107d05a03fa612e59575f5ffd5b6002840493505b612e6b6020826137ce565b9050612df3565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060610dad84845f85612f1d565b5f80612efe600484613acf565b612f09906040613af8565b64ffffffffff169050610dad84821b612e7c565b606082471015612f7e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611358565b5f5f866001600160a01b03168587604051612f999190613822565b5f6040518083038185875af1925050503d805f8114612fd3576040519150601f19603f3d011682016040523d82523d5f602084013e612fd8565b606091505b5091509150612fe987838387612ff4565b979650505050505050565b606083156130625782515f0361305b576001600160a01b0385163b61305b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611358565b5081610dad565b610dad83838151156130775781518083602001fd5b8060405162461bcd60e51b8152600401611358919061329e565b80356001600160401b03811681146130a7575f5ffd5b919050565b5f604082840312156130bc575f5ffd5b50919050565b5f5f5f606084860312156130d4575f5ffd5b6130dd84613091565b925060208401356001600160401b038111156130f7575f5ffd5b613103868287016130ac565b92505060408401356001600160401b0381111561311e575f5ffd5b61312a868287016130ac565b9150509250925092565b5f5f83601f840112613144575f5ffd5b5081356001600160401b0381111561315a575f5ffd5b6020830191508360208260051b8501011115613174575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b031215613192575f5ffd5b61319b89613091565b975060208901356001600160401b038111156131b5575f5ffd5b6131c18b828c016130ac565b97505060408901356001600160401b038111156131dc575f5ffd5b6131e88b828c01613134565b90975095505060608901356001600160401b03811115613206575f5ffd5b6132128b828c01613134565b90955093505060808901356001600160401b03811115613230575f5ffd5b61323c8b828c01613134565b999c989b5096995094979396929594505050565b5f60208284031215613260575f5ffd5b61326982613091565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6132696020830184613270565b5f5f83601f8401126132c0575f5ffd5b5081356001600160401b038111156132d6575f5ffd5b602083019150836020828501011115613174575f5ffd5b5f5f602083850312156132fe575f5ffd5b82356001600160401b03811115613313575f5ffd5b61331f858286016132b0565b90969095509350505050565b634e487b7160e01b5f52602160045260245ffd5b6003811061335b57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610ca1828461333f565b5f6020828403121561337d575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b03604084015116604083015260608301516133d0606084018261333f565b5092915050565b80151581146133e4575f5ffd5b50565b5f602082840312156133f7575f5ffd5b8135613269816133d7565b5f5f5f5f5f60608688031215613416575f5ffd5b85356001600160401b0381111561342b575f5ffd5b613437888289016132b0565b90965094505060208601356001600160401b03811115613455575f5ffd5b613461888289016132b0565b96999598509660400135949350505050565b6001600160a01b03811681146133e4575f5ffd5b80356130a781613473565b5f5f604083850312156134a3575f5ffd5b82356134ae81613473565b946020939093013593505050565b5f602082840312156134cc575f5ffd5b813561326981613473565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613513576135136134d7565b604052919050565b5f6001600160401b03821115613533576135336134d7565b5060051b60200190565b5f82601f83011261354c575f5ffd5b813561355f61355a8261351b565b6134eb565b8082825260208201915060208360051b860101925085831115613580575f5ffd5b602085015b8381101561359d578035835260209283019201613585565b5095945050505050565b5f5f5f606084860312156135b9575f5ffd5b83356001600160401b038111156135ce575f5ffd5b8401601f810186136135de575f5ffd5b80356135ec61355a8261351b565b8082825260208201915060208360051b85010192508883111561360d575f5ffd5b6020840193505b8284101561363857833561362781613473565b825260209384019390910190613614565b955050505060208401356001600160401b03811115613655575f5ffd5b6136618682870161353d565b92505061367060408501613487565b90509250925092565b5f5f5f6040848603121561368b575f5ffd5b83356001600160401b038111156136a0575f5ffd5b6136ac868287016130ac565b93505060208401356001600160401b038111156136c7575f5ffd5b6136d386828701613134565b9497909650939450505050565b5f602082840312156136f0575f5ffd5b8151613269816133d7565b5f5f8335601e19843603018112613710575f5ffd5b8301803591506001600160401b03821115613729575f5ffd5b6020019150600581901b3603821315613174575f5ffd5b5f5f8335601e19843603018112613755575f5ffd5b8301803591506001600160401b0382111561376e575f5ffd5b602001915036819003821315613174575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156137a6575f5ffd5b813564ffffffffff81168114613269575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ca157610ca16137ba565b8082028115828204841417610ca157610ca16137ba565b81810381811115610ca157610ca16137ba565b5f81518060208401855e5f93019283525090919050565b5f613269828461380b565b5f6020828403121561383d575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b608081525f61387f60808301888a613844565b82810360208401526138918188613270565b905082810360408401526138a6818688613844565b915050826060830152979650505050505050565b602081525f610dad602083018486613844565b634e487b7160e01b5f52601260045260245ffd5b5f826138ef576138ef6138cd565b500490565b6001600160401b038281168282160390811115610ca157610ca16137ba565b5f8235605e19833603018112613927575f5ffd5b9190910192915050565b5f62ffffff821680613945576139456137ba565b5f190192915050565b6001600160401b038181168382160190811115610ca157610ca16137ba565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff1982121715610ca157610ca16137ba565b805160208083015191908110156130bc575f1960209190910360031b1b16919050565b5f600182016139d0576139d06137ba565b5060010190565b5f6139e2828561380b565b6001600160801b03199390931683525050601001919050565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff82131715610ca157610ca16137ba565b5f81613a3857613a386137ba565b505f190190565b5f8160070b677fffffffffffffff198103613a5c57613a5c6137ba565b5f0392915050565b8082025f8212600160ff1b84141615613a7f57613a7f6137ba565b8181058314821517610ca157610ca16137ba565b5f64ffffffffff831680613aa957613aa96138cd565b8064ffffffffff84160491505092915050565b5f82613aca57613aca6138cd565b500690565b5f64ffffffffff831680613ae557613ae56138cd565b8064ffffffffff84160691505092915050565b64ffffffffff81811683821602908116908181146133d0576133d06137ba56fea26469706673582212209aaf8c6919a2db85d5771af020f2a2c9ccb835141fc0340c77ecd8f0cc650d6164736f6c634300081b0033",
}
// EigenPodABI is the input ABI used to generate the binding from.
@@ -86,7 +86,7 @@ var EigenPodABI = EigenPodMetaData.ABI
var EigenPodBin = EigenPodMetaData.Bin
// DeployEigenPod deploys a new Ethereum contract, binding an instance of EigenPod to it.
-func DeployEigenPod(auth *bind.TransactOpts, backend bind.ContractBackend, _ethPOS common.Address, _eigenPodManager common.Address, _GENESIS_TIME uint64) (common.Address, *types.Transaction, *EigenPod, error) {
+func DeployEigenPod(auth *bind.TransactOpts, backend bind.ContractBackend, _ethPOS common.Address, _eigenPodManager common.Address, _GENESIS_TIME uint64, _version string) (common.Address, *types.Transaction, *EigenPod, error) {
parsed, err := EigenPodMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
@@ -95,7 +95,7 @@ func DeployEigenPod(auth *bind.TransactOpts, backend bind.ContractBackend, _ethP
return common.Address{}, nil, nil, errors.New("GetABI returned nil")
}
- address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(EigenPodBin), backend, _ethPOS, _eigenPodManager, _GENESIS_TIME)
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(EigenPodBin), backend, _ethPOS, _eigenPodManager, _GENESIS_TIME, _version)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -709,6 +709,37 @@ func (_EigenPod *EigenPodCallerSession) ValidatorStatus0(pubkeyHash [32]byte) (u
return _EigenPod.Contract.ValidatorStatus0(&_EigenPod.CallOpts, pubkeyHash)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_EigenPod *EigenPodCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _EigenPod.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_EigenPod *EigenPodSession) Version() (string, error) {
+ return _EigenPod.Contract.Version(&_EigenPod.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_EigenPod *EigenPodCallerSession) Version() (string, error) {
+ return _EigenPod.Contract.Version(&_EigenPod.CallOpts)
+}
+
// WithdrawableRestakedExecutionLayerGwei is a free data retrieval call binding the contract method 0x3474aa16.
//
// Solidity: function withdrawableRestakedExecutionLayerGwei() view returns(uint64)
diff --git a/pkg/bindings/EigenPodManager/binding.go b/pkg/bindings/EigenPodManager/binding.go
index cce5cf5884..26b2330f1e 100644
--- a/pkg/bindings/EigenPodManager/binding.go
+++ b/pkg/bindings/EigenPodManager/binding.go
@@ -31,8 +31,8 @@ var (
// EigenPodManagerMetaData contains all meta data concerning the EigenPodManager contract.
var EigenPodManagerMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"\",\"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\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"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\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"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\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]}]",
- Bin: "0x610100604052348015610010575f5ffd5b50604051612a81380380612a8183398101604081905261002f9161015c565b838383836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e052610080610089565b505050506101b8565b5f54610100900460ff16156100f45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610143575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610159575f5ffd5b50565b5f5f5f5f6080858703121561016f575f5ffd5b845161017a81610145565b602086015190945061018b81610145565b604086015190935061019c81610145565b60608601519092506101ad81610145565b939692955090935050565b60805160a05160c05160e0516128496102385f395f8181610530015281816106dd015281816109e301528181610d5a01528181610e0701528181610fb4015261116d01525f81816101f001528181610ecd015261153401525f61030301525f818161034a015281816106120152818161092d015261127301526128495ff3fe6080604052600436106101ba575f3560e01c80639ba06275116100f2578063d48e889411610092578063f5d4fed311610062578063f5d4fed314610571578063f6848d2414610586578063fabc1cbc146105bf578063fe243a17146105de575f5ffd5b8063d48e8894146104d5578063debe1eab14610500578063ea4d3c9b1461051f578063f2fde38b14610552575f5ffd5b8063a3d75e09116100cd578063a3d75e0914610435578063a6a509be1461046d578063c4623ea114610482578063cd6dc687146104b6575f5ffd5b80639ba06275146103c3578063a1ca780b146103f7578063a38406a314610416575f5ffd5b8063724af4231161015d578063886f119511610138578063886f1195146103395780638da5cb5b1461036c5780639104c319146103895780639b4e4634146103b0575f5ffd5b8063724af423146102d357806374cdd798146102f257806384d8106214610325575f5ffd5b8063595c6a6711610198578063595c6a671461024e5780635ac86ab7146102625780635c975abb146102a1578063715018a6146102bf575f5ffd5b8063136439dd146101be578063292b7b2b146101df5780632eae418c1461022f575b5f5ffd5b3480156101c9575f5ffd5b506101dd6101d8366004611af5565b6105fd565b005b3480156101ea575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023a575f5ffd5b506101dd610249366004611b20565b6106d2565b348015610259575f5ffd5b506101dd610918565b34801561026d575f5ffd5b5061029161027c366004611b6e565b606654600160ff9092169190911b9081161490565b6040519015158152602001610226565b3480156102ac575f5ffd5b506066545b604051908152602001610226565b3480156102ca575f5ffd5b506101dd6109c7565b3480156102de575f5ffd5b506101dd6102ed366004611b8e565b6109d8565b3480156102fd575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b348015610330575f5ffd5b50610212610afe565b348015610344575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b348015610377575f5ffd5b506033546001600160a01b0316610212565b348015610394575f5ffd5b5061021273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6101dd6103be366004611c0a565b610b6e565b3480156103ce575f5ffd5b506102126103dd366004611c7d565b60986020525f90815260409020546001600160a01b031681565b348015610402575f5ffd5b506101dd610411366004611c98565b610c2b565b348015610421575f5ffd5b50610212610430366004611c7d565b610e73565b348015610440575f5ffd5b5061045461044f366004611c7d565b610f44565b60405167ffffffffffffffff9091168152602001610226565b348015610478575f5ffd5b506102b160995481565b34801561048d575f5ffd5b506104a161049c366004611b20565b610fa7565b60408051928352602083019190915201610226565b3480156104c1575f5ffd5b506101dd6104d0366004611cca565b611046565b3480156104e0575f5ffd5b506102b16104ef366004611c7d565b609b6020525f908152604090205481565b34801561050b575f5ffd5b506101dd61051a366004611cca565b611162565b34801561052a575f5ffd5b506102127f000000000000000000000000000000000000000000000000000000000000000081565b34801561055d575f5ffd5b506101dd61056c366004611c7d565b6111f8565b34801561057c575f5ffd5b506102b1609e5481565b348015610591575f5ffd5b506102916105a0366004611c7d565b6001600160a01b039081165f9081526098602052604090205416151590565b3480156105ca575f5ffd5b506101dd6105d9366004611af5565b611271565b3480156105e9575f5ffd5b506102b16105f8366004611cf4565b611387565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561065f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106839190611d2b565b6106a057604051631d77d47760e21b815260040160405180910390fd5b60665481811681146106c55760405163c61dca5d60e01b815260040160405180910390fd5b6106ce82611407565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461071b5760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461075857604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b03841661077f576040516339b190bb60e11b815260040160405180910390fd5b5f811361079f5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b6020526040812054908290821215610899575f6107cb83611d5e565b90505f818511156107e95750806107e28186611d78565b92506107ef565b505f9150835b5f6107fa8286611d8b565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c61939061084a9085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161088d91815260200190565b60405180910390a25050505b8015610910576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015f604051808303815f87803b1580156108f9575f5ffd5b505af115801561090b573d5f5f3e3d5ffd5b505050505b505050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561097a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099e9190611d2b565b6109bb57604051631d77d47760e21b815260040160405180910390fd5b6109c55f19611407565b565b6109cf611444565b6109c55f61149e565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a215760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610a5e57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054610a81908390611db2565b90505f811215610aa45760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610af09084815260200190565b60405180910390a250505050565b6066545f908190600190811603610b285760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031615610b5e5760405163031a852160e21b815260040160405180910390fd5b5f610b676114ef565b9250505090565b6066545f90600190811603610b965760405163840a48d560e01b815260040160405180910390fd5b335f908152609860205260409020546001600160a01b031680610bbe57610bbb6114ef565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610bf4908b908b908b908b908b90600401611e00565b5f604051808303818588803b158015610c0b575f5ffd5b505af1158015610c1d573d5f5f3e3d5ffd5b505050505050505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610c66576040516312e16d7160e11b815260040160405180910390fd5b610c6e61164a565b6001600160a01b038416610c95576040516339b190bb60e11b815260040160405180910390fd5b610ca3633b9aca0083611e4d565b15610cc1576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610cfa57604051634b692bcf60e01b815260040160405180910390fd5b5f8312610dba575f5f610d0d87866116a3565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610d9d575f5ffd5b505af1158015610daf573d5f5f3e3d5ffd5b505050505050610e62565b5f610dce8686610dc987611d5e565b6117e0565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce906064015f604051808303815f87803b158015610e4a575f5ffd5b505af1158015610e5c573d5f5f3e3d5ffd5b50505050505b50610e6d600160c955565b50505050565b6001600160a01b038082165f9081526098602052604081205490911680610f3e57610f3b836001600160a01b03165f1b60405180610940016040528061090e8152602001611f0661090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f1981840301815290829052610f209291602001611e83565b604051602081830303815290604052805190602001206118d9565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff169282019290925290610f9a57670de0b6b3a7640000610fa0565b80602001515b9392505050565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ff25760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b03851673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461102f57604051632711b74d60e11b815260040160405180910390fd5b61103986846116a3565b9150915094509492505050565b5f54610100900460ff161580801561106457505f54600160ff909116105b8061107d5750303b15801561107d57505f5460ff166001145b6110e55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611106575f805461ff0019166101001790555b61110f8361149e565b61111882611407565b801561115d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111ab5760405163f739589b60e01b815260040160405180910390fd5b80609e5f8282546111bc9190611e9f565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a15050565b611200611444565b6001600160a01b0381166112655760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110dc565b61126e8161149e565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f19190611eb2565b6001600160a01b0316336001600160a01b0316146113225760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146113495760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146113c557604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054126113ff576001600160a01b0383165f908152609b6020526040902054610f3b565b505f92915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6033546001600160a01b031633146109c55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110dc565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f60995f81546114fe90611ecd565b9091555060408051610940810190915261090e8082525f9161159b9183913391611f066020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526115879291602001611e83565b6040516020818303038152906040526118e5565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b1580156115dc575f5ffd5b505af11580156115ee573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b600260c9540361169c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016110dc565b600260c955565b5f806001600160a01b0384166116cc576040516339b190bb60e11b815260040160405180910390fd5b5f8312156116ed5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916117118383611d8b565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906117619086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098826040516117a491815260200190565b60405180910390a25f81136117c1575f5f945094505050506117d9565b5f82126117ce57816117d0565b5f5b86945094505050505b9250929050565b5f806117ec8385611d78565b90505f6117f886610f44565b90505f61181067ffffffffffffffff831684886119e7565b90505f61181d8284611ee5565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f610f3b838330611acc565b5f834710156119365760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016110dc565b81515f036119865760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016110dc565b8282516020840186f590506001600160a01b038116610fa05760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016110dc565b5f80805f19858709858702925082811083820303915050805f03611a1e57838281611a1457611a14611e39565b0492505050610fa0565b808411611a655760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016110dc565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b5f60208284031215611b05575f5ffd5b5035919050565b6001600160a01b038116811461126e575f5ffd5b5f5f5f5f60808587031215611b33575f5ffd5b8435611b3e81611b0c565b93506020850135611b4e81611b0c565b92506040850135611b5e81611b0c565b9396929550929360600135925050565b5f60208284031215611b7e575f5ffd5b813560ff81168114610fa0575f5ffd5b5f5f5f60608486031215611ba0575f5ffd5b8335611bab81611b0c565b92506020840135611bbb81611b0c565b929592945050506040919091013590565b5f5f83601f840112611bdc575f5ffd5b50813567ffffffffffffffff811115611bf3575f5ffd5b6020830191508360208285010111156117d9575f5ffd5b5f5f5f5f5f60608688031215611c1e575f5ffd5b853567ffffffffffffffff811115611c34575f5ffd5b611c4088828901611bcc565b909650945050602086013567ffffffffffffffff811115611c5f575f5ffd5b611c6b88828901611bcc565b96999598509660400135949350505050565b5f60208284031215611c8d575f5ffd5b8135610fa081611b0c565b5f5f5f60608486031215611caa575f5ffd5b8335611cb581611b0c565b95602085013595506040909401359392505050565b5f5f60408385031215611cdb575f5ffd5b8235611ce681611b0c565b946020939093013593505050565b5f5f60408385031215611d05575f5ffd5b8235611d1081611b0c565b91506020830135611d2081611b0c565b809150509250929050565b5f60208284031215611d3b575f5ffd5b81518015158114610fa0575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611d7257611d72611d4a565b505f0390565b81810381811115610f3e57610f3e611d4a565b8082018281125f831280158216821582161715611daa57611daa611d4a565b505092915050565b8181035f831280158383131683831282161715611dd157611dd1611d4a565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f611e13606083018789611dd8565b8281036020840152611e26818688611dd8565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82611e6757634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f611e97611e918386611e6c565b84611e6c565b949350505050565b80820180821115610f3e57610f3e611d4a565b5f60208284031215611ec2575f5ffd5b8151610fa081611b0c565b5f60018201611ede57611ede611d4a565b5060010190565b67ffffffffffffffff8281168282160390811115610f3e57610f3e611d4a56fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201402c8076f8df6145cb1637f9c11b36af8aabf01044261cf9f93dcfaf9c3c9b564736f6c634300081b0033",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"\",\"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\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"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\":\"renounceOwnership\",\"inputs\":[],\"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\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"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\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"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\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
+ Bin: "0x610120604052348015610010575f5ffd5b50604051612d25380380612d2583398101604081905261002f916101c2565b80858585856001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e05261008281610099565b610100525061008f6100df565b505050505061031a565b5f5f829050601f815111156100cc578260405163305a27a960e01b81526004016100c391906102bf565b60405180910390fd5b80516100d7826102f4565b179392505050565b5f54610100900460ff16156101465760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100c3565b5f5460ff90811614610195575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ab575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f60a086880312156101d6575f5ffd5b85516101e181610197565b60208701519095506101f281610197565b604087015190945061020381610197565b606087015190935061021481610197565b60808701519092506001600160401b0381111561022f575f5ffd5b8601601f8101881361023f575f5ffd5b80516001600160401b03811115610258576102586101ae565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610286576102866101ae565b6040528181528282016020018a101561029d575f5ffd5b8160208401602083015e5f602083830101528093505050509295509295909350565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610314575f198160200360031b1b821691505b50919050565b60805160a05160c05160e051610100516129816103a45f395f610a0e01525f818161055c015281816107090152818161096401528181610b0301528181610eb301528181610f6001526111f401525f81816101fb01528181610ff601526117a601525f61036301525f81816103aa0152818161063e01528181610a4c015261130801526129815ff3fe6080604052600436106101c5575f3560e01c80639b4e4634116100f2578063d48e889411610092578063f5d4fed311610062578063f5d4fed31461059d578063f6848d24146105b2578063fabc1cbc146105eb578063fe243a171461060a575f5ffd5b8063d48e889414610501578063debe1eab1461052c578063ea4d3c9b1461054b578063f2fde38b1461057e575f5ffd5b8063a38406a3116100cd578063a38406a314610476578063a3d75e0914610495578063a6a509be146104cd578063cd6dc687146104e2575f5ffd5b80639b4e4634146104105780639ba0627514610423578063a1ca780b14610457575f5ffd5b80635c975abb1161016857806384d810621161013857806384d8106214610385578063886f1195146103995780638da5cb5b146103cc5780639104c319146103e9575f5ffd5b80635c975abb14610301578063715018a61461031f578063724af4231461033357806374cdd79814610352575f5ffd5b806350ff7225116101a357806350ff72251461025957806354fd4d501461028d578063595c6a67146102ae5780635ac86ab7146102c2575f5ffd5b8063136439dd146101c9578063292b7b2b146101ea5780632eae418c1461023a575b5f5ffd5b3480156101d4575f5ffd5b506101e86101e3366004611bf8565b610629565b005b3480156101f5575f5ffd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610245575f5ffd5b506101e8610254366004611c23565b6106fe565b348015610264575f5ffd5b50610278610273366004611c71565b610957565b60408051928352602083019190915201610231565b348015610298575f5ffd5b506102a1610a07565b6040516102319190611caf565b3480156102b9575f5ffd5b506101e8610a37565b3480156102cd575f5ffd5b506102f16102dc366004611ce4565b606654600160ff9092169190911b9081161490565b6040519015158152602001610231565b34801561030c575f5ffd5b506066545b604051908152602001610231565b34801561032a575f5ffd5b506101e8610ae6565b34801561033e575f5ffd5b5061031161034d366004611c71565b610af7565b34801561035d575f5ffd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000081565b348015610390575f5ffd5b5061021d610c33565b3480156103a4575f5ffd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103d7575f5ffd5b506033546001600160a01b031661021d565b3480156103f4575f5ffd5b5061021d73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6101e861041e366004611d42565b610cb5565b34801561042e575f5ffd5b5061021d61043d366004611db5565b60986020525f90815260409020546001600160a01b031681565b348015610462575f5ffd5b506101e8610471366004611dd0565b610d84565b348015610481575f5ffd5b5061021d610490366004611db5565b610f9c565b3480156104a0575f5ffd5b506104b46104af366004611db5565b61106d565b60405167ffffffffffffffff9091168152602001610231565b3480156104d8575f5ffd5b5061031160995481565b3480156104ed575f5ffd5b506101e86104fc366004611e02565b6110cd565b34801561050c575f5ffd5b5061031161051b366004611db5565b609b6020525f908152604090205481565b348015610537575f5ffd5b506101e8610546366004611e02565b6111e9565b348015610556575f5ffd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000081565b348015610589575f5ffd5b506101e8610598366004611db5565b61128d565b3480156105a8575f5ffd5b50610311609e5481565b3480156105bd575f5ffd5b506102f16105cc366004611db5565b6001600160a01b039081165f9081526098602052604090205416151590565b3480156105f6575f5ffd5b506101e8610605366004611bf8565b611306565b348015610615575f5ffd5b50610311610624366004611e2c565b61141c565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561068b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106af9190611e63565b6106cc57604051631d77d47760e21b815260040160405180910390fd5b60665481811681146106f15760405163c61dca5d60e01b815260040160405180910390fd5b6106fa8261149c565b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107475760405163f739589b60e01b815260040160405180910390fd5b61074f6114d9565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461078c57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0384166107b3576040516339b190bb60e11b815260040160405180910390fd5b5f81136107d35760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b60205260408120549082908212156108cd575f6107ff83611e96565b90505f8185111561081d5750806108168186611eb0565b9250610823565b505f9150835b5f61082e8286611ec3565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c61939061087e9085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098826040516108c191815260200190565b60405180910390a25050505b8015610945576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015b5f604051808303815f87803b15801561092e575f5ffd5b505af1158015610940573d5f5f3e3d5ffd5b505050505b5050610951600160c955565b50505050565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109a25760405163f739589b60e01b815260040160405180910390fd5b6109aa6114d9565b6001600160a01b03841673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146109e757604051632711b74d60e11b815260040160405180910390fd5b6109f18584611532565b915091506109ff600160c955565b935093915050565b6060610a327f0000000000000000000000000000000000000000000000000000000000000000611679565b905090565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a99573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abd9190611e63565b610ada57604051631d77d47760e21b815260040160405180910390fd5b610ae45f1961149c565b565b610aee6116b6565b610ae45f611710565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b415760405163f739589b60e01b815260040160405180910390fd5b610b496114d9565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610b8657604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b6020526040812054610ba9908490611eea565b90505f811215610bcc5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0385165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610c189084815260200190565b60405180910390a29050610c2c600160c955565b9392505050565b6066545f908190600190811603610c5d5760405163840a48d560e01b815260040160405180910390fd5b610c656114d9565b335f908152609860205260409020546001600160a01b031615610c9b5760405163031a852160e21b815260040160405180910390fd5b5f610ca4611761565b925050610cb1600160c955565b5090565b6066545f90600190811603610cdd5760405163840a48d560e01b815260040160405180910390fd5b610ce56114d9565b335f908152609860205260409020546001600160a01b031680610d0d57610d0a611761565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610d43908b908b908b908b908b90600401611f38565b5f604051808303818588803b158015610d5a575f5ffd5b505af1158015610d6c573d5f5f3e3d5ffd5b505050505050610d7c600160c955565b505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610dbf576040516312e16d7160e11b815260040160405180910390fd5b610dc76114d9565b6001600160a01b038416610dee576040516339b190bb60e11b815260040160405180910390fd5b610dfc633b9aca0083611f85565b15610e1a576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610e5357604051634b692bcf60e01b815260040160405180910390fd5b5f8312610f13575f5f610e668786611532565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610ef6575f5ffd5b505af1158015610f08573d5f5f3e3d5ffd5b505050505050610f91565b5f610f278686610f2287611e96565b6118bc565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce90606401610917565b50610951600160c955565b6001600160a01b038082165f908152609860205260408120549091168061106757611064836001600160a01b03165f1b60405180610940016040528061090e815260200161203e61090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526110499291602001611fbb565b604051602081830303815290604052805190602001206119b5565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff1692820192909252906110c357670de0b6b3a7640000610c2c565b6020015192915050565b5f54610100900460ff16158080156110eb57505f54600160ff909116105b806111045750303b15801561110457505f5460ff166001145b61116c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561118d575f805461ff0019166101001790555b61119683611710565b61119f8261149c565b80156111e4575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112325760405163f739589b60e01b815260040160405180910390fd5b61123a6114d9565b80609e5f82825461124b9190611fd7565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a16106fa600160c955565b6112956116b6565b6001600160a01b0381166112fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611163565b61130381611710565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611362573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113869190611fea565b6001600160a01b0316336001600160a01b0316146113b75760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146113de5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461145a57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b602052604081205412611494576001600160a01b0383165f908152609b6020526040902054611064565b505f92915050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b600260c9540361152b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611163565b600260c955565b5f806001600160a01b03841661155b576040516339b190bb60e11b815260040160405180910390fd5b5f83121561157c5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916115a08383611ec3565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906115f09086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161163391815260200190565b60405180910390a25f8113611650575f5f94509450505050611672565b5f821215611665575f94509250611672915050565b5092508391506116729050565b9250929050565b60605f611685836119c1565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6033546001600160a01b03163314610ae45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611163565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f60995f815461177090612005565b9091555060408051610940810190915261090e8082525f9161180d918391339161203e6020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526117f99291602001611fbb565b6040516020818303038152906040526119e8565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b15801561184e575f5ffd5b505af1158015611860573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b5f806118c88385611eb0565b90505f6118d48661106d565b90505f6118ec67ffffffffffffffff83168488611aea565b90505f6118f9828461201d565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f611064838330611bcf565b5f60ff8216601f81111561106757604051632cd44ac360e21b815260040160405180910390fd5b5f83471015611a395760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401611163565b81515f03611a895760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401611163565b8282516020840186f590506001600160a01b038116610c2c5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401611163565b5f80805f19858709858702925082811083820303915050805f03611b2157838281611b1757611b17611f71565b0492505050610c2c565b808411611b685760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606401611163565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b5f60208284031215611c08575f5ffd5b5035919050565b6001600160a01b0381168114611303575f5ffd5b5f5f5f5f60808587031215611c36575f5ffd5b8435611c4181611c0f565b93506020850135611c5181611c0f565b92506040850135611c6181611c0f565b9396929550929360600135925050565b5f5f5f60608486031215611c83575f5ffd5b8335611c8e81611c0f565b92506020840135611c9e81611c0f565b929592945050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215611cf4575f5ffd5b813560ff81168114610c2c575f5ffd5b5f5f83601f840112611d14575f5ffd5b50813567ffffffffffffffff811115611d2b575f5ffd5b602083019150836020828501011115611672575f5ffd5b5f5f5f5f5f60608688031215611d56575f5ffd5b853567ffffffffffffffff811115611d6c575f5ffd5b611d7888828901611d04565b909650945050602086013567ffffffffffffffff811115611d97575f5ffd5b611da388828901611d04565b96999598509660400135949350505050565b5f60208284031215611dc5575f5ffd5b8135610c2c81611c0f565b5f5f5f60608486031215611de2575f5ffd5b8335611ded81611c0f565b95602085013595506040909401359392505050565b5f5f60408385031215611e13575f5ffd5b8235611e1e81611c0f565b946020939093013593505050565b5f5f60408385031215611e3d575f5ffd5b8235611e4881611c0f565b91506020830135611e5881611c0f565b809150509250929050565b5f60208284031215611e73575f5ffd5b81518015158114610c2c575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611eaa57611eaa611e82565b505f0390565b8181038181111561106757611067611e82565b8082018281125f831280158216821582161715611ee257611ee2611e82565b505092915050565b8181035f831280158383131683831282161715611f0957611f09611e82565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f611f4b606083018789611f10565b8281036020840152611f5e818688611f10565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82611f9f57634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f611fcf611fc98386611fa4565b84611fa4565b949350505050565b8082018082111561106757611067611e82565b5f60208284031215611ffa575f5ffd5b8151610c2c81611c0f565b5f6001820161201657612016611e82565b5060010190565b67ffffffffffffffff828116828216039081111561106757611067611e8256fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220eeb19427ff39aa2352b31b9ae3c9d2809b2c5f4dfd92af4c50320074f776fd0564736f6c634300081b0033",
}
// EigenPodManagerABI is the input ABI used to generate the binding from.
@@ -44,7 +44,7 @@ var EigenPodManagerABI = EigenPodManagerMetaData.ABI
var EigenPodManagerBin = EigenPodManagerMetaData.Bin
// DeployEigenPodManager deploys a new Ethereum contract, binding an instance of EigenPodManager to it.
-func DeployEigenPodManager(auth *bind.TransactOpts, backend bind.ContractBackend, _ethPOS common.Address, _eigenPodBeacon common.Address, _delegationManager common.Address, _pauserRegistry common.Address) (common.Address, *types.Transaction, *EigenPodManager, error) {
+func DeployEigenPodManager(auth *bind.TransactOpts, backend bind.ContractBackend, _ethPOS common.Address, _eigenPodBeacon common.Address, _delegationManager common.Address, _pauserRegistry common.Address, _version string) (common.Address, *types.Transaction, *EigenPodManager, error) {
parsed, err := EigenPodManagerMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
@@ -53,7 +53,7 @@ func DeployEigenPodManager(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(EigenPodManagerBin), backend, _ethPOS, _eigenPodBeacon, _delegationManager, _pauserRegistry)
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(EigenPodManagerBin), backend, _ethPOS, _eigenPodBeacon, _delegationManager, _pauserRegistry, _version)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -698,25 +698,56 @@ func (_EigenPodManager *EigenPodManagerCallerSession) StakerDepositShares(user c
return _EigenPodManager.Contract.StakerDepositShares(&_EigenPodManager.CallOpts, user, strategy)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
//
-// Solidity: function addShares(address staker, address strategy, address , uint256 shares) returns(uint256, uint256)
-func (_EigenPodManager *EigenPodManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, arg2 common.Address, shares *big.Int) (*types.Transaction, error) {
- return _EigenPodManager.contract.Transact(opts, "addShares", staker, strategy, arg2, shares)
+// Solidity: function version() view returns(string)
+func (_EigenPodManager *EigenPodManagerCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _EigenPodManager.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_EigenPodManager *EigenPodManagerSession) Version() (string, error) {
+ return _EigenPodManager.Contract.Version(&_EigenPodManager.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_EigenPodManager *EigenPodManagerCallerSession) Version() (string, error) {
+ return _EigenPodManager.Contract.Version(&_EigenPodManager.CallOpts)
+}
+
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
+//
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_EigenPodManager *EigenPodManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _EigenPodManager.contract.Transact(opts, "addShares", staker, strategy, shares)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address , uint256 shares) returns(uint256, uint256)
-func (_EigenPodManager *EigenPodManagerSession) AddShares(staker common.Address, strategy common.Address, arg2 common.Address, shares *big.Int) (*types.Transaction, error) {
- return _EigenPodManager.Contract.AddShares(&_EigenPodManager.TransactOpts, staker, strategy, arg2, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_EigenPodManager *EigenPodManagerSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _EigenPodManager.Contract.AddShares(&_EigenPodManager.TransactOpts, staker, strategy, shares)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address , uint256 shares) returns(uint256, uint256)
-func (_EigenPodManager *EigenPodManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, arg2 common.Address, shares *big.Int) (*types.Transaction, error) {
- return _EigenPodManager.Contract.AddShares(&_EigenPodManager.TransactOpts, staker, strategy, arg2, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_EigenPodManager *EigenPodManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _EigenPodManager.Contract.AddShares(&_EigenPodManager.TransactOpts, staker, strategy, shares)
}
// CreatePod is a paid mutator transaction binding the contract method 0x84d81062.
@@ -847,21 +878,21 @@ func (_EigenPodManager *EigenPodManagerTransactorSession) RecordBeaconChainETHBa
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_EigenPodManager *EigenPodManagerTransactor) RemoveDepositShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _EigenPodManager.contract.Transact(opts, "removeDepositShares", staker, strategy, depositSharesToRemove)
}
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_EigenPodManager *EigenPodManagerSession) RemoveDepositShares(staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _EigenPodManager.Contract.RemoveDepositShares(&_EigenPodManager.TransactOpts, staker, strategy, depositSharesToRemove)
}
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_EigenPodManager *EigenPodManagerTransactorSession) RemoveDepositShares(staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _EigenPodManager.Contract.RemoveDepositShares(&_EigenPodManager.TransactOpts, staker, strategy, depositSharesToRemove)
}
diff --git a/pkg/bindings/EigenPodManagerStorage/binding.go b/pkg/bindings/EigenPodManagerStorage/binding.go
index dc79af2e92..06d2116cf6 100644
--- a/pkg/bindings/EigenPodManagerStorage/binding.go
+++ b/pkg/bindings/EigenPodManagerStorage/binding.go
@@ -31,7 +31,7 @@ var (
// EigenPodManagerStorageMetaData contains all meta data concerning the EigenPodManagerStorage contract.
var EigenPodManagerStorageMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"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\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"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\":[],\"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\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"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\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"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\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"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\":\"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\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"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\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]}]",
}
// EigenPodManagerStorageABI is the input ABI used to generate the binding from.
@@ -645,25 +645,56 @@ func (_EigenPodManagerStorage *EigenPodManagerStorageCallerSession) StakerDeposi
return _EigenPodManagerStorage.Contract.StakerDepositShares(&_EigenPodManagerStorage.CallOpts, user, strategy)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _EigenPodManagerStorage.contract.Transact(opts, "addShares", staker, strategy, token, shares)
+// Solidity: function version() view returns(string)
+func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _EigenPodManagerStorage.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_EigenPodManagerStorage *EigenPodManagerStorageSession) Version() (string, error) {
+ return _EigenPodManagerStorage.Contract.Version(&_EigenPodManagerStorage.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_EigenPodManagerStorage *EigenPodManagerStorageCallerSession) Version() (string, error) {
+ return _EigenPodManagerStorage.Contract.Version(&_EigenPodManagerStorage.CallOpts)
+}
+
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
+//
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _EigenPodManagerStorage.contract.Transact(opts, "addShares", staker, strategy, shares)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_EigenPodManagerStorage *EigenPodManagerStorageSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _EigenPodManagerStorage.Contract.AddShares(&_EigenPodManagerStorage.TransactOpts, staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_EigenPodManagerStorage *EigenPodManagerStorageSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _EigenPodManagerStorage.Contract.AddShares(&_EigenPodManagerStorage.TransactOpts, staker, strategy, shares)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_EigenPodManagerStorage *EigenPodManagerStorageTransactorSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _EigenPodManagerStorage.Contract.AddShares(&_EigenPodManagerStorage.TransactOpts, staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_EigenPodManagerStorage *EigenPodManagerStorageTransactorSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _EigenPodManagerStorage.Contract.AddShares(&_EigenPodManagerStorage.TransactOpts, staker, strategy, shares)
}
// CreatePod is a paid mutator transaction binding the contract method 0x84d81062.
@@ -773,21 +804,21 @@ func (_EigenPodManagerStorage *EigenPodManagerStorageTransactorSession) RecordBe
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) RemoveDepositShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _EigenPodManagerStorage.contract.Transact(opts, "removeDepositShares", staker, strategy, depositSharesToRemove)
}
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_EigenPodManagerStorage *EigenPodManagerStorageSession) RemoveDepositShares(staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _EigenPodManagerStorage.Contract.RemoveDepositShares(&_EigenPodManagerStorage.TransactOpts, staker, strategy, depositSharesToRemove)
}
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_EigenPodManagerStorage *EigenPodManagerStorageTransactorSession) RemoveDepositShares(staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _EigenPodManagerStorage.Contract.RemoveDepositShares(&_EigenPodManagerStorage.TransactOpts, staker, strategy, depositSharesToRemove)
}
diff --git a/pkg/bindings/EigenPodStorage/binding.go b/pkg/bindings/EigenPodStorage/binding.go
index 4a572d34b8..4d87dd4311 100644
--- a/pkg/bindings/EigenPodStorage/binding.go
+++ b/pkg/bindings/EigenPodStorage/binding.go
@@ -73,7 +73,7 @@ type IEigenPodTypesValidatorInfo 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\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"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\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"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\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"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\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"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\":\"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\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"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\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"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\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"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\":\"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.
@@ -625,6 +625,37 @@ func (_EigenPodStorage *EigenPodStorageCallerSession) ValidatorStatus0(pubkeyHas
return _EigenPodStorage.Contract.ValidatorStatus0(&_EigenPodStorage.CallOpts, pubkeyHash)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_EigenPodStorage *EigenPodStorageCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _EigenPodStorage.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_EigenPodStorage *EigenPodStorageSession) Version() (string, error) {
+ return _EigenPodStorage.Contract.Version(&_EigenPodStorage.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_EigenPodStorage *EigenPodStorageCallerSession) Version() (string, error) {
+ return _EigenPodStorage.Contract.Version(&_EigenPodStorage.CallOpts)
+}
+
// WithdrawableRestakedExecutionLayerGwei is a free data retrieval call binding the contract method 0x3474aa16.
//
// Solidity: function withdrawableRestakedExecutionLayerGwei() view returns(uint64)
diff --git a/pkg/bindings/EigenStrategy/binding.go b/pkg/bindings/EigenStrategy/binding.go
index 51b49b921f..a4a84b8805 100644
--- a/pkg/bindings/EigenStrategy/binding.go
+++ b/pkg/bindings/EigenStrategy/binding.go
@@ -31,8 +31,8 @@ var (
// EigenStrategyMetaData contains all meta data concerning the EigenStrategy contract.
var EigenStrategyMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]",
- Bin: "0x60c060405234801561000f575f5ffd5b5060405161168d38038061168d83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516114bb6101d25f395f818161018b0152818161043e01528181610871015261090e01525f81816102540152818161034b0152818161066a0152610a3c01526114bb5ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063886f1195116100b4578063ce7c2ac211610079578063ce7c2ac2146102c4578063d9caed12146102d7578063e3dae51c146102ea578063f3e73875146102fd578063fabc1cbc14610310578063fdc371ce14610323575f5ffd5b8063886f11951461024f5780638c871019146102765780638f6a624014610289578063ab5921e11461029c578063c4d66de8146102b1575f5ffd5b8063485cc95511610105578063485cc955146101d7578063553ca5f8146101ea578063595c6a67146101fd5780635ac86ab7146102055780635c975abb146102345780637a8b26371461023c575f5ffd5b8063136439dd146101415780632495a5991461015657806339b70e38146101865780633a98ef39146101ad57806347e7ef24146101c4575b5f5ffd5b61015461014f3660046111ab565b610336565b005b603254610169906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b660335481565b60405190815260200161017d565b6101b66101d23660046111d9565b61040b565b6101546101e5366004611203565b610557565b6101b66101f836600461123a565b610642565b610154610655565b61022461021336600461126a565b6001805460ff9092161b9081161490565b604051901515815260200161017d565b6001546101b6565b6101b661024a3660046111ab565b610704565b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b66102843660046111ab565b61074d565b6101b661029736600461123a565b610757565b6102a4610764565b60405161017d9190611285565b6101546102bf36600461123a565b610784565b6101b66102d236600461123a565b61084a565b6101546102e53660046112ba565b6108dc565b6101b66102f83660046111ab565b6109f9565b6101b661030b3660046111ab565b610a30565b61015461031e3660046111ab565b610a3a565b606454610169906001600160a01b031681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610398573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103bc91906112f8565b6103d957604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103fe5760405163c61dca5d60e01b815260040160405180910390fd5b61040782610b50565b5050565b600180545f9182918116036104335760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461047c576040516348da714f60e01b815260040160405180910390fd5b6104868484610b8d565b6033545f6104966103e88361132b565b90505f6103e86104a4610c46565b6104ae919061132b565b90505f6104bb878361133e565b9050806104c88489611351565b6104d29190611368565b9550855f036104f457604051630c392ed360e11b815260040160405180910390fd5b6104fe868561132b565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561053357604051632f14e8a360e11b815260040160405180910390fd5b61054c826103e8603354610547919061132b565b610cb5565b505050505092915050565b5f54610100900460ff161580801561057557505f54600160ff909116105b8061058e5750303b15801561058e57505f5460ff166001145b6105b35760405162461bcd60e51b81526004016105aa90611387565b60405180910390fd5b5f805460ff1916600117905580156105d4575f805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0385161790556105f882610d01565b801561063d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f61064f61024a8361084a565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906112f8565b6106f857604051631d77d47760e21b815260040160405180910390fd5b6107025f19610b50565b565b5f5f6103e8603354610716919061132b565b90505f6103e8610724610c46565b61072e919061132b565b90508161073b8583611351565b6107459190611368565b949350505050565b5f61064f826109f9565b5f61064f61030b8361084a565b60606040518060800160405280604d8152602001611439604d9139905090565b5f54610100900460ff16158080156107a257505f54600160ff909116105b806107bb5750303b1580156107bb57505f5460ff166001145b6107d75760405162461bcd60e51b81526004016105aa90611387565b5f805460ff1916600117905580156107f8575f805461ff0019166101001790555b61080182610d01565b8015610407575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156108b8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064f91906113d5565b600180546002908116036109035760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094c576040516348da714f60e01b815260040160405180910390fd5b610957848484610e4c565b6033548083111561097b57604051630b469df360e41b815260040160405180910390fd5b5f6109886103e88361132b565b90505f6103e8610996610c46565b6109a0919061132b565b90505f826109ae8784611351565b6109b89190611368565b90506109c4868561133e565b6033556109e46109d4828461133e565b6103e8603354610547919061132b565b6109ef888883610e92565b5050505050505050565b5f5f6103e8603354610a0b919061132b565b90505f6103e8610a19610c46565b610a23919061132b565b90508061073b8386611351565b5f61064f82610704565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a96573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba91906113ec565b6001600160a01b0316336001600160a01b031614610aeb5760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610b125760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b0383811691161480610bb657506064546001600160a01b038381169116145b610bd357604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b039081169083160361040757606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e906024015f604051808303815f87803b158015610c2c575f5ffd5b505af1158015610c3e573d5f5f3e3d5ffd5b505050505050565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c8c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb091906113d5565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610ce984670de0b6b3a7640000611351565b610cf39190611368565b60405190815260200161083e565b5f54610100900460ff16610d6b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016105aa565b603280546001600160a01b0319166001600160a01b038316179055610d8f5f610b50565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e01573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e259190611407565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b0383811691161480610e7557506064546001600160a01b038381169116145b61063d57604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610f775760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303815f875af1158015610ef8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1c91906112f8565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb0906024015f604051808303815f87803b158015610f60575f5ffd5b505af1158015610f72573d5f5f3e3d5ffd5b505050505b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261063d92908516918691859185918591905f9061100f908490849061108e565b905080515f148061102f57508080602001905181019061102f91906112f8565b61063d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105aa565b606061074584845f85855f5f866001600160a01b031685876040516110b39190611422565b5f6040518083038185875af1925050503d805f81146110ed576040519150601f19603f3d011682016040523d82523d5f602084013e6110f2565b606091505b50915091506111038783838761110e565b979650505050505050565b6060831561117c5782515f03611175576001600160a01b0385163b6111755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105aa565b5081610745565b61074583838151156111915781518083602001fd5b8060405162461bcd60e51b81526004016105aa9190611285565b5f602082840312156111bb575f5ffd5b5035919050565b6001600160a01b03811681146111d6575f5ffd5b50565b5f5f604083850312156111ea575f5ffd5b82356111f5816111c2565b946020939093013593505050565b5f5f60408385031215611214575f5ffd5b823561121f816111c2565b9150602083013561122f816111c2565b809150509250929050565b5f6020828403121561124a575f5ffd5b8135611255816111c2565b9392505050565b60ff811681146111d6575f5ffd5b5f6020828403121561127a575f5ffd5b81356112558161125c565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f606084860312156112cc575f5ffd5b83356112d7816111c2565b925060208401356112e7816111c2565b929592945050506040919091013590565b5f60208284031215611308575f5ffd5b81518015158114611255575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561064f5761064f611317565b8181038181111561064f5761064f611317565b808202811582820484141761064f5761064f611317565b5f8261138257634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156113e5575f5ffd5b5051919050565b5f602082840312156113fc575f5ffd5b8151611255816111c2565b5f60208284031215611417575f5ffd5b81516112558161125c565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122052943963226976a63c5a1414ed2810072da5b101d7f5ff32cd8d607d79b9edda64736f6c634300081b0033",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]",
+ Bin: "0x60e060405234801561000f575f5ffd5b506040516118a93803806118a983398101604081905261002e916101bc565b82828280826001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261006f81610093565b60a052506001600160a01b03831660c0526100886100d9565b5050505050506102ed565b5f5f829050601f815111156100c6578260405163305a27a960e01b81526004016100bd9190610292565b60405180910390fd5b80516100d1826102c7565b179392505050565b5f54610100900460ff16156101405760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100bd565b5f5460ff9081161461018f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101a5575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101ce575f5ffd5b83516101d981610191565b60208501519093506101ea81610191565b60408501519092506001600160401b03811115610205575f5ffd5b8401601f81018613610215575f5ffd5b80516001600160401b0381111561022e5761022e6101a8565b604051601f8201601f19908116603f011681016001600160401b038111828210171561025c5761025c6101a8565b604052818152828201602001881015610273575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102e7575f198160200360031b1b821691505b50919050565b60805160a05160c0516115686103415f395f818161019601528181610451015281816108b4015261095101525f61065c01525f81816102740152818161035e015281816106ad0152610a7f01526115685ff3fe608060405234801561000f575f5ffd5b5060043610610148575f3560e01c80637a8b2637116100bf578063ce7c2ac211610079578063ce7c2ac2146102d7578063d9caed12146102ea578063e3dae51c146102fd578063f3e7387514610310578063fabc1cbc14610323578063fdc371ce14610336575f5ffd5b80637a8b26371461025c578063886f11951461026f5780638c871019146102965780638f6a6240146102a9578063ab5921e1146102bc578063c4d66de8146102c4575f5ffd5b8063485cc95511610110578063485cc955146101e257806354fd4d50146101f5578063553ca5f81461020a578063595c6a671461021d5780635ac86ab7146102255780635c975abb14610254575f5ffd5b8063136439dd1461014c5780632495a5991461016157806339b70e38146101915780633a98ef39146101b857806347e7ef24146101cf575b5f5ffd5b61015f61015a366004611258565b610349565b005b603254610174906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101747f000000000000000000000000000000000000000000000000000000000000000081565b6101c160335481565b604051908152602001610188565b6101c16101dd366004611286565b61041e565b61015f6101f03660046112b0565b61056a565b6101fd610655565b60405161018891906112e7565b6101c161021836600461131c565b610685565b61015f610698565b61024461023336600461134c565b6001805460ff9092161b9081161490565b6040519015158152602001610188565b6001546101c1565b6101c161026a366004611258565b610747565b6101747f000000000000000000000000000000000000000000000000000000000000000081565b6101c16102a4366004611258565b610790565b6101c16102b736600461131c565b61079a565b6101fd6107a7565b61015f6102d236600461131c565b6107c7565b6101c16102e536600461131c565b61088d565b61015f6102f8366004611367565b61091f565b6101c161030b366004611258565b610a3c565b6101c161031e366004611258565b610a73565b61015f610331366004611258565b610a7d565b606454610174906001600160a01b031681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156103ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103cf91906113a5565b6103ec57604051631d77d47760e21b815260040160405180910390fd5b60015481811681146104115760405163c61dca5d60e01b815260040160405180910390fd5b61041a82610b93565b5050565b600180545f9182918116036104465760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461048f576040516348da714f60e01b815260040160405180910390fd5b6104998484610bd0565b6033545f6104a96103e8836113d8565b90505f6103e86104b7610c89565b6104c191906113d8565b90505f6104ce87836113eb565b9050806104db84896113fe565b6104e59190611415565b9550855f0361050757604051630c392ed360e11b815260040160405180910390fd5b61051186856113d8565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561054657604051632f14e8a360e11b815260040160405180910390fd5b61055f826103e860335461055a91906113d8565b610cf3565b505050505092915050565b5f54610100900460ff161580801561058857505f54600160ff909116105b806105a15750303b1580156105a157505f5460ff166001145b6105c65760405162461bcd60e51b81526004016105bd90611434565b60405180910390fd5b5f805460ff1916600117905580156105e7575f805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b03851617905561060b82610d3f565b8015610650575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60606106807f0000000000000000000000000000000000000000000000000000000000000000610e8a565b905090565b5f61069261026a8361088d565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061071e91906113a5565b61073b57604051631d77d47760e21b815260040160405180910390fd5b6107455f19610b93565b565b5f5f6103e860335461075991906113d8565b90505f6103e8610767610c89565b61077191906113d8565b90508161077e85836113fe565b6107889190611415565b949350505050565b5f61069282610a3c565b5f61069261031e8361088d565b60606040518060800160405280604d81526020016114e6604d9139905090565b5f54610100900460ff16158080156107e557505f54600160ff909116105b806107fe5750303b1580156107fe57505f5460ff166001145b61081a5760405162461bcd60e51b81526004016105bd90611434565b5f805460ff19166001179055801561083b575f805461ff0019166101001790555b61084482610d3f565b801561041a575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156108fb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106929190611482565b600180546002908116036109465760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461098f576040516348da714f60e01b815260040160405180910390fd5b61099a848484610ec7565b603354808311156109be57604051630b469df360e41b815260040160405180910390fd5b5f6109cb6103e8836113d8565b90505f6103e86109d9610c89565b6109e391906113d8565b90505f826109f187846113fe565b6109fb9190611415565b9050610a0786856113eb565b603355610a27610a1782846113eb565b6103e860335461055a91906113d8565b610a32888883610f0d565b5050505050505050565b5f5f6103e8603354610a4e91906113d8565b90505f6103e8610a5c610c89565b610a6691906113d8565b90508061077e83866113fe565b5f61069282610747565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610afd9190611499565b6001600160a01b0316336001600160a01b031614610b2e5760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610b555760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b0383811691161480610bf957506064546001600160a01b038381169116145b610c1657604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b039081169083160361041a57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e906024015f604051808303815f87803b158015610c6f575f5ffd5b505af1158015610c81573d5f5f3e3d5ffd5b505050505050565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ccf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106809190611482565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610d2784670de0b6b3a76400006113fe565b610d319190611415565b604051908152602001610881565b5f54610100900460ff16610da95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016105bd565b603280546001600160a01b0319166001600160a01b038316179055610dcd5f610b93565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e3f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6391906114b4565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b60605f610e9683611006565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6032546001600160a01b0383811691161480610ef057506064546001600160a01b038381169116145b61065057604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610ff25760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303815f875af1158015610f73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f9791906113a5565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb0906024015f604051808303815f87803b158015610fdb575f5ffd5b505af1158015610fed573d5f5f3e3d5ffd5b505050505b6106506001600160a01b038316848361102d565b5f60ff8216601f81111561069257604051632cd44ac360e21b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610650928692915f916110bc91851690849061113b565b905080515f14806110dc5750808060200190518101906110dc91906113a5565b6106505760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105bd565b606061078884845f85855f5f866001600160a01b0316858760405161116091906114cf565b5f6040518083038185875af1925050503d805f811461119a576040519150601f19603f3d011682016040523d82523d5f602084013e61119f565b606091505b50915091506111b0878383876111bb565b979650505050505050565b606083156112295782515f03611222576001600160a01b0385163b6112225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105bd565b5081610788565b610788838381511561123e5781518083602001fd5b8060405162461bcd60e51b81526004016105bd91906112e7565b5f60208284031215611268575f5ffd5b5035919050565b6001600160a01b0381168114611283575f5ffd5b50565b5f5f60408385031215611297575f5ffd5b82356112a28161126f565b946020939093013593505050565b5f5f604083850312156112c1575f5ffd5b82356112cc8161126f565b915060208301356112dc8161126f565b809150509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561132c575f5ffd5b81356113378161126f565b9392505050565b60ff81168114611283575f5ffd5b5f6020828403121561135c575f5ffd5b81356113378161133e565b5f5f5f60608486031215611379575f5ffd5b83356113848161126f565b925060208401356113948161126f565b929592945050506040919091013590565b5f602082840312156113b5575f5ffd5b81518015158114611337575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610692576106926113c4565b81810381811115610692576106926113c4565b8082028115828204841417610692576106926113c4565b5f8261142f57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f60208284031215611492575f5ffd5b5051919050565b5f602082840312156114a9575f5ffd5b81516113378161126f565b5f602082840312156114c4575f5ffd5b81516113378161133e565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212201fa9d8c0e4012f90ca99cdb72cc2f24ae99141973e56d052627aa9cd6e5e947264736f6c634300081b0033",
}
// EigenStrategyABI is the input ABI used to generate the binding from.
@@ -44,7 +44,7 @@ var EigenStrategyABI = EigenStrategyMetaData.ABI
var EigenStrategyBin = EigenStrategyMetaData.Bin
// DeployEigenStrategy deploys a new Ethereum contract, binding an instance of EigenStrategy to it.
-func DeployEigenStrategy(auth *bind.TransactOpts, backend bind.ContractBackend, _strategyManager common.Address, _pauserRegistry common.Address) (common.Address, *types.Transaction, *EigenStrategy, error) {
+func DeployEigenStrategy(auth *bind.TransactOpts, backend bind.ContractBackend, _strategyManager common.Address, _pauserRegistry common.Address, _version string) (common.Address, *types.Transaction, *EigenStrategy, error) {
parsed, err := EigenStrategyMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
@@ -53,7 +53,7 @@ func DeployEigenStrategy(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(EigenStrategyBin), backend, _strategyManager, _pauserRegistry)
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(EigenStrategyBin), backend, _strategyManager, _pauserRegistry, _version)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -636,6 +636,37 @@ func (_EigenStrategy *EigenStrategyCallerSession) UserUnderlyingView(user common
return _EigenStrategy.Contract.UserUnderlyingView(&_EigenStrategy.CallOpts, user)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_EigenStrategy *EigenStrategyCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _EigenStrategy.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_EigenStrategy *EigenStrategySession) Version() (string, error) {
+ return _EigenStrategy.Contract.Version(&_EigenStrategy.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_EigenStrategy *EigenStrategyCallerSession) Version() (string, error) {
+ return _EigenStrategy.Contract.Version(&_EigenStrategy.CallOpts)
+}
+
// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
//
// Solidity: function deposit(address token, uint256 amount) returns(uint256 newShares)
diff --git a/pkg/bindings/Endian/binding.go b/pkg/bindings/Endian/binding.go
index b2a1f90fff..56dcb47600 100644
--- a/pkg/bindings/Endian/binding.go
+++ b/pkg/bindings/Endian/binding.go
@@ -32,7 +32,7 @@ var (
// EndianMetaData contains all meta data concerning the Endian contract.
var EndianMetaData = &bind.MetaData{
ABI: "[]",
- Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220d31d5c2b691cbd0a659ac6a2d7575448cb9db5c1e8b20efb6f6fe9e398049e6b64736f6c634300081b0033",
+ Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212207ab822e4bec68ffbff791aaa98829dc58d61a18245bb4328599d5053f59bc75764736f6c634300081b0033",
}
// EndianABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/IAVSDirectory/binding.go b/pkg/bindings/IAVSDirectory/binding.go
index 83dfe31453..af82ddb0f5 100644
--- a/pkg/bindings/IAVSDirectory/binding.go
+++ b/pkg/bindings/IAVSDirectory/binding.go
@@ -29,8 +29,8 @@ var (
_ = abi.ConvertType
)
-// ISignatureUtilsSignatureWithSaltAndExpiry is an auto generated low-level Go binding around an user-defined struct.
-type ISignatureUtilsSignatureWithSaltAndExpiry struct {
+// ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry is an auto generated low-level Go binding around an user-defined struct.
+type ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry struct {
Signature []byte
Salt [32]byte
Expiry *big.Int
@@ -38,7 +38,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct {
// IAVSDirectoryMetaData contains all meta data concerning the IAVSDirectory contract.
var IAVSDirectoryMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"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\":[]}]",
+ ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"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\":\"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\":\"error\",\"name\":\"InvalidSignature\",\"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\":[]}]",
}
// IAVSDirectoryABI is the input ABI used to generate the binding from.
@@ -280,6 +280,37 @@ func (_IAVSDirectory *IAVSDirectoryCallerSession) CalculateOperatorAVSRegistrati
return _IAVSDirectory.Contract.CalculateOperatorAVSRegistrationDigestHash(&_IAVSDirectory.CallOpts, operator, avs, salt, expiry)
}
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_IAVSDirectory *IAVSDirectoryCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error) {
+ var out []interface{}
+ err := _IAVSDirectory.contract.Call(opts, &out, "domainSeparator")
+
+ if err != nil {
+ return *new([32]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+ return out0, err
+
+}
+
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_IAVSDirectory *IAVSDirectorySession) DomainSeparator() ([32]byte, error) {
+ return _IAVSDirectory.Contract.DomainSeparator(&_IAVSDirectory.CallOpts)
+}
+
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_IAVSDirectory *IAVSDirectoryCallerSession) DomainSeparator() ([32]byte, error) {
+ return _IAVSDirectory.Contract.DomainSeparator(&_IAVSDirectory.CallOpts)
+}
+
// OperatorSaltIsSpent is a free data retrieval call binding the contract method 0x374823b5.
//
// Solidity: function operatorSaltIsSpent(address operator, bytes32 salt) view returns(bool)
@@ -311,6 +342,37 @@ func (_IAVSDirectory *IAVSDirectoryCallerSession) OperatorSaltIsSpent(operator c
return _IAVSDirectory.Contract.OperatorSaltIsSpent(&_IAVSDirectory.CallOpts, operator, salt)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IAVSDirectory *IAVSDirectoryCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _IAVSDirectory.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IAVSDirectory *IAVSDirectorySession) Version() (string, error) {
+ return _IAVSDirectory.Contract.Version(&_IAVSDirectory.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IAVSDirectory *IAVSDirectoryCallerSession) Version() (string, error) {
+ return _IAVSDirectory.Contract.Version(&_IAVSDirectory.CallOpts)
+}
+
// CancelSalt is a paid mutator transaction binding the contract method 0xec76f442.
//
// Solidity: function cancelSalt(bytes32 salt) returns()
@@ -377,21 +439,21 @@ func (_IAVSDirectory *IAVSDirectoryTransactorSession) Initialize(initialOwner co
// RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d.
//
// Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns()
-func (_IAVSDirectory *IAVSDirectoryTransactor) RegisterOperatorToAVS(opts *bind.TransactOpts, operator common.Address, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) {
+func (_IAVSDirectory *IAVSDirectoryTransactor) RegisterOperatorToAVS(opts *bind.TransactOpts, operator common.Address, operatorSignature ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry) (*types.Transaction, error) {
return _IAVSDirectory.contract.Transact(opts, "registerOperatorToAVS", operator, operatorSignature)
}
// RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d.
//
// Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns()
-func (_IAVSDirectory *IAVSDirectorySession) RegisterOperatorToAVS(operator common.Address, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) {
+func (_IAVSDirectory *IAVSDirectorySession) RegisterOperatorToAVS(operator common.Address, operatorSignature ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry) (*types.Transaction, error) {
return _IAVSDirectory.Contract.RegisterOperatorToAVS(&_IAVSDirectory.TransactOpts, operator, operatorSignature)
}
// RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d.
//
// Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns()
-func (_IAVSDirectory *IAVSDirectoryTransactorSession) RegisterOperatorToAVS(operator common.Address, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) {
+func (_IAVSDirectory *IAVSDirectoryTransactorSession) RegisterOperatorToAVS(operator common.Address, operatorSignature ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry) (*types.Transaction, error) {
return _IAVSDirectory.Contract.RegisterOperatorToAVS(&_IAVSDirectory.TransactOpts, operator, operatorSignature)
}
diff --git a/pkg/bindings/IAVSRegistrar/binding.go b/pkg/bindings/IAVSRegistrar/binding.go
index 98a677b7dc..6b003e18a5 100644
--- a/pkg/bindings/IAVSRegistrar/binding.go
+++ b/pkg/bindings/IAVSRegistrar/binding.go
@@ -31,7 +31,7 @@ var (
// IAVSRegistrarMetaData contains all meta data concerning the IAVSRegistrar contract.
var IAVSRegistrarMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"function\",\"name\":\"avs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avsIdentifier\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avsIdentifier\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]",
+ ABI: "[{\"type\":\"function\",\"name\":\"deregisterOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsAVS\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"}]",
}
// IAVSRegistrarABI is the input ABI used to generate the binding from.
@@ -180,75 +180,75 @@ func (_IAVSRegistrar *IAVSRegistrarTransactorRaw) Transact(opts *bind.TransactOp
return _IAVSRegistrar.Contract.contract.Transact(opts, method, params...)
}
-// Avs is a free data retrieval call binding the contract method 0xde1164bb.
+// SupportsAVS is a free data retrieval call binding the contract method 0xb5265787.
//
-// Solidity: function avs() view returns(address)
-func (_IAVSRegistrar *IAVSRegistrarCaller) Avs(opts *bind.CallOpts) (common.Address, error) {
+// Solidity: function supportsAVS(address avs) view returns(bool)
+func (_IAVSRegistrar *IAVSRegistrarCaller) SupportsAVS(opts *bind.CallOpts, avs common.Address) (bool, error) {
var out []interface{}
- err := _IAVSRegistrar.contract.Call(opts, &out, "avs")
+ err := _IAVSRegistrar.contract.Call(opts, &out, "supportsAVS", avs)
if err != nil {
- return *new(common.Address), err
+ return *new(bool), err
}
- out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
return out0, err
}
-// Avs is a free data retrieval call binding the contract method 0xde1164bb.
+// SupportsAVS is a free data retrieval call binding the contract method 0xb5265787.
//
-// Solidity: function avs() view returns(address)
-func (_IAVSRegistrar *IAVSRegistrarSession) Avs() (common.Address, error) {
- return _IAVSRegistrar.Contract.Avs(&_IAVSRegistrar.CallOpts)
+// Solidity: function supportsAVS(address avs) view returns(bool)
+func (_IAVSRegistrar *IAVSRegistrarSession) SupportsAVS(avs common.Address) (bool, error) {
+ return _IAVSRegistrar.Contract.SupportsAVS(&_IAVSRegistrar.CallOpts, avs)
}
-// Avs is a free data retrieval call binding the contract method 0xde1164bb.
+// SupportsAVS is a free data retrieval call binding the contract method 0xb5265787.
//
-// Solidity: function avs() view returns(address)
-func (_IAVSRegistrar *IAVSRegistrarCallerSession) Avs() (common.Address, error) {
- return _IAVSRegistrar.Contract.Avs(&_IAVSRegistrar.CallOpts)
+// Solidity: function supportsAVS(address avs) view returns(bool)
+func (_IAVSRegistrar *IAVSRegistrarCallerSession) SupportsAVS(avs common.Address) (bool, error) {
+ return _IAVSRegistrar.Contract.SupportsAVS(&_IAVSRegistrar.CallOpts, avs)
}
// DeregisterOperator is a paid mutator transaction binding the contract method 0x303ca956.
//
-// Solidity: function deregisterOperator(address operator, address avsIdentifier, uint32[] operatorSetIds) returns()
-func (_IAVSRegistrar *IAVSRegistrarTransactor) DeregisterOperator(opts *bind.TransactOpts, operator common.Address, avsIdentifier common.Address, operatorSetIds []uint32) (*types.Transaction, error) {
- return _IAVSRegistrar.contract.Transact(opts, "deregisterOperator", operator, avsIdentifier, operatorSetIds)
+// Solidity: function deregisterOperator(address operator, address avs, uint32[] operatorSetIds) returns()
+func (_IAVSRegistrar *IAVSRegistrarTransactor) DeregisterOperator(opts *bind.TransactOpts, operator common.Address, avs common.Address, operatorSetIds []uint32) (*types.Transaction, error) {
+ return _IAVSRegistrar.contract.Transact(opts, "deregisterOperator", operator, avs, operatorSetIds)
}
// DeregisterOperator is a paid mutator transaction binding the contract method 0x303ca956.
//
-// Solidity: function deregisterOperator(address operator, address avsIdentifier, uint32[] operatorSetIds) returns()
-func (_IAVSRegistrar *IAVSRegistrarSession) DeregisterOperator(operator common.Address, avsIdentifier common.Address, operatorSetIds []uint32) (*types.Transaction, error) {
- return _IAVSRegistrar.Contract.DeregisterOperator(&_IAVSRegistrar.TransactOpts, operator, avsIdentifier, operatorSetIds)
+// Solidity: function deregisterOperator(address operator, address avs, uint32[] operatorSetIds) returns()
+func (_IAVSRegistrar *IAVSRegistrarSession) DeregisterOperator(operator common.Address, avs common.Address, operatorSetIds []uint32) (*types.Transaction, error) {
+ return _IAVSRegistrar.Contract.DeregisterOperator(&_IAVSRegistrar.TransactOpts, operator, avs, operatorSetIds)
}
// DeregisterOperator is a paid mutator transaction binding the contract method 0x303ca956.
//
-// Solidity: function deregisterOperator(address operator, address avsIdentifier, uint32[] operatorSetIds) returns()
-func (_IAVSRegistrar *IAVSRegistrarTransactorSession) DeregisterOperator(operator common.Address, avsIdentifier common.Address, operatorSetIds []uint32) (*types.Transaction, error) {
- return _IAVSRegistrar.Contract.DeregisterOperator(&_IAVSRegistrar.TransactOpts, operator, avsIdentifier, operatorSetIds)
+// Solidity: function deregisterOperator(address operator, address avs, uint32[] operatorSetIds) returns()
+func (_IAVSRegistrar *IAVSRegistrarTransactorSession) DeregisterOperator(operator common.Address, avs common.Address, operatorSetIds []uint32) (*types.Transaction, error) {
+ return _IAVSRegistrar.Contract.DeregisterOperator(&_IAVSRegistrar.TransactOpts, operator, avs, operatorSetIds)
}
// RegisterOperator is a paid mutator transaction binding the contract method 0xc63fd502.
//
-// Solidity: function registerOperator(address operator, address avsIdentifier, uint32[] operatorSetIds, bytes data) returns()
-func (_IAVSRegistrar *IAVSRegistrarTransactor) RegisterOperator(opts *bind.TransactOpts, operator common.Address, avsIdentifier common.Address, operatorSetIds []uint32, data []byte) (*types.Transaction, error) {
- return _IAVSRegistrar.contract.Transact(opts, "registerOperator", operator, avsIdentifier, operatorSetIds, data)
+// Solidity: function registerOperator(address operator, address avs, uint32[] operatorSetIds, bytes data) returns()
+func (_IAVSRegistrar *IAVSRegistrarTransactor) RegisterOperator(opts *bind.TransactOpts, operator common.Address, avs common.Address, operatorSetIds []uint32, data []byte) (*types.Transaction, error) {
+ return _IAVSRegistrar.contract.Transact(opts, "registerOperator", operator, avs, operatorSetIds, data)
}
// RegisterOperator is a paid mutator transaction binding the contract method 0xc63fd502.
//
-// Solidity: function registerOperator(address operator, address avsIdentifier, uint32[] operatorSetIds, bytes data) returns()
-func (_IAVSRegistrar *IAVSRegistrarSession) RegisterOperator(operator common.Address, avsIdentifier common.Address, operatorSetIds []uint32, data []byte) (*types.Transaction, error) {
- return _IAVSRegistrar.Contract.RegisterOperator(&_IAVSRegistrar.TransactOpts, operator, avsIdentifier, operatorSetIds, data)
+// Solidity: function registerOperator(address operator, address avs, uint32[] operatorSetIds, bytes data) returns()
+func (_IAVSRegistrar *IAVSRegistrarSession) RegisterOperator(operator common.Address, avs common.Address, operatorSetIds []uint32, data []byte) (*types.Transaction, error) {
+ return _IAVSRegistrar.Contract.RegisterOperator(&_IAVSRegistrar.TransactOpts, operator, avs, operatorSetIds, data)
}
// RegisterOperator is a paid mutator transaction binding the contract method 0xc63fd502.
//
-// Solidity: function registerOperator(address operator, address avsIdentifier, uint32[] operatorSetIds, bytes data) returns()
-func (_IAVSRegistrar *IAVSRegistrarTransactorSession) RegisterOperator(operator common.Address, avsIdentifier common.Address, operatorSetIds []uint32, data []byte) (*types.Transaction, error) {
- return _IAVSRegistrar.Contract.RegisterOperator(&_IAVSRegistrar.TransactOpts, operator, avsIdentifier, operatorSetIds, data)
+// Solidity: function registerOperator(address operator, address avs, uint32[] operatorSetIds, bytes data) returns()
+func (_IAVSRegistrar *IAVSRegistrarTransactorSession) RegisterOperator(operator common.Address, avs common.Address, operatorSetIds []uint32, data []byte) (*types.Transaction, error) {
+ return _IAVSRegistrar.Contract.RegisterOperator(&_IAVSRegistrar.TransactOpts, operator, avs, operatorSetIds, data)
}
diff --git a/pkg/bindings/IAllocationManager/binding.go b/pkg/bindings/IAllocationManager/binding.go
index 5d5530e4fc..572b3632af 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\":\"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\":\"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\":\"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\":\"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\":\"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\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"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\":\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":\"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\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"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\":\"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\":\"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\":\"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\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"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\":\"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\":[],\"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\":\"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\":\"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.
@@ -322,6 +322,37 @@ func (_IAllocationManager *IAllocationManagerCallerSession) GetAllocatedSets(ope
return _IAllocationManager.Contract.GetAllocatedSets(&_IAllocationManager.CallOpts, operator)
}
+// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a.
+//
+// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][] slashableStake)
+func (_IAllocationManager *IAllocationManagerCaller) GetAllocatedStake(opts *bind.CallOpts, operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) {
+ var out []interface{}
+ err := _IAllocationManager.contract.Call(opts, &out, "getAllocatedStake", operatorSet, operators, strategies)
+
+ if err != nil {
+ return *new([][]*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([][]*big.Int)).(*[][]*big.Int)
+
+ return out0, err
+
+}
+
+// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a.
+//
+// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][] slashableStake)
+func (_IAllocationManager *IAllocationManagerSession) GetAllocatedStake(operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) {
+ return _IAllocationManager.Contract.GetAllocatedStake(&_IAllocationManager.CallOpts, operatorSet, operators, strategies)
+}
+
+// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a.
+//
+// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][] slashableStake)
+func (_IAllocationManager *IAllocationManagerCallerSession) GetAllocatedStake(operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error) {
+ return _IAllocationManager.Contract.GetAllocatedStake(&_IAllocationManager.CallOpts, operatorSet, operators, strategies)
+}
+
// GetAllocatedStrategies is a free data retrieval call binding the contract method 0xc221d8ae.
//
// Solidity: function getAllocatedStrategies(address operator, (address,uint32) operatorSet) view returns(address[])
@@ -460,6 +491,37 @@ func (_IAllocationManager *IAllocationManagerCallerSession) GetAllocations(opera
return _IAllocationManager.Contract.GetAllocations(&_IAllocationManager.CallOpts, operators, operatorSet, strategy)
}
+// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08.
+//
+// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64)
+func (_IAllocationManager *IAllocationManagerCaller) GetEncumberedMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error) {
+ var out []interface{}
+ err := _IAllocationManager.contract.Call(opts, &out, "getEncumberedMagnitude", operator, strategy)
+
+ if err != nil {
+ return *new(uint64), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+ return out0, err
+
+}
+
+// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08.
+//
+// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64)
+func (_IAllocationManager *IAllocationManagerSession) GetEncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) {
+ return _IAllocationManager.Contract.GetEncumberedMagnitude(&_IAllocationManager.CallOpts, operator, strategy)
+}
+
+// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08.
+//
+// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64)
+func (_IAllocationManager *IAllocationManagerCallerSession) GetEncumberedMagnitude(operator common.Address, strategy common.Address) (uint64, error) {
+ return _IAllocationManager.Contract.GetEncumberedMagnitude(&_IAllocationManager.CallOpts, operator, strategy)
+}
+
// GetMaxMagnitude is a free data retrieval call binding the contract method 0xa9333ec8.
//
// Solidity: function getMaxMagnitude(address operator, address strategy) view returns(uint64)
@@ -864,6 +926,68 @@ func (_IAllocationManager *IAllocationManagerCallerSession) IsOperatorSet(operat
return _IAllocationManager.Contract.IsOperatorSet(&_IAllocationManager.CallOpts, operatorSet)
}
+// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6.
+//
+// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool)
+func (_IAllocationManager *IAllocationManagerCaller) IsOperatorSlashable(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) (bool, error) {
+ var out []interface{}
+ err := _IAllocationManager.contract.Call(opts, &out, "isOperatorSlashable", operator, operatorSet)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6.
+//
+// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool)
+func (_IAllocationManager *IAllocationManagerSession) IsOperatorSlashable(operator common.Address, operatorSet OperatorSet) (bool, error) {
+ return _IAllocationManager.Contract.IsOperatorSlashable(&_IAllocationManager.CallOpts, operator, operatorSet)
+}
+
+// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6.
+//
+// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool)
+func (_IAllocationManager *IAllocationManagerCallerSession) IsOperatorSlashable(operator common.Address, operatorSet OperatorSet) (bool, error) {
+ return _IAllocationManager.Contract.IsOperatorSlashable(&_IAllocationManager.CallOpts, operator, operatorSet)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IAllocationManager *IAllocationManagerCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _IAllocationManager.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IAllocationManager *IAllocationManagerSession) Version() (string, error) {
+ return _IAllocationManager.Contract.Version(&_IAllocationManager.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IAllocationManager *IAllocationManagerCallerSession) Version() (string, error) {
+ return _IAllocationManager.Contract.Version(&_IAllocationManager.CallOpts)
+}
+
// AddStrategiesToOperatorSet is a paid mutator transaction binding the contract method 0x50feea20.
//
// Solidity: function addStrategiesToOperatorSet(address avs, uint32 operatorSetId, address[] strategies) returns()
diff --git a/pkg/bindings/IDelegationManager/binding.go b/pkg/bindings/IDelegationManager/binding.go
index ec7567cafc..e17213e256 100644
--- a/pkg/bindings/IDelegationManager/binding.go
+++ b/pkg/bindings/IDelegationManager/binding.go
@@ -47,15 +47,15 @@ type IDelegationManagerTypesWithdrawal struct {
ScaledShares []*big.Int
}
-// ISignatureUtilsSignatureWithExpiry is an auto generated low-level Go binding around an user-defined struct.
-type ISignatureUtilsSignatureWithExpiry struct {
+// ISignatureUtilsMixinTypesSignatureWithExpiry is an auto generated low-level Go binding around an user-defined struct.
+type ISignatureUtilsMixinTypesSignatureWithExpiry struct {
Signature []byte
Expiry *big.Int
}
// IDelegationManagerMetaData contains all meta data concerning the IDelegationManager contract.
var IDelegationManagerMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertToDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"curDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"beaconChainSlashingFactorDecrease\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositScalingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDepositedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorsShares\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawalRoots\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawals\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashableSharesInQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addedShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"__deprecated_withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"redelegate\",\"inputs\":[{\"name\":\"newOperator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newOperatorApproverSig\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"initDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allocationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"DelegationApproverUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositScalingFactorUpdated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"newDepositScalingFactor\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"sharesToWithdraw\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FullySlashed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAllocationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManagerOrEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalNotQueued\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotCaller\",\"inputs\":[]}]",
+ ABI: "[{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertToDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"curDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"beaconChainSlashingFactorDecrease\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtilsMixinTypes.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositScalingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDepositedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorsShares\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawalRoots\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawals\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashableSharesInQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addedShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"__deprecated_withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"redelegate\",\"inputs\":[{\"name\":\"newOperator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newOperatorApproverSig\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtilsMixinTypes.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"initDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allocationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"operator\",\"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\":\"DelegationApproverUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositScalingFactorUpdated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"newDepositScalingFactor\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"totalSlashedShares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"sharesToWithdraw\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FullySlashed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAllocationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManagerOrEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalNotQueued\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotCaller\",\"inputs\":[]}]",
}
// IDelegationManagerABI is the input ABI used to generate the binding from.
@@ -514,6 +514,37 @@ func (_IDelegationManager *IDelegationManagerCallerSession) DepositScalingFactor
return _IDelegationManager.Contract.DepositScalingFactor(&_IDelegationManager.CallOpts, staker, strategy)
}
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_IDelegationManager *IDelegationManagerCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error) {
+ var out []interface{}
+ err := _IDelegationManager.contract.Call(opts, &out, "domainSeparator")
+
+ if err != nil {
+ return *new([32]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+ return out0, err
+
+}
+
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_IDelegationManager *IDelegationManagerSession) DomainSeparator() ([32]byte, error) {
+ return _IDelegationManager.Contract.DomainSeparator(&_IDelegationManager.CallOpts)
+}
+
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_IDelegationManager *IDelegationManagerCallerSession) DomainSeparator() ([32]byte, error) {
+ return _IDelegationManager.Contract.DomainSeparator(&_IDelegationManager.CallOpts)
+}
+
// GetDepositedShares is a free data retrieval call binding the contract method 0x66d5ba93.
//
// Solidity: function getDepositedShares(address staker) view returns(address[], uint256[])
@@ -610,32 +641,46 @@ func (_IDelegationManager *IDelegationManagerCallerSession) GetOperatorsShares(o
// GetQueuedWithdrawal is a free data retrieval call binding the contract method 0x5d975e88.
//
-// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]))
-func (_IDelegationManager *IDelegationManagerCaller) GetQueuedWithdrawal(opts *bind.CallOpts, withdrawalRoot [32]byte) (IDelegationManagerTypesWithdrawal, error) {
+// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, uint256[] shares)
+func (_IDelegationManager *IDelegationManagerCaller) GetQueuedWithdrawal(opts *bind.CallOpts, withdrawalRoot [32]byte) (struct {
+ Withdrawal IDelegationManagerTypesWithdrawal
+ Shares []*big.Int
+}, error) {
var out []interface{}
err := _IDelegationManager.contract.Call(opts, &out, "getQueuedWithdrawal", withdrawalRoot)
+ outstruct := new(struct {
+ Withdrawal IDelegationManagerTypesWithdrawal
+ Shares []*big.Int
+ })
if err != nil {
- return *new(IDelegationManagerTypesWithdrawal), err
+ return *outstruct, err
}
- out0 := *abi.ConvertType(out[0], new(IDelegationManagerTypesWithdrawal)).(*IDelegationManagerTypesWithdrawal)
+ outstruct.Withdrawal = *abi.ConvertType(out[0], new(IDelegationManagerTypesWithdrawal)).(*IDelegationManagerTypesWithdrawal)
+ outstruct.Shares = *abi.ConvertType(out[1], new([]*big.Int)).(*[]*big.Int)
- return out0, err
+ return *outstruct, err
}
// GetQueuedWithdrawal is a free data retrieval call binding the contract method 0x5d975e88.
//
-// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]))
-func (_IDelegationManager *IDelegationManagerSession) GetQueuedWithdrawal(withdrawalRoot [32]byte) (IDelegationManagerTypesWithdrawal, error) {
+// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, uint256[] shares)
+func (_IDelegationManager *IDelegationManagerSession) GetQueuedWithdrawal(withdrawalRoot [32]byte) (struct {
+ Withdrawal IDelegationManagerTypesWithdrawal
+ Shares []*big.Int
+}, error) {
return _IDelegationManager.Contract.GetQueuedWithdrawal(&_IDelegationManager.CallOpts, withdrawalRoot)
}
// GetQueuedWithdrawal is a free data retrieval call binding the contract method 0x5d975e88.
//
-// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]))
-func (_IDelegationManager *IDelegationManagerCallerSession) GetQueuedWithdrawal(withdrawalRoot [32]byte) (IDelegationManagerTypesWithdrawal, error) {
+// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, uint256[] shares)
+func (_IDelegationManager *IDelegationManagerCallerSession) GetQueuedWithdrawal(withdrawalRoot [32]byte) (struct {
+ Withdrawal IDelegationManagerTypesWithdrawal
+ Shares []*big.Int
+}, error) {
return _IDelegationManager.Contract.GetQueuedWithdrawal(&_IDelegationManager.CallOpts, withdrawalRoot)
}
@@ -884,6 +929,37 @@ func (_IDelegationManager *IDelegationManagerCallerSession) MinWithdrawalDelayBl
return _IDelegationManager.Contract.MinWithdrawalDelayBlocks(&_IDelegationManager.CallOpts)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IDelegationManager *IDelegationManagerCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _IDelegationManager.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IDelegationManager *IDelegationManagerSession) Version() (string, error) {
+ return _IDelegationManager.Contract.Version(&_IDelegationManager.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IDelegationManager *IDelegationManagerCallerSession) Version() (string, error) {
+ return _IDelegationManager.Contract.Version(&_IDelegationManager.CallOpts)
+}
+
// CompleteQueuedWithdrawal is a paid mutator transaction binding the contract method 0xe4cc3f90.
//
// Solidity: function completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, address[] tokens, bool receiveAsTokens) returns()
@@ -950,21 +1026,21 @@ func (_IDelegationManager *IDelegationManagerTransactorSession) DecreaseDelegate
// DelegateTo is a paid mutator transaction binding the contract method 0xeea9064b.
//
// Solidity: function delegateTo(address operator, (bytes,uint256) approverSignatureAndExpiry, bytes32 approverSalt) returns()
-func (_IDelegationManager *IDelegationManagerTransactor) DelegateTo(opts *bind.TransactOpts, operator common.Address, approverSignatureAndExpiry ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_IDelegationManager *IDelegationManagerTransactor) DelegateTo(opts *bind.TransactOpts, operator common.Address, approverSignatureAndExpiry ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _IDelegationManager.contract.Transact(opts, "delegateTo", operator, approverSignatureAndExpiry, approverSalt)
}
// DelegateTo is a paid mutator transaction binding the contract method 0xeea9064b.
//
// Solidity: function delegateTo(address operator, (bytes,uint256) approverSignatureAndExpiry, bytes32 approverSalt) returns()
-func (_IDelegationManager *IDelegationManagerSession) DelegateTo(operator common.Address, approverSignatureAndExpiry ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_IDelegationManager *IDelegationManagerSession) DelegateTo(operator common.Address, approverSignatureAndExpiry ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _IDelegationManager.Contract.DelegateTo(&_IDelegationManager.TransactOpts, operator, approverSignatureAndExpiry, approverSalt)
}
// DelegateTo is a paid mutator transaction binding the contract method 0xeea9064b.
//
// Solidity: function delegateTo(address operator, (bytes,uint256) approverSignatureAndExpiry, bytes32 approverSalt) returns()
-func (_IDelegationManager *IDelegationManagerTransactorSession) DelegateTo(operator common.Address, approverSignatureAndExpiry ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_IDelegationManager *IDelegationManagerTransactorSession) DelegateTo(operator common.Address, approverSignatureAndExpiry ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _IDelegationManager.Contract.DelegateTo(&_IDelegationManager.TransactOpts, operator, approverSignatureAndExpiry, approverSalt)
}
@@ -1055,21 +1131,21 @@ func (_IDelegationManager *IDelegationManagerTransactorSession) QueueWithdrawals
// Redelegate is a paid mutator transaction binding the contract method 0xa33a3433.
//
// Solidity: function redelegate(address newOperator, (bytes,uint256) newOperatorApproverSig, bytes32 approverSalt) returns(bytes32[] withdrawalRoots)
-func (_IDelegationManager *IDelegationManagerTransactor) Redelegate(opts *bind.TransactOpts, newOperator common.Address, newOperatorApproverSig ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_IDelegationManager *IDelegationManagerTransactor) Redelegate(opts *bind.TransactOpts, newOperator common.Address, newOperatorApproverSig ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _IDelegationManager.contract.Transact(opts, "redelegate", newOperator, newOperatorApproverSig, approverSalt)
}
// Redelegate is a paid mutator transaction binding the contract method 0xa33a3433.
//
// Solidity: function redelegate(address newOperator, (bytes,uint256) newOperatorApproverSig, bytes32 approverSalt) returns(bytes32[] withdrawalRoots)
-func (_IDelegationManager *IDelegationManagerSession) Redelegate(newOperator common.Address, newOperatorApproverSig ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_IDelegationManager *IDelegationManagerSession) Redelegate(newOperator common.Address, newOperatorApproverSig ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _IDelegationManager.Contract.Redelegate(&_IDelegationManager.TransactOpts, newOperator, newOperatorApproverSig, approverSalt)
}
// Redelegate is a paid mutator transaction binding the contract method 0xa33a3433.
//
// Solidity: function redelegate(address newOperator, (bytes,uint256) newOperatorApproverSig, bytes32 approverSalt) returns(bytes32[] withdrawalRoots)
-func (_IDelegationManager *IDelegationManagerTransactorSession) Redelegate(newOperator common.Address, newOperatorApproverSig ISignatureUtilsSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
+func (_IDelegationManager *IDelegationManagerTransactorSession) Redelegate(newOperator common.Address, newOperatorApproverSig ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error) {
return _IDelegationManager.Contract.Redelegate(&_IDelegationManager.TransactOpts, newOperator, newOperatorApproverSig, approverSalt)
}
@@ -2022,6 +2098,152 @@ func (_IDelegationManager *IDelegationManagerFilterer) ParseOperatorSharesIncrea
return event, nil
}
+// IDelegationManagerOperatorSharesSlashedIterator is returned from FilterOperatorSharesSlashed and is used to iterate over the raw logs and unpacked data for OperatorSharesSlashed events raised by the IDelegationManager contract.
+type IDelegationManagerOperatorSharesSlashedIterator struct {
+ Event *IDelegationManagerOperatorSharesSlashed // Event containing the contract specifics and raw log
+
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
+
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *IDelegationManagerOperatorSharesSlashedIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
+ }
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(IDelegationManagerOperatorSharesSlashed)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(IDelegationManagerOperatorSharesSlashed)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *IDelegationManagerOperatorSharesSlashedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IDelegationManagerOperatorSharesSlashedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IDelegationManagerOperatorSharesSlashed represents a OperatorSharesSlashed event raised by the IDelegationManager contract.
+type IDelegationManagerOperatorSharesSlashed struct {
+ Operator common.Address
+ Strategy common.Address
+ TotalSlashedShares *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterOperatorSharesSlashed is a free log retrieval operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
+//
+// Solidity: event OperatorSharesSlashed(address indexed operator, address strategy, uint256 totalSlashedShares)
+func (_IDelegationManager *IDelegationManagerFilterer) FilterOperatorSharesSlashed(opts *bind.FilterOpts, operator []common.Address) (*IDelegationManagerOperatorSharesSlashedIterator, error) {
+
+ var operatorRule []interface{}
+ for _, operatorItem := range operator {
+ operatorRule = append(operatorRule, operatorItem)
+ }
+
+ logs, sub, err := _IDelegationManager.contract.FilterLogs(opts, "OperatorSharesSlashed", operatorRule)
+ if err != nil {
+ return nil, err
+ }
+ return &IDelegationManagerOperatorSharesSlashedIterator{contract: _IDelegationManager.contract, event: "OperatorSharesSlashed", logs: logs, sub: sub}, nil
+}
+
+// WatchOperatorSharesSlashed is a free log subscription operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
+//
+// Solidity: event OperatorSharesSlashed(address indexed operator, address strategy, uint256 totalSlashedShares)
+func (_IDelegationManager *IDelegationManagerFilterer) WatchOperatorSharesSlashed(opts *bind.WatchOpts, sink chan<- *IDelegationManagerOperatorSharesSlashed, operator []common.Address) (event.Subscription, error) {
+
+ var operatorRule []interface{}
+ for _, operatorItem := range operator {
+ operatorRule = append(operatorRule, operatorItem)
+ }
+
+ logs, sub, err := _IDelegationManager.contract.WatchLogs(opts, "OperatorSharesSlashed", operatorRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(IDelegationManagerOperatorSharesSlashed)
+ if err := _IDelegationManager.contract.UnpackLog(event, "OperatorSharesSlashed", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+// ParseOperatorSharesSlashed is a log parse operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
+//
+// Solidity: event OperatorSharesSlashed(address indexed operator, address strategy, uint256 totalSlashedShares)
+func (_IDelegationManager *IDelegationManagerFilterer) ParseOperatorSharesSlashed(log types.Log) (*IDelegationManagerOperatorSharesSlashed, error) {
+ event := new(IDelegationManagerOperatorSharesSlashed)
+ if err := _IDelegationManager.contract.UnpackLog(event, "OperatorSharesSlashed", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
// IDelegationManagerSlashingWithdrawalCompletedIterator is returned from FilterSlashingWithdrawalCompleted and is used to iterate over the raw logs and unpacked data for SlashingWithdrawalCompleted events raised by the IDelegationManager contract.
type IDelegationManagerSlashingWithdrawalCompletedIterator struct {
Event *IDelegationManagerSlashingWithdrawalCompleted // Event containing the contract specifics and raw log
diff --git a/pkg/bindings/IEigenPod/binding.go b/pkg/bindings/IEigenPod/binding.go
index 87a33c40bb..c49e2a4f64 100644
--- a/pkg/bindings/IEigenPod/binding.go
+++ b/pkg/bindings/IEigenPod/binding.go
@@ -73,7 +73,7 @@ type IEigenPodTypesValidatorInfo 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\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"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\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"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\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"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\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"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\":\"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\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"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\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"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\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"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\":\"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.
@@ -625,6 +625,37 @@ func (_IEigenPod *IEigenPodCallerSession) ValidatorStatus0(pubkeyHash [32]byte)
return _IEigenPod.Contract.ValidatorStatus0(&_IEigenPod.CallOpts, pubkeyHash)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IEigenPod *IEigenPodCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _IEigenPod.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IEigenPod *IEigenPodSession) Version() (string, error) {
+ return _IEigenPod.Contract.Version(&_IEigenPod.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IEigenPod *IEigenPodCallerSession) Version() (string, error) {
+ return _IEigenPod.Contract.Version(&_IEigenPod.CallOpts)
+}
+
// WithdrawableRestakedExecutionLayerGwei is a free data retrieval call binding the contract method 0x3474aa16.
//
// Solidity: function withdrawableRestakedExecutionLayerGwei() view returns(uint64)
diff --git a/pkg/bindings/IEigenPodManager/binding.go b/pkg/bindings/IEigenPodManager/binding.go
index 458df46764..16a954159e 100644
--- a/pkg/bindings/IEigenPodManager/binding.go
+++ b/pkg/bindings/IEigenPodManager/binding.go
@@ -31,7 +31,7 @@ var (
// IEigenPodManagerMetaData contains all meta data concerning the IEigenPodManager contract.
var IEigenPodManagerMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"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\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"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\":[],\"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\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"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\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"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\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"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\":\"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\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"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\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]}]",
}
// IEigenPodManagerABI is the input ABI used to generate the binding from.
@@ -614,25 +614,56 @@ func (_IEigenPodManager *IEigenPodManagerCallerSession) StakerDepositShares(user
return _IEigenPodManager.Contract.StakerDepositShares(&_IEigenPodManager.CallOpts, user, strategy)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_IEigenPodManager *IEigenPodManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _IEigenPodManager.contract.Transact(opts, "addShares", staker, strategy, token, shares)
+// Solidity: function version() view returns(string)
+func (_IEigenPodManager *IEigenPodManagerCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _IEigenPodManager.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IEigenPodManager *IEigenPodManagerSession) Version() (string, error) {
+ return _IEigenPodManager.Contract.Version(&_IEigenPodManager.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IEigenPodManager *IEigenPodManagerCallerSession) Version() (string, error) {
+ return _IEigenPodManager.Contract.Version(&_IEigenPodManager.CallOpts)
+}
+
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
+//
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_IEigenPodManager *IEigenPodManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IEigenPodManager.contract.Transact(opts, "addShares", staker, strategy, shares)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_IEigenPodManager *IEigenPodManagerSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _IEigenPodManager.Contract.AddShares(&_IEigenPodManager.TransactOpts, staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_IEigenPodManager *IEigenPodManagerSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IEigenPodManager.Contract.AddShares(&_IEigenPodManager.TransactOpts, staker, strategy, shares)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_IEigenPodManager *IEigenPodManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _IEigenPodManager.Contract.AddShares(&_IEigenPodManager.TransactOpts, staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_IEigenPodManager *IEigenPodManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IEigenPodManager.Contract.AddShares(&_IEigenPodManager.TransactOpts, staker, strategy, shares)
}
// CreatePod is a paid mutator transaction binding the contract method 0x84d81062.
@@ -742,21 +773,21 @@ func (_IEigenPodManager *IEigenPodManagerTransactorSession) RecordBeaconChainETH
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_IEigenPodManager *IEigenPodManagerTransactor) RemoveDepositShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _IEigenPodManager.contract.Transact(opts, "removeDepositShares", staker, strategy, depositSharesToRemove)
}
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_IEigenPodManager *IEigenPodManagerSession) RemoveDepositShares(staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _IEigenPodManager.Contract.RemoveDepositShares(&_IEigenPodManager.TransactOpts, staker, strategy, depositSharesToRemove)
}
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_IEigenPodManager *IEigenPodManagerTransactorSession) RemoveDepositShares(staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _IEigenPodManager.Contract.RemoveDepositShares(&_IEigenPodManager.TransactOpts, staker, strategy, depositSharesToRemove)
}
diff --git a/pkg/bindings/IPermissionController/binding.go b/pkg/bindings/IPermissionController/binding.go
index cacf476c7f..37db8f72f3 100644
--- a/pkg/bindings/IPermissionController/binding.go
+++ b/pkg/bindings/IPermissionController/binding.go
@@ -31,7 +31,7 @@ var (
// IPermissionControllerMetaData contains all meta data concerning the IPermissionController contract.
var IPermissionControllerMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"function\",\"name\":\"acceptAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canCall\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]}]",
+ ABI: "[{\"type\":\"function\",\"name\":\"acceptAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canCall\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]}]",
}
// IPermissionControllerABI is the input ABI used to generate the binding from.
@@ -304,6 +304,37 @@ func (_IPermissionController *IPermissionControllerCallerSession) IsPendingAdmin
return _IPermissionController.Contract.IsPendingAdmin(&_IPermissionController.CallOpts, account, pendingAdmin)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IPermissionController *IPermissionControllerCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _IPermissionController.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IPermissionController *IPermissionControllerSession) Version() (string, error) {
+ return _IPermissionController.Contract.Version(&_IPermissionController.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IPermissionController *IPermissionControllerCallerSession) Version() (string, error) {
+ return _IPermissionController.Contract.Version(&_IPermissionController.CallOpts)
+}
+
// AcceptAdmin is a paid mutator transaction binding the contract method 0x628806ef.
//
// Solidity: function acceptAdmin(address account) returns()
diff --git a/pkg/bindings/IRewardsCoordinator/binding.go b/pkg/bindings/IRewardsCoordinator/binding.go
index 2dfd336358..4857add51a 100644
--- a/pkg/bindings/IRewardsCoordinator/binding.go
+++ b/pkg/bindings/IRewardsCoordinator/binding.go
@@ -99,7 +99,7 @@ type OperatorSet struct {
// IRewardsCoordinatorMetaData contains all meta data concerning the IRewardsCoordinator contract.
var IRewardsCoordinatorMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedOperatorSetRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defaultOperatorSplitBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetSplit\",\"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\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_defaultSplitBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaims\",\"inputs\":[{\"name\":\"claims\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim[]\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDefaultOperatorSplit\",\"inputs\":[{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorSetSplit\",\"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\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultOperatorSplitBipsSet\",\"inputs\":[{\"name\":\"oldDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedAVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedOperatorSetRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorPISplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"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\"}]},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllEarnersCreated\",\"inputs\":[{\"name\":\"tokenHopper\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCalculationIntervalSecondsRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidClaimProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDurationRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarnerLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGenesisRewardsTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRootIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStartTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewRootMustBeForNewCalculatedPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousSplitPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SplitExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SubmissionNotRetroactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]",
+ ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedOperatorSetRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defaultOperatorSplitBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetSplit\",\"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\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_defaultSplitBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaims\",\"inputs\":[{\"name\":\"claims\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim[]\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDefaultOperatorSplit\",\"inputs\":[{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorSetSplit\",\"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\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultOperatorSplitBipsSet\",\"inputs\":[{\"name\":\"oldDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedAVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedOperatorSetRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorPISplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"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\"}]},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllEarnersCreated\",\"inputs\":[{\"name\":\"tokenHopper\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCalculationIntervalSecondsRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidClaimProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDurationRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarnerLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGenesisRewardsTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRootIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStartTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewRootMustBeForNewCalculatedPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousSplitPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SplitExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SubmissionNotRetroactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]",
}
// IRewardsCoordinatorABI is the input ABI used to generate the binding from.
@@ -930,6 +930,37 @@ func (_IRewardsCoordinator *IRewardsCoordinatorCallerSession) RewardsUpdater() (
return _IRewardsCoordinator.Contract.RewardsUpdater(&_IRewardsCoordinator.CallOpts)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IRewardsCoordinator *IRewardsCoordinatorCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _IRewardsCoordinator.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IRewardsCoordinator *IRewardsCoordinatorSession) Version() (string, error) {
+ return _IRewardsCoordinator.Contract.Version(&_IRewardsCoordinator.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IRewardsCoordinator *IRewardsCoordinatorCallerSession) Version() (string, error) {
+ return _IRewardsCoordinator.Contract.Version(&_IRewardsCoordinator.CallOpts)
+}
+
// CreateAVSRewardsSubmission is a paid mutator transaction binding the contract method 0xfce36c7d.
//
// Solidity: function createAVSRewardsSubmission(((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
diff --git a/pkg/bindings/ISemVerMixin/binding.go b/pkg/bindings/ISemVerMixin/binding.go
new file mode 100644
index 0000000000..4e5aee10e1
--- /dev/null
+++ b/pkg/bindings/ISemVerMixin/binding.go
@@ -0,0 +1,212 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package ISemVerMixin
+
+import (
+ "errors"
+ "math/big"
+ "strings"
+
+ ethereum "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+ _ = errors.New
+ _ = big.NewInt
+ _ = strings.NewReader
+ _ = ethereum.NotFound
+ _ = bind.Bind
+ _ = common.Big1
+ _ = types.BloomLookup
+ _ = event.NewSubscription
+ _ = abi.ConvertType
+)
+
+// ISemVerMixinMetaData contains all meta data concerning the ISemVerMixin contract.
+var ISemVerMixinMetaData = &bind.MetaData{
+ ABI: "[{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"}]",
+}
+
+// ISemVerMixinABI is the input ABI used to generate the binding from.
+// Deprecated: Use ISemVerMixinMetaData.ABI instead.
+var ISemVerMixinABI = ISemVerMixinMetaData.ABI
+
+// ISemVerMixin is an auto generated Go binding around an Ethereum contract.
+type ISemVerMixin struct {
+ ISemVerMixinCaller // Read-only binding to the contract
+ ISemVerMixinTransactor // Write-only binding to the contract
+ ISemVerMixinFilterer // Log filterer for contract events
+}
+
+// ISemVerMixinCaller is an auto generated read-only Go binding around an Ethereum contract.
+type ISemVerMixinCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ISemVerMixinTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type ISemVerMixinTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ISemVerMixinFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type ISemVerMixinFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ISemVerMixinSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type ISemVerMixinSession struct {
+ Contract *ISemVerMixin // Generic contract binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// ISemVerMixinCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type ISemVerMixinCallerSession struct {
+ Contract *ISemVerMixinCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// ISemVerMixinTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type ISemVerMixinTransactorSession struct {
+ Contract *ISemVerMixinTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// ISemVerMixinRaw is an auto generated low-level Go binding around an Ethereum contract.
+type ISemVerMixinRaw struct {
+ Contract *ISemVerMixin // Generic contract binding to access the raw methods on
+}
+
+// ISemVerMixinCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type ISemVerMixinCallerRaw struct {
+ Contract *ISemVerMixinCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// ISemVerMixinTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type ISemVerMixinTransactorRaw struct {
+ Contract *ISemVerMixinTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewISemVerMixin creates a new instance of ISemVerMixin, bound to a specific deployed contract.
+func NewISemVerMixin(address common.Address, backend bind.ContractBackend) (*ISemVerMixin, error) {
+ contract, err := bindISemVerMixin(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &ISemVerMixin{ISemVerMixinCaller: ISemVerMixinCaller{contract: contract}, ISemVerMixinTransactor: ISemVerMixinTransactor{contract: contract}, ISemVerMixinFilterer: ISemVerMixinFilterer{contract: contract}}, nil
+}
+
+// NewISemVerMixinCaller creates a new read-only instance of ISemVerMixin, bound to a specific deployed contract.
+func NewISemVerMixinCaller(address common.Address, caller bind.ContractCaller) (*ISemVerMixinCaller, error) {
+ contract, err := bindISemVerMixin(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ISemVerMixinCaller{contract: contract}, nil
+}
+
+// NewISemVerMixinTransactor creates a new write-only instance of ISemVerMixin, bound to a specific deployed contract.
+func NewISemVerMixinTransactor(address common.Address, transactor bind.ContractTransactor) (*ISemVerMixinTransactor, error) {
+ contract, err := bindISemVerMixin(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ISemVerMixinTransactor{contract: contract}, nil
+}
+
+// NewISemVerMixinFilterer creates a new log filterer instance of ISemVerMixin, bound to a specific deployed contract.
+func NewISemVerMixinFilterer(address common.Address, filterer bind.ContractFilterer) (*ISemVerMixinFilterer, error) {
+ contract, err := bindISemVerMixin(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &ISemVerMixinFilterer{contract: contract}, nil
+}
+
+// bindISemVerMixin binds a generic wrapper to an already deployed contract.
+func bindISemVerMixin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := ISemVerMixinMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_ISemVerMixin *ISemVerMixinRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ISemVerMixin.Contract.ISemVerMixinCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_ISemVerMixin *ISemVerMixinRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ISemVerMixin.Contract.ISemVerMixinTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ISemVerMixin *ISemVerMixinRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ISemVerMixin.Contract.ISemVerMixinTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_ISemVerMixin *ISemVerMixinCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ISemVerMixin.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_ISemVerMixin *ISemVerMixinTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ISemVerMixin.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ISemVerMixin *ISemVerMixinTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ISemVerMixin.Contract.contract.Transact(opts, method, params...)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_ISemVerMixin *ISemVerMixinCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _ISemVerMixin.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_ISemVerMixin *ISemVerMixinSession) Version() (string, error) {
+ return _ISemVerMixin.Contract.Version(&_ISemVerMixin.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_ISemVerMixin *ISemVerMixinCallerSession) Version() (string, error) {
+ return _ISemVerMixin.Contract.Version(&_ISemVerMixin.CallOpts)
+}
diff --git a/pkg/bindings/IShareManager/binding.go b/pkg/bindings/IShareManager/binding.go
index ac1580febd..c38d4c8717 100644
--- a/pkg/bindings/IShareManager/binding.go
+++ b/pkg/bindings/IShareManager/binding.go
@@ -31,7 +31,7 @@ var (
// IShareManagerMetaData contains all meta data concerning the IShareManager contract.
var IShareManagerMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"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\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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\"}]",
+ 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\":\"increaseBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"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\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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\"}]",
}
// IShareManagerABI is the input ABI used to generate the binding from.
@@ -211,25 +211,25 @@ func (_IShareManager *IShareManagerCallerSession) StakerDepositShares(user commo
return _IShareManager.Contract.StakerDepositShares(&_IShareManager.CallOpts, user, strategy)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_IShareManager *IShareManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _IShareManager.contract.Transact(opts, "addShares", staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_IShareManager *IShareManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IShareManager.contract.Transact(opts, "addShares", staker, strategy, shares)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_IShareManager *IShareManagerSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _IShareManager.Contract.AddShares(&_IShareManager.TransactOpts, staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_IShareManager *IShareManagerSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IShareManager.Contract.AddShares(&_IShareManager.TransactOpts, staker, strategy, shares)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_IShareManager *IShareManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _IShareManager.Contract.AddShares(&_IShareManager.TransactOpts, staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_IShareManager *IShareManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IShareManager.Contract.AddShares(&_IShareManager.TransactOpts, staker, strategy, shares)
}
// IncreaseBurnableShares is a paid mutator transaction binding the contract method 0xdebe1eab.
@@ -255,21 +255,21 @@ func (_IShareManager *IShareManagerTransactorSession) IncreaseBurnableShares(str
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_IShareManager *IShareManagerTransactor) RemoveDepositShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _IShareManager.contract.Transact(opts, "removeDepositShares", staker, strategy, depositSharesToRemove)
}
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_IShareManager *IShareManagerSession) RemoveDepositShares(staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _IShareManager.Contract.RemoveDepositShares(&_IShareManager.TransactOpts, staker, strategy, depositSharesToRemove)
}
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_IShareManager *IShareManagerTransactorSession) RemoveDepositShares(staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _IShareManager.Contract.RemoveDepositShares(&_IShareManager.TransactOpts, staker, strategy, depositSharesToRemove)
}
diff --git a/pkg/bindings/ISignatureUtilsMixin/binding.go b/pkg/bindings/ISignatureUtilsMixin/binding.go
new file mode 100644
index 0000000000..cbc7b8eb11
--- /dev/null
+++ b/pkg/bindings/ISignatureUtilsMixin/binding.go
@@ -0,0 +1,243 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package ISignatureUtilsMixin
+
+import (
+ "errors"
+ "math/big"
+ "strings"
+
+ ethereum "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+ _ = errors.New
+ _ = big.NewInt
+ _ = strings.NewReader
+ _ = ethereum.NotFound
+ _ = bind.Bind
+ _ = common.Big1
+ _ = types.BloomLookup
+ _ = event.NewSubscription
+ _ = abi.ConvertType
+)
+
+// ISignatureUtilsMixinMetaData contains all meta data concerning the ISignatureUtilsMixin contract.
+var ISignatureUtilsMixinMetaData = &bind.MetaData{
+ ABI: "[{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]}]",
+}
+
+// ISignatureUtilsMixinABI is the input ABI used to generate the binding from.
+// Deprecated: Use ISignatureUtilsMixinMetaData.ABI instead.
+var ISignatureUtilsMixinABI = ISignatureUtilsMixinMetaData.ABI
+
+// ISignatureUtilsMixin is an auto generated Go binding around an Ethereum contract.
+type ISignatureUtilsMixin struct {
+ ISignatureUtilsMixinCaller // Read-only binding to the contract
+ ISignatureUtilsMixinTransactor // Write-only binding to the contract
+ ISignatureUtilsMixinFilterer // Log filterer for contract events
+}
+
+// ISignatureUtilsMixinCaller is an auto generated read-only Go binding around an Ethereum contract.
+type ISignatureUtilsMixinCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ISignatureUtilsMixinTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type ISignatureUtilsMixinTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ISignatureUtilsMixinFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type ISignatureUtilsMixinFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ISignatureUtilsMixinSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type ISignatureUtilsMixinSession struct {
+ Contract *ISignatureUtilsMixin // Generic contract binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// ISignatureUtilsMixinCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type ISignatureUtilsMixinCallerSession struct {
+ Contract *ISignatureUtilsMixinCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// ISignatureUtilsMixinTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type ISignatureUtilsMixinTransactorSession struct {
+ Contract *ISignatureUtilsMixinTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// ISignatureUtilsMixinRaw is an auto generated low-level Go binding around an Ethereum contract.
+type ISignatureUtilsMixinRaw struct {
+ Contract *ISignatureUtilsMixin // Generic contract binding to access the raw methods on
+}
+
+// ISignatureUtilsMixinCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type ISignatureUtilsMixinCallerRaw struct {
+ Contract *ISignatureUtilsMixinCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// ISignatureUtilsMixinTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type ISignatureUtilsMixinTransactorRaw struct {
+ Contract *ISignatureUtilsMixinTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewISignatureUtilsMixin creates a new instance of ISignatureUtilsMixin, bound to a specific deployed contract.
+func NewISignatureUtilsMixin(address common.Address, backend bind.ContractBackend) (*ISignatureUtilsMixin, error) {
+ contract, err := bindISignatureUtilsMixin(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &ISignatureUtilsMixin{ISignatureUtilsMixinCaller: ISignatureUtilsMixinCaller{contract: contract}, ISignatureUtilsMixinTransactor: ISignatureUtilsMixinTransactor{contract: contract}, ISignatureUtilsMixinFilterer: ISignatureUtilsMixinFilterer{contract: contract}}, nil
+}
+
+// NewISignatureUtilsMixinCaller creates a new read-only instance of ISignatureUtilsMixin, bound to a specific deployed contract.
+func NewISignatureUtilsMixinCaller(address common.Address, caller bind.ContractCaller) (*ISignatureUtilsMixinCaller, error) {
+ contract, err := bindISignatureUtilsMixin(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ISignatureUtilsMixinCaller{contract: contract}, nil
+}
+
+// NewISignatureUtilsMixinTransactor creates a new write-only instance of ISignatureUtilsMixin, bound to a specific deployed contract.
+func NewISignatureUtilsMixinTransactor(address common.Address, transactor bind.ContractTransactor) (*ISignatureUtilsMixinTransactor, error) {
+ contract, err := bindISignatureUtilsMixin(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ISignatureUtilsMixinTransactor{contract: contract}, nil
+}
+
+// NewISignatureUtilsMixinFilterer creates a new log filterer instance of ISignatureUtilsMixin, bound to a specific deployed contract.
+func NewISignatureUtilsMixinFilterer(address common.Address, filterer bind.ContractFilterer) (*ISignatureUtilsMixinFilterer, error) {
+ contract, err := bindISignatureUtilsMixin(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &ISignatureUtilsMixinFilterer{contract: contract}, nil
+}
+
+// bindISignatureUtilsMixin binds a generic wrapper to an already deployed contract.
+func bindISignatureUtilsMixin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := ISignatureUtilsMixinMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_ISignatureUtilsMixin *ISignatureUtilsMixinRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ISignatureUtilsMixin.Contract.ISignatureUtilsMixinCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_ISignatureUtilsMixin *ISignatureUtilsMixinRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ISignatureUtilsMixin.Contract.ISignatureUtilsMixinTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ISignatureUtilsMixin *ISignatureUtilsMixinRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ISignatureUtilsMixin.Contract.ISignatureUtilsMixinTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_ISignatureUtilsMixin *ISignatureUtilsMixinCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ISignatureUtilsMixin.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_ISignatureUtilsMixin *ISignatureUtilsMixinTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ISignatureUtilsMixin.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ISignatureUtilsMixin *ISignatureUtilsMixinTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ISignatureUtilsMixin.Contract.contract.Transact(opts, method, params...)
+}
+
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_ISignatureUtilsMixin *ISignatureUtilsMixinCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error) {
+ var out []interface{}
+ err := _ISignatureUtilsMixin.contract.Call(opts, &out, "domainSeparator")
+
+ if err != nil {
+ return *new([32]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+ return out0, err
+
+}
+
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_ISignatureUtilsMixin *ISignatureUtilsMixinSession) DomainSeparator() ([32]byte, error) {
+ return _ISignatureUtilsMixin.Contract.DomainSeparator(&_ISignatureUtilsMixin.CallOpts)
+}
+
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_ISignatureUtilsMixin *ISignatureUtilsMixinCallerSession) DomainSeparator() ([32]byte, error) {
+ return _ISignatureUtilsMixin.Contract.DomainSeparator(&_ISignatureUtilsMixin.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_ISignatureUtilsMixin *ISignatureUtilsMixinCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _ISignatureUtilsMixin.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_ISignatureUtilsMixin *ISignatureUtilsMixinSession) Version() (string, error) {
+ return _ISignatureUtilsMixin.Contract.Version(&_ISignatureUtilsMixin.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_ISignatureUtilsMixin *ISignatureUtilsMixinCallerSession) Version() (string, error) {
+ return _ISignatureUtilsMixin.Contract.Version(&_ISignatureUtilsMixin.CallOpts)
+}
diff --git a/pkg/bindings/IStrategy/binding.go b/pkg/bindings/IStrategy/binding.go
index fa62821336..fb107c9a26 100644
--- a/pkg/bindings/IStrategy/binding.go
+++ b/pkg/bindings/IStrategy/binding.go
@@ -31,7 +31,7 @@ var (
// IStrategyMetaData contains all meta data concerning the IStrategy contract.
var IStrategyMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]",
+ ABI: "[{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]",
}
// IStrategyABI is the input ABI used to generate the binding from.
@@ -397,6 +397,37 @@ func (_IStrategy *IStrategyCallerSession) UserUnderlyingView(user common.Address
return _IStrategy.Contract.UserUnderlyingView(&_IStrategy.CallOpts, user)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IStrategy *IStrategyCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _IStrategy.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IStrategy *IStrategySession) Version() (string, error) {
+ return _IStrategy.Contract.Version(&_IStrategy.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IStrategy *IStrategyCallerSession) Version() (string, error) {
+ return _IStrategy.Contract.Version(&_IStrategy.CallOpts)
+}
+
// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
//
// Solidity: function deposit(address token, uint256 amount) returns(uint256)
diff --git a/pkg/bindings/IStrategyFactory/binding.go b/pkg/bindings/IStrategyFactory/binding.go
index 47fe1eac8f..f550d36dc8 100644
--- a/pkg/bindings/IStrategyFactory/binding.go
+++ b/pkg/bindings/IStrategyFactory/binding.go
@@ -31,7 +31,7 @@ var (
// IStrategyFactoryMetaData contains all meta data concerning the IStrategyFactory contract.
var IStrategyFactoryMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"StrategyBeaconModified\",\"inputs\":[{\"name\":\"previousBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"},{\"name\":\"newBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategySetForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenBlacklisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlacklistedToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyExists\",\"inputs\":[]}]",
+ ABI: "[{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"StrategyBeaconModified\",\"inputs\":[{\"name\":\"previousBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"},{\"name\":\"newBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategySetForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenBlacklisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlacklistedToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyExists\",\"inputs\":[]}]",
}
// IStrategyFactoryABI is the input ABI used to generate the binding from.
@@ -242,6 +242,37 @@ func (_IStrategyFactory *IStrategyFactoryCallerSession) StrategyBeacon() (common
return _IStrategyFactory.Contract.StrategyBeacon(&_IStrategyFactory.CallOpts)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IStrategyFactory *IStrategyFactoryCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _IStrategyFactory.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IStrategyFactory *IStrategyFactorySession) Version() (string, error) {
+ return _IStrategyFactory.Contract.Version(&_IStrategyFactory.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IStrategyFactory *IStrategyFactoryCallerSession) Version() (string, error) {
+ return _IStrategyFactory.Contract.Version(&_IStrategyFactory.CallOpts)
+}
+
// DeployNewStrategy is a paid mutator transaction binding the contract method 0x6b9b6229.
//
// Solidity: function deployNewStrategy(address token) returns(address newStrategy)
diff --git a/pkg/bindings/IStrategyManager/binding.go b/pkg/bindings/IStrategyManager/binding.go
index 506df5d2fb..3b750cc3b8 100644
--- a/pkg/bindings/IStrategyManager/binding.go
+++ b/pkg/bindings/IStrategyManager/binding.go
@@ -31,7 +31,7 @@ var (
// 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\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"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\":\"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\":\"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\":\"increaseBurnableShares\",\"inputs\":[{\"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\":[],\"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\":\"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\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"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\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":\"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\":\"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\":\"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\":\"increaseBurnableShares\",\"inputs\":[{\"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\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"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\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]",
}
// IStrategyManagerABI is the input ABI used to generate the binding from.
@@ -242,6 +242,37 @@ func (_IStrategyManager *IStrategyManagerCallerSession) Delegation() (common.Add
return _IStrategyManager.Contract.Delegation(&_IStrategyManager.CallOpts)
}
+// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423.
+//
+// Solidity: function getBurnableShares(address strategy) view returns(uint256)
+func (_IStrategyManager *IStrategyManagerCaller) GetBurnableShares(opts *bind.CallOpts, strategy common.Address) (*big.Int, error) {
+ var out []interface{}
+ err := _IStrategyManager.contract.Call(opts, &out, "getBurnableShares", strategy)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423.
+//
+// Solidity: function getBurnableShares(address strategy) view returns(uint256)
+func (_IStrategyManager *IStrategyManagerSession) GetBurnableShares(strategy common.Address) (*big.Int, error) {
+ return _IStrategyManager.Contract.GetBurnableShares(&_IStrategyManager.CallOpts, strategy)
+}
+
+// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423.
+//
+// Solidity: function getBurnableShares(address strategy) view returns(uint256)
+func (_IStrategyManager *IStrategyManagerCallerSession) GetBurnableShares(strategy common.Address) (*big.Int, error) {
+ return _IStrategyManager.Contract.GetBurnableShares(&_IStrategyManager.CallOpts, strategy)
+}
+
// GetDeposits is a free data retrieval call binding the contract method 0x94f649dd.
//
// Solidity: function getDeposits(address staker) view returns(address[], uint256[])
@@ -305,6 +336,38 @@ func (_IStrategyManager *IStrategyManagerCallerSession) GetStakerStrategyList(st
return _IStrategyManager.Contract.GetStakerStrategyList(&_IStrategyManager.CallOpts, staker)
}
+// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500.
+//
+// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[])
+func (_IStrategyManager *IStrategyManagerCaller) GetStrategiesWithBurnableShares(opts *bind.CallOpts) ([]common.Address, []*big.Int, error) {
+ var out []interface{}
+ err := _IStrategyManager.contract.Call(opts, &out, "getStrategiesWithBurnableShares")
+
+ if err != nil {
+ return *new([]common.Address), *new([]*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)
+ out1 := *abi.ConvertType(out[1], new([]*big.Int)).(*[]*big.Int)
+
+ return out0, out1, err
+
+}
+
+// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500.
+//
+// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[])
+func (_IStrategyManager *IStrategyManagerSession) GetStrategiesWithBurnableShares() ([]common.Address, []*big.Int, error) {
+ return _IStrategyManager.Contract.GetStrategiesWithBurnableShares(&_IStrategyManager.CallOpts)
+}
+
+// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500.
+//
+// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[])
+func (_IStrategyManager *IStrategyManagerCallerSession) GetStrategiesWithBurnableShares() ([]common.Address, []*big.Int, error) {
+ return _IStrategyManager.Contract.GetStrategiesWithBurnableShares(&_IStrategyManager.CallOpts)
+}
+
// StakerDepositShares is a free data retrieval call binding the contract method 0xfe243a17.
//
// Solidity: function stakerDepositShares(address user, address strategy) view returns(uint256 shares)
@@ -429,25 +492,56 @@ func (_IStrategyManager *IStrategyManagerCallerSession) StrategyWhitelister() (c
return _IStrategyManager.Contract.StrategyWhitelister(&_IStrategyManager.CallOpts)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IStrategyManager *IStrategyManagerCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _IStrategyManager.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IStrategyManager *IStrategyManagerSession) Version() (string, error) {
+ return _IStrategyManager.Contract.Version(&_IStrategyManager.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_IStrategyManager *IStrategyManagerCallerSession) Version() (string, error) {
+ return _IStrategyManager.Contract.Version(&_IStrategyManager.CallOpts)
+}
+
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_IStrategyManager *IStrategyManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _IStrategyManager.contract.Transact(opts, "addShares", staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_IStrategyManager *IStrategyManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IStrategyManager.contract.Transact(opts, "addShares", staker, strategy, shares)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_IStrategyManager *IStrategyManagerSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _IStrategyManager.Contract.AddShares(&_IStrategyManager.TransactOpts, staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_IStrategyManager *IStrategyManagerSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IStrategyManager.Contract.AddShares(&_IStrategyManager.TransactOpts, staker, strategy, shares)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_IStrategyManager *IStrategyManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _IStrategyManager.Contract.AddShares(&_IStrategyManager.TransactOpts, staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_IStrategyManager *IStrategyManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IStrategyManager.Contract.AddShares(&_IStrategyManager.TransactOpts, staker, strategy, shares)
}
// AddStrategiesToDepositWhitelist is a paid mutator transaction binding the contract method 0x5de08ff2.
@@ -578,21 +672,21 @@ func (_IStrategyManager *IStrategyManagerTransactorSession) Initialize(initialOw
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_IStrategyManager *IStrategyManagerTransactor) RemoveDepositShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _IStrategyManager.contract.Transact(opts, "removeDepositShares", staker, strategy, depositSharesToRemove)
}
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_IStrategyManager *IStrategyManagerSession) RemoveDepositShares(staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _IStrategyManager.Contract.RemoveDepositShares(&_IStrategyManager.TransactOpts, staker, strategy, depositSharesToRemove)
}
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_IStrategyManager *IStrategyManagerTransactorSession) RemoveDepositShares(staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _IStrategyManager.Contract.RemoveDepositShares(&_IStrategyManager.TransactOpts, staker, strategy, depositSharesToRemove)
}
@@ -1000,15 +1094,14 @@ func (it *IStrategyManagerDepositIterator) Close() error {
// IStrategyManagerDeposit represents a Deposit event raised by the IStrategyManager contract.
type IStrategyManagerDeposit struct {
Staker common.Address
- Token common.Address
Strategy common.Address
Shares *big.Int
Raw types.Log // Blockchain specific contextual infos
}
-// FilterDeposit is a free log retrieval operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96.
+// FilterDeposit is a free log retrieval operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
//
-// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares)
+// Solidity: event Deposit(address staker, address strategy, uint256 shares)
func (_IStrategyManager *IStrategyManagerFilterer) FilterDeposit(opts *bind.FilterOpts) (*IStrategyManagerDepositIterator, error) {
logs, sub, err := _IStrategyManager.contract.FilterLogs(opts, "Deposit")
@@ -1018,9 +1111,9 @@ func (_IStrategyManager *IStrategyManagerFilterer) FilterDeposit(opts *bind.Filt
return &IStrategyManagerDepositIterator{contract: _IStrategyManager.contract, event: "Deposit", logs: logs, sub: sub}, nil
}
-// WatchDeposit is a free log subscription operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96.
+// WatchDeposit is a free log subscription operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
//
-// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares)
+// Solidity: event Deposit(address staker, address strategy, uint256 shares)
func (_IStrategyManager *IStrategyManagerFilterer) WatchDeposit(opts *bind.WatchOpts, sink chan<- *IStrategyManagerDeposit) (event.Subscription, error) {
logs, sub, err := _IStrategyManager.contract.WatchLogs(opts, "Deposit")
@@ -1055,9 +1148,9 @@ func (_IStrategyManager *IStrategyManagerFilterer) WatchDeposit(opts *bind.Watch
}), nil
}
-// ParseDeposit is a log parse operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96.
+// ParseDeposit is a log parse operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
//
-// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares)
+// Solidity: event Deposit(address staker, address strategy, uint256 shares)
func (_IStrategyManager *IStrategyManagerFilterer) ParseDeposit(log types.Log) (*IStrategyManagerDeposit, error) {
event := new(IStrategyManagerDeposit)
if err := _IStrategyManager.contract.UnpackLog(event, "Deposit", log); err != nil {
diff --git a/pkg/bindings/Merkle/binding.go b/pkg/bindings/Merkle/binding.go
index 0dc9f1d9c9..d821ef52e8 100644
--- a/pkg/bindings/Merkle/binding.go
+++ b/pkg/bindings/Merkle/binding.go
@@ -32,7 +32,7 @@ var (
// MerkleMetaData contains all meta data concerning the Merkle contract.
var MerkleMetaData = &bind.MetaData{
ABI: "[{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]}]",
- Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122085b24342099ee34c979b25a8181cab47b19a7b5bb98497e7c396cfeef68fc84564736f6c634300081b0033",
+ Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220b3387688c69542ae2b90da3d8180b1430217588a821d3d236ee31553d988aa8564736f6c634300081b0033",
}
// MerkleABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/OperatorSetLib/binding.go b/pkg/bindings/OperatorSetLib/binding.go
index 6053888ada..5b6ae6b492 100644
--- a/pkg/bindings/OperatorSetLib/binding.go
+++ b/pkg/bindings/OperatorSetLib/binding.go
@@ -32,7 +32,7 @@ var (
// OperatorSetLibMetaData contains all meta data concerning the OperatorSetLib contract.
var OperatorSetLibMetaData = &bind.MetaData{
ABI: "[]",
- Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212208e75671188dda11a78514701822a433b1e7210d9141d5e2911f793e717037afc64736f6c634300081b0033",
+ Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220c6f39a4279e4b76d3e2615353cdbc6c6c997db9a5b4e2de6bdd01f1036a3e64a64736f6c634300081b0033",
}
// OperatorSetLibABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/PauserRegistry/binding.go b/pkg/bindings/PauserRegistry/binding.go
index 1e8885e369..5cb09e6899 100644
--- a/pkg/bindings/PauserRegistry/binding.go
+++ b/pkg/bindings/PauserRegistry/binding.go
@@ -32,7 +32,7 @@ var (
// PauserRegistryMetaData contains all meta data concerning the PauserRegistry contract.
var PauserRegistryMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_pausers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"_unpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isPauser\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setIsPauser\",\"inputs\":[{\"name\":\"newPauser\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setUnpauser\",\"inputs\":[{\"name\":\"newUnpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpauser\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"PauserStatusChanged\",\"inputs\":[{\"name\":\"pauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnpauserChanged\",\"inputs\":[{\"name\":\"previousUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]}]",
- Bin: "0x608060405234801561000f575f5ffd5b506040516105c83803806105c883398101604081905261002e916101c2565b5f5b825181101561006b5761006383828151811061004e5761004e61029e565b6020026020010151600161007c60201b60201c565b600101610030565b5061007581610103565b50506102b2565b6001600160a01b0382166100a3576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661012a576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146101bd575f5ffd5b919050565b5f5f604083850312156101d3575f5ffd5b82516001600160401b038111156101e8575f5ffd5b8301601f810185136101f8575f5ffd5b80516001600160401b0381111561021157610211610193565b604051600582901b90603f8201601f191681016001600160401b038111828210171561023f5761023f610193565b60405291825260208184018101929081018884111561025c575f5ffd5b6020850194505b8385101561028257610274856101a7565b815260209485019401610263565b50945061029592505050602084016101a7565b90509250929050565b634e487b7160e01b5f52603260045260245ffd5b610309806102bf5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806346fbf68e1461004e5780638568520614610085578063ce5484281461009a578063eab66d7a146100ad575b5f5ffd5b61007061005c36600461027a565b5f6020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009861009336600461029a565b6100d8565b005b6100986100a836600461027a565b610111565b6001546100c0906001600160a01b031681565b6040516001600160a01b03909116815260200161007c565b6001546001600160a01b031633146101035760405163794821ff60e01b815260040160405180910390fd5b61010d8282610148565b5050565b6001546001600160a01b0316331461013c5760405163794821ff60e01b815260040160405180910390fd5b610145816101cf565b50565b6001600160a01b03821661016f576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101f6576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b0381168114610275575f5ffd5b919050565b5f6020828403121561028a575f5ffd5b6102938261025f565b9392505050565b5f5f604083850312156102ab575f5ffd5b6102b48361025f565b9150602083013580151581146102c8575f5ffd5b80915050925092905056fea2646970667358221220db74dd8a1c2636fc45fee53a0fefff90f86f0498901cb732dc4c0ce26247557164736f6c634300081b0033",
+ Bin: "0x608060405234801561000f575f5ffd5b506040516105c83803806105c883398101604081905261002e916101c2565b5f5b825181101561006b5761006383828151811061004e5761004e61029e565b6020026020010151600161007c60201b60201c565b600101610030565b5061007581610103565b50506102b2565b6001600160a01b0382166100a3576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661012a576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146101bd575f5ffd5b919050565b5f5f604083850312156101d3575f5ffd5b82516001600160401b038111156101e8575f5ffd5b8301601f810185136101f8575f5ffd5b80516001600160401b0381111561021157610211610193565b604051600582901b90603f8201601f191681016001600160401b038111828210171561023f5761023f610193565b60405291825260208184018101929081018884111561025c575f5ffd5b6020850194505b8385101561028257610274856101a7565b815260209485019401610263565b50945061029592505050602084016101a7565b90509250929050565b634e487b7160e01b5f52603260045260245ffd5b610309806102bf5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806346fbf68e1461004e5780638568520614610085578063ce5484281461009a578063eab66d7a146100ad575b5f5ffd5b61007061005c36600461027a565b5f6020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009861009336600461029a565b6100d8565b005b6100986100a836600461027a565b610111565b6001546100c0906001600160a01b031681565b6040516001600160a01b03909116815260200161007c565b6001546001600160a01b031633146101035760405163794821ff60e01b815260040160405180910390fd5b61010d8282610148565b5050565b6001546001600160a01b0316331461013c5760405163794821ff60e01b815260040160405180910390fd5b610145816101cf565b50565b6001600160a01b03821661016f576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101f6576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b0381168114610275575f5ffd5b919050565b5f6020828403121561028a575f5ffd5b6102938261025f565b9392505050565b5f5f604083850312156102ab575f5ffd5b6102b48361025f565b9150602083013580151581146102c8575f5ffd5b80915050925092905056fea26469706673582212202917159df0783c456a04923c0900b80ef8974eef653605675c7597eb49e08fe864736f6c634300081b0033",
}
// PauserRegistryABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/PermissionController/binding.go b/pkg/bindings/PermissionController/binding.go
index 42053b7097..0693889a3d 100644
--- a/pkg/bindings/PermissionController/binding.go
+++ b/pkg/bindings/PermissionController/binding.go
@@ -31,8 +31,8 @@ var (
// PermissionControllerMetaData contains all meta data concerning the PermissionController contract.
var PermissionControllerMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canCall\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]}]",
- Bin: "0x6080604052348015600e575f5ffd5b5060156019565b60d3565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161460d1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610f40806100e05f395ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c80639100674511610088578063ad8aca7711610063578063ad8aca77146101b0578063df595cb8146101c3578063eb5a4e87146101d6578063fddbdefd146101e9575f5ffd5b80639100674514610167578063950d806e1461018a578063ad5f22101461019d575f5ffd5b806306641201146100cf578063268959e5146100e45780634f906cf9146100f7578063628806ef1461010a5780636bddfa1f1461011d578063882a3b3814610146575b5f5ffd5b6100e26100dd366004610cfa565b6101fc565b005b6100e26100f2366004610d4b565b61031d565b6100e2610105366004610d4b565b6103f8565b6100e2610118366004610d7c565b61049b565b61013061012b366004610d7c565b610529565b60405161013d9190610dd8565b60405180910390f35b610159610154366004610d4b565b610552565b60405161013d929190610dea565b61017a610175366004610d4b565b6106b3565b604051901515815260200161013d565b6100e2610198366004610cfa565b610723565b6101306101ab366004610d7c565b610834565b61017a6101be366004610d4b565b6108da565b61017a6101d1366004610cfa565b6108fb565b6100e26101e4366004610d4b565b610950565b6101306101f7366004610e4c565b610a1e565b8361020781336106b3565b61022457604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906102468585610a5c565b6001600160a01b0387165f908152600484016020526040902090915061026c9082610a89565b6102895760405163262118cd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206102ac9082610aa0565b505f81815260058301602052604090206102c69087610aab565b50856001600160a01b0316876001600160a01b03167f18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6878760405161030c929190610e8c565b60405180910390a350505050505050565b8161032881336106b3565b61034557604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602081905260409091206002019061036c82610abf565b1161038a576040516310ce892b60e31b815260040160405180910390fd5b6103948184610aab565b6103b157604051630716d81b60e51b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce906020015b60405180910390a250505050565b8161040381336106b3565b61042057604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206104418184610aab565b61045e5760405163bed8295f60e01b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7906020016103ea565b6001600160a01b0381165f9081526001602052604090206104bc8133610aab565b6104d95760405163bed8295f60e01b815260040160405180910390fd5b6104e66002820133610ac8565b506040513381526001600160a01b038316907fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff979060200160405180910390a25050565b6001600160a01b0381165f90815260016020526040902060609061054c90610adc565b92915050565b6001600160a01b038083165f90815260016020908152604080832093851683526004909301905290812060609182919061058b82610abf565b90505f8167ffffffffffffffff8111156105a7576105a7610eaf565b6040519080825280602002602001820160405280156105d0578160200160208202803683370190505b5090505f8267ffffffffffffffff8111156105ed576105ed610eaf565b604051908082528060200260200182016040528015610616578160200160208202803683370190505b5090505f5b838110156106a5576106496106308683610ae8565b606081901c9160a09190911b6001600160e01b03191690565b84838151811061065b5761065b610ec3565b6020026020010184848151811061067457610674610ec3565b6001600160e01b0319909316602093840291909101909201919091526001600160a01b03909116905260010161061b565b509097909650945050505050565b6001600160a01b0382165f9081526001602052604081206106d690600201610abf565b5f036106f857816001600160a01b0316836001600160a01b031614905061054c565b6001600160a01b0383165f90815260016020526040902061071c9060020183610af3565b9392505050565b8361072e81336106b3565b61074b57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526001602052604081209061076d8585610a5c565b6001600160a01b0387165f90815260048401602052604090209091506107939082610a89565b156107b15760405163ad8efeb760e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206107d49082610b14565b505f81815260058301602052604090206107ee9087610ac8565b50856001600160a01b0316876001600160a01b03167f037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169878760405161030c929190610e8c565b6001600160a01b0381165f90815260016020526040902060609061085a90600201610abf565b5f036108b2576040805160018082528183019092525f916020808301908036833701905050905082815f8151811061089457610894610ec3565b6001600160a01b039092166020928302919091019091015292915050565b6001600160a01b0382165f90815260016020526040902061054c90600201610adc565b919050565b6001600160a01b0382165f90815260016020526040812061071c9083610af3565b5f61090685856106b3565b8061094757506109476109198484610a5c565b6001600160a01b038088165f908152600160209081526040808320938a168352600490930190522090610a89565b95945050505050565b8161095b81336106b3565b61097857604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260016020526040902061099c6002820184610af3565b156109ba5760405163130160e560e31b815260040160405180910390fd5b6109c48184610ac8565b6109e1576040516319abede360e11b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c906020016103ea565b60605f610a2b8484610a5c565b6001600160a01b0386165f908152600160209081526040808320848452600501909152902090915061094790610adc565b60609190911b6bffffffffffffffffffffffff191660a09190911c6bffffffff0000000000000000161790565b5f818152600183016020526040812054151561071c565b5f61071c8383610b1f565b5f61071c836001600160a01b038416610b1f565b5f61054c825490565b5f61071c836001600160a01b038416610c02565b60605f61071c83610c4e565b5f61071c8383610ca7565b6001600160a01b0381165f908152600183016020526040812054151561071c565b5f61071c8383610c02565b5f8181526001830160205260408120548015610bf9575f610b41600183610ed7565b85549091505f90610b5490600190610ed7565b9050818114610bb3575f865f018281548110610b7257610b72610ec3565b905f5260205f200154905080875f018481548110610b9257610b92610ec3565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610bc457610bc4610ef6565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061054c565b5f91505061054c565b5f818152600183016020526040812054610c4757508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561054c565b505f61054c565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c9b57602002820191905f5260205f20905b815481526020019060010190808311610c87575b50505050509050919050565b5f825f018281548110610cbc57610cbc610ec3565b905f5260205f200154905092915050565b80356001600160a01b03811681146108d5575f5ffd5b80356001600160e01b0319811681146108d5575f5ffd5b5f5f5f5f60808587031215610d0d575f5ffd5b610d1685610ccd565b9350610d2460208601610ccd565b9250610d3260408601610ccd565b9150610d4060608601610ce3565b905092959194509250565b5f5f60408385031215610d5c575f5ffd5b610d6583610ccd565b9150610d7360208401610ccd565b90509250929050565b5f60208284031215610d8c575f5ffd5b61071c82610ccd565b5f8151808452602084019350602083015f5b82811015610dce5781516001600160a01b0316865260209586019590910190600101610da7565b5093949350505050565b602081525f61071c6020830184610d95565b604081525f610dfc6040830185610d95565b82810360208401528084518083526020830191506020860192505f5b81811015610e405783516001600160e01b031916835260209384019390920191600101610e18565b50909695505050505050565b5f5f5f60608486031215610e5e575f5ffd5b610e6784610ccd565b9250610e7560208501610ccd565b9150610e8360408501610ce3565b90509250925092565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b8181038181111561054c57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220d51174d6b3c524ff4f2a28349f859cd925e5fb8f0c1cd6c178158e9059cdc26c64736f6c634300081b0033",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canCall\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
+ Bin: "0x60a060405234801561000f575f5ffd5b506040516112b73803806112b783398101604081905261002e9161015c565b806100388161004a565b60805250610044610090565b50610267565b5f5f829050601f8151111561007d578260405163305a27a960e01b8152600401610074919061020c565b60405180910390fd5b805161008882610241565b179392505050565b5f54610100900460ff16156100f75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610074565b5f5460ff90811614610146575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561016c575f5ffd5b81516001600160401b03811115610181575f5ffd5b8201601f81018413610191575f5ffd5b80516001600160401b038111156101aa576101aa610148565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101d8576101d8610148565b6040528181528282016020018610156101ef575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610261575f198160200360031b1b821691505b50919050565b60805161103861027f5f395f6104d101526110385ff3fe608060405234801561000f575f5ffd5b50600436106100e5575f3560e01c80639100674511610088578063ad8aca7711610063578063ad8aca77146101df578063df595cb8146101f2578063eb5a4e8714610205578063fddbdefd14610218575f5ffd5b80639100674514610196578063950d806e146101b9578063ad5f2210146101cc575f5ffd5b806354fd4d50116100c357806354fd4d5014610124578063628806ef146101425780636bddfa1f14610155578063882a3b3814610175575f5ffd5b806306641201146100e9578063268959e5146100fe5780634f906cf914610111575b5f5ffd5b6100fc6100f7366004610dbd565b61022b565b005b6100fc61010c366004610e0e565b61034c565b6100fc61011f366004610e0e565b610427565b61012c6104ca565b6040516101399190610e3f565b60405180910390f35b6100fc610150366004610e74565b6104fa565b610168610163366004610e74565b610588565b6040516101399190610ed0565b610188610183366004610e0e565b6105b1565b604051610139929190610ee2565b6101a96101a4366004610e0e565b610712565b6040519015158152602001610139565b6100fc6101c7366004610dbd565b610782565b6101686101da366004610e74565b610893565b6101a96101ed366004610e0e565b610939565b6101a9610200366004610dbd565b61095a565b6100fc610213366004610e0e565b6109af565b610168610226366004610f44565b610a7d565b836102368133610712565b61025357604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906102758585610abb565b6001600160a01b0387165f908152600484016020526040902090915061029b9082610ae8565b6102b85760405163262118cd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206102db9082610aff565b505f81815260058301602052604090206102f59087610b0a565b50856001600160a01b0316876001600160a01b03167f18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6878760405161033b929190610f84565b60405180910390a350505050505050565b816103578133610712565b61037457604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602081905260409091206002019061039b82610b1e565b116103b9576040516310ce892b60e31b815260040160405180910390fd5b6103c38184610b0a565b6103e057604051630716d81b60e51b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce906020015b60405180910390a250505050565b816104328133610712565b61044f57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206104708184610b0a565b61048d5760405163bed8295f60e01b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac790602001610419565b60606104f57f0000000000000000000000000000000000000000000000000000000000000000610b27565b905090565b6001600160a01b0381165f90815260016020526040902061051b8133610b0a565b6105385760405163bed8295f60e01b815260040160405180910390fd5b6105456002820133610b64565b506040513381526001600160a01b038316907fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff979060200160405180910390a25050565b6001600160a01b0381165f9081526001602052604090206060906105ab90610b78565b92915050565b6001600160a01b038083165f9081526001602090815260408083209385168352600490930190529081206060918291906105ea82610b1e565b90505f8167ffffffffffffffff81111561060657610606610fa7565b60405190808252806020026020018201604052801561062f578160200160208202803683370190505b5090505f8267ffffffffffffffff81111561064c5761064c610fa7565b604051908082528060200260200182016040528015610675578160200160208202803683370190505b5090505f5b83811015610704576106a861068f8683610b84565b606081901c9160a09190911b6001600160e01b03191690565b8483815181106106ba576106ba610fbb565b602002602001018484815181106106d3576106d3610fbb565b6001600160e01b0319909316602093840291909101909201919091526001600160a01b03909116905260010161067a565b509097909650945050505050565b6001600160a01b0382165f90815260016020526040812061073590600201610b1e565b5f0361075757816001600160a01b0316836001600160a01b03161490506105ab565b6001600160a01b0383165f90815260016020526040902061077b9060020183610b8f565b9392505050565b8361078d8133610712565b6107aa57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906107cc8585610abb565b6001600160a01b0387165f90815260048401602052604090209091506107f29082610ae8565b156108105760405163ad8efeb760e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206108339082610bb0565b505f818152600583016020526040902061084d9087610b64565b50856001600160a01b0316876001600160a01b03167f037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169878760405161033b929190610f84565b6001600160a01b0381165f9081526001602052604090206060906108b990600201610b1e565b5f03610911576040805160018082528183019092525f916020808301908036833701905050905082815f815181106108f3576108f3610fbb565b6001600160a01b039092166020928302919091019091015292915050565b6001600160a01b0382165f9081526001602052604090206105ab90600201610b78565b919050565b6001600160a01b0382165f90815260016020526040812061077b9083610b8f565b5f6109658585610712565b806109a657506109a66109788484610abb565b6001600160a01b038088165f908152600160209081526040808320938a168352600490930190522090610ae8565b95945050505050565b816109ba8133610712565b6109d757604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206109fb6002820184610b8f565b15610a195760405163130160e560e31b815260040160405180910390fd5b610a238184610b64565b610a40576040516319abede360e11b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c90602001610419565b60605f610a8a8484610abb565b6001600160a01b0386165f90815260016020908152604080832084845260050190915290209091506109a690610b78565b60609190911b6bffffffffffffffffffffffff191660a09190911c6bffffffff0000000000000000161790565b5f818152600183016020526040812054151561077b565b5f61077b8383610bbb565b5f61077b836001600160a01b038416610bbb565b5f6105ab825490565b60605f610b3383610c9e565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f61077b836001600160a01b038416610cc5565b60605f61077b83610d11565b5f61077b8383610d6a565b6001600160a01b0381165f908152600183016020526040812054151561077b565b5f61077b8383610cc5565b5f8181526001830160205260408120548015610c95575f610bdd600183610fcf565b85549091505f90610bf090600190610fcf565b9050818114610c4f575f865f018281548110610c0e57610c0e610fbb565b905f5260205f200154905080875f018481548110610c2e57610c2e610fbb565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610c6057610c60610fee565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506105ab565b5f9150506105ab565b5f60ff8216601f8111156105ab57604051632cd44ac360e21b815260040160405180910390fd5b5f818152600183016020526040812054610d0a57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556105ab565b505f6105ab565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610d5e57602002820191905f5260205f20905b815481526020019060010190808311610d4a575b50505050509050919050565b5f825f018281548110610d7f57610d7f610fbb565b905f5260205f200154905092915050565b80356001600160a01b0381168114610934575f5ffd5b80356001600160e01b031981168114610934575f5ffd5b5f5f5f5f60808587031215610dd0575f5ffd5b610dd985610d90565b9350610de760208601610d90565b9250610df560408601610d90565b9150610e0360608601610da6565b905092959194509250565b5f5f60408385031215610e1f575f5ffd5b610e2883610d90565b9150610e3660208401610d90565b90509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215610e84575f5ffd5b61077b82610d90565b5f8151808452602084019350602083015f5b82811015610ec65781516001600160a01b0316865260209586019590910190600101610e9f565b5093949350505050565b602081525f61077b6020830184610e8d565b604081525f610ef46040830185610e8d565b82810360208401528084518083526020830191506020860192505f5b81811015610f385783516001600160e01b031916835260209384019390920191600101610f10565b50909695505050505050565b5f5f5f60608486031215610f56575f5ffd5b610f5f84610d90565b9250610f6d60208501610d90565b9150610f7b60408501610da6565b90509250925092565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b818103818111156105ab57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220ab9bde44aeb13051e26dbeabefa3bed0231ce62858e181557792c52c88a0538164736f6c634300081b0033",
}
// PermissionControllerABI is the input ABI used to generate the binding from.
@@ -44,7 +44,7 @@ var PermissionControllerABI = PermissionControllerMetaData.ABI
var PermissionControllerBin = PermissionControllerMetaData.Bin
// DeployPermissionController deploys a new Ethereum contract, binding an instance of PermissionController to it.
-func DeployPermissionController(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *PermissionController, error) {
+func DeployPermissionController(auth *bind.TransactOpts, backend bind.ContractBackend, _version string) (common.Address, *types.Transaction, *PermissionController, error) {
parsed, err := PermissionControllerMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
@@ -53,7 +53,7 @@ func DeployPermissionController(auth *bind.TransactOpts, backend bind.ContractBa
return common.Address{}, nil, nil, errors.New("GetABI returned nil")
}
- address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(PermissionControllerBin), backend)
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(PermissionControllerBin), backend, _version)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -420,6 +420,37 @@ func (_PermissionController *PermissionControllerCallerSession) IsPendingAdmin(a
return _PermissionController.Contract.IsPendingAdmin(&_PermissionController.CallOpts, account, pendingAdmin)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_PermissionController *PermissionControllerCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _PermissionController.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_PermissionController *PermissionControllerSession) Version() (string, error) {
+ return _PermissionController.Contract.Version(&_PermissionController.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_PermissionController *PermissionControllerCallerSession) Version() (string, error) {
+ return _PermissionController.Contract.Version(&_PermissionController.CallOpts)
+}
+
// AcceptAdmin is a paid mutator transaction binding the contract method 0x628806ef.
//
// Solidity: function acceptAdmin(address account) returns()
diff --git a/pkg/bindings/PermissionControllerStorage/binding.go b/pkg/bindings/PermissionControllerStorage/binding.go
index d2026919a0..80c70e6ce3 100644
--- a/pkg/bindings/PermissionControllerStorage/binding.go
+++ b/pkg/bindings/PermissionControllerStorage/binding.go
@@ -31,7 +31,7 @@ var (
// PermissionControllerStorageMetaData contains all meta data concerning the PermissionControllerStorage contract.
var PermissionControllerStorageMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"function\",\"name\":\"acceptAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canCall\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]}]",
+ ABI: "[{\"type\":\"function\",\"name\":\"acceptAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canCall\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]}]",
}
// PermissionControllerStorageABI is the input ABI used to generate the binding from.
@@ -304,6 +304,37 @@ func (_PermissionControllerStorage *PermissionControllerStorageCallerSession) Is
return _PermissionControllerStorage.Contract.IsPendingAdmin(&_PermissionControllerStorage.CallOpts, account, pendingAdmin)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_PermissionControllerStorage *PermissionControllerStorageCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _PermissionControllerStorage.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_PermissionControllerStorage *PermissionControllerStorageSession) Version() (string, error) {
+ return _PermissionControllerStorage.Contract.Version(&_PermissionControllerStorage.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_PermissionControllerStorage *PermissionControllerStorageCallerSession) Version() (string, error) {
+ return _PermissionControllerStorage.Contract.Version(&_PermissionControllerStorage.CallOpts)
+}
+
// AcceptAdmin is a paid mutator transaction binding the contract method 0x628806ef.
//
// Solidity: function acceptAdmin(address account) returns()
diff --git a/pkg/bindings/RewardsCoordinator/binding.go b/pkg/bindings/RewardsCoordinator/binding.go
index 4a8f27e6f1..1b31b8462f 100644
--- a/pkg/bindings/RewardsCoordinator/binding.go
+++ b/pkg/bindings/RewardsCoordinator/binding.go
@@ -59,6 +59,21 @@ type IRewardsCoordinatorTypesOperatorReward struct {
Amount *big.Int
}
+// IRewardsCoordinatorTypesRewardsCoordinatorConstructorParams is an auto generated low-level Go binding around an user-defined struct.
+type IRewardsCoordinatorTypesRewardsCoordinatorConstructorParams struct {
+ DelegationManager common.Address
+ StrategyManager common.Address
+ AllocationManager common.Address
+ PauserRegistry common.Address
+ PermissionController common.Address
+ CALCULATIONINTERVALSECONDS uint32
+ MAXREWARDSDURATION uint32
+ MAXRETROACTIVELENGTH uint32
+ MAXFUTURELENGTH uint32
+ GENESISREWARDSTIMESTAMP uint32
+ Version string
+}
+
// IRewardsCoordinatorTypesRewardsMerkleClaim is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesRewardsMerkleClaim struct {
RootIndex uint32
@@ -99,8 +114,8 @@ type OperatorSet struct {
// RewardsCoordinatorMetaData contains all meta data concerning the RewardsCoordinator contract.
var RewardsCoordinatorMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedOperatorSetRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"totalClaimed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defaultOperatorSplitBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetSplit\",\"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\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_defaultSplitBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedOperatorSetRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"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\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaims\",\"inputs\":[{\"name\":\"claims\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim[]\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDefaultOperatorSplit\",\"inputs\":[{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorSetSplit\",\"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\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultOperatorSplitBipsSet\",\"inputs\":[{\"name\":\"oldDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedAVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedOperatorSetRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorPISplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"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\"}]},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"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\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllEarnersCreated\",\"inputs\":[{\"name\":\"tokenHopper\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCalculationIntervalSecondsRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidClaimProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDurationRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarnerLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGenesisRewardsTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRootIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStartTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewRootMustBeForNewCalculatedPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousSplitPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SplitExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SubmissionNotRetroactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]",
- Bin: "0x6101c0604052348015610010575f5ffd5b50604051614a90380380614a9083398101604081905261002f91610211565b858a8a8a88888888888f6001600160a01b038116610060576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261007685826102d3565b63ffffffff161561009a57604051630e06bd3160e01b815260040160405180910390fd5b6100a762015180866102d3565b63ffffffff16156100cb5760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a052610117610126565b50505050505050505050610306565b5f54610100900460ff16156101915760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101e0575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f6575f5ffd5b50565b805163ffffffff8116811461020c575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022b575f5ffd5b8a51610236816101e2565b60208c0151909a50610247816101e2565b60408c0151909950610258816101e2565b60608c0151909850610269816101e2565b60808c015190975061027a816101e2565b955061028860a08c016101f9565b945061029660c08c016101f9565b93506102a460e08c016101f9565b92506102b36101008c016101f9565b91506102c26101208c016101f9565b90509295989b9194979a5092959850565b5f63ffffffff8316806102f457634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516146b26103de5f395f81816105e5015261278101525f8181610499015261352801525f81816103e80152612bc301525f818161054701526134e601525f818161085e01526133f601525f818161079f01528181613446015261349401525f81816108b201528181610adb01528181611dd6015261208201525f818161056e01526135c301525f81816109250152611d4601525f818161073101528181610eb9015281816114bb015261236101526146b25ff3fe608060405234801561000f575f5ffd5b50600436106103a8575f3560e01c80638da5cb5b116101ea578063de02e50311610114578063f6efbb59116100a9578063fabc1cbc11610079578063fabc1cbc14610a13578063fbf1e2c114610a26578063fce36c7d14610a39578063ff9f6cce14610a4c575f5ffd5b8063f6efbb59146109c7578063f74e8eac146109da578063f8cd8448146109ed578063f96abf2e14610a00575f5ffd5b8063ed71e6a2116100e4578063ed71e6a214610947578063f22cef8514610974578063f2f07ab414610987578063f2fde38b146109b4575f5ffd5b8063de02e503146108e7578063e063f81f146108fa578063e810ce211461090d578063ea4d3c9b14610920575f5ffd5b8063a50a1d9c1161018a578063bf21a8aa1161015a578063bf21a8aa14610859578063c46db60614610880578063ca8aa7c7146108ad578063dcbb03b3146108d4575f5ffd5b8063a50a1d9c146107e7578063aebd8bae146107fa578063b3dbb0e014610827578063bb7e451f1461083a575f5ffd5b80639cb9a5fa116101c55780639cb9a5fa146107875780639d45c2811461079a5780639de4b35f146107c1578063a0169ddd146107d4575f5ffd5b80638da5cb5b146107535780639104c319146107645780639be3d4e41461077f575f5ffd5b80634596021c116102d65780635e9d83481161026b5780637b8f8b051161023b5780637b8f8b05146106e7578063863cb9a9146106ef578063865c695314610702578063886f11951461072c575f5ffd5b80635e9d83481461068a57806363f6a7981461069d5780636d21117e146106b2578063715018a6146106df575f5ffd5b806358baaa3e116102a657806358baaa3e14610644578063595c6a67146106575780635ac86ab71461065f5780635c975abb14610682575f5ffd5b80634596021c146105cd5780634657e26a146105e05780634b943960146106075780634d18cc351461062d575f5ffd5b8063149bc8721161034c57806339b70e381161031c57806339b70e38146105695780633a8c0786146105905780633ccc861d146105a75780633efe1db6146105ba575f5ffd5b8063149bc872146104ce5780632b9f64a4146104ef57806336af41fa1461052f57806337838ed014610542575f5ffd5b80630e9a53cf116103875780630e9a53cf146104345780630eb3834514610481578063131433b414610494578063136439dd146104bb575f5ffd5b806218572c146103ac57806304a0c502146103e35780630ca298991461041f575b5f5ffd5b6103ce6103ba366004613adf565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103da565b61043261042d366004613b57565b610a5f565b005b61043c610d24565b6040516103da91905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61043261048f366004613bb3565b610e24565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b6104326104c9366004613bea565b610ea4565b6104e16104dc366004613c01565b610f79565b6040519081526020016103da565b6105176104fd366004613adf565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103da565b61043261053d366004613c1b565b610fee565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b60cb5461040a90600160a01b900463ffffffff1681565b6104326105b5366004613c6a565b61117d565b6104326105c8366004613cc0565b6111c2565b6104326105db366004613cea565b6113b6565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b61061a610615366004613adf565b611437565b60405161ffff90911681526020016103da565b60cb5461040a90600160c01b900463ffffffff1681565b610432610652366004613d3c565b611492565b6104326114a6565b6103ce61066d366004613d55565b606654600160ff9092169190911b9081161490565b6066546104e1565b6103ce610698366004613d75565b611555565b60cb5461061a90600160e01b900461ffff1681565b6103ce6106c0366004613da6565b60cf60209081525f928352604080842090915290825290205460ff1681565b6104326115e0565b60ca546104e1565b6104326106fd366004613adf565b6115f1565b6104e1610710366004613dd0565b60cd60209081525f928352604080842090915290825290205481565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b0316610517565b61051773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61043c611602565b610432610795366004613dfc565b61169e565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b61061a6107cf366004613e33565b611837565b6104326107e2366004613adf565b6118ba565b6104326107f5366004613e6f565b6118c5565b6103ce610808366004613da6565b60d260209081525f928352604080842090915290825290205460ff1681565b610432610835366004613e88565b6118d6565b6104e1610848366004613adf565b60ce6020525f908152604090205481565b61040a7f000000000000000000000000000000000000000000000000000000000000000081565b6103ce61088e366004613da6565b60d060209081525f928352604080842090915290825290205460ff1681565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b6104326108e2366004613eb2565b611a1f565b61043c6108f5366004613bea565b611b8a565b61061a610908366004613dd0565b611c1a565b61040a61091b366004613bea565b611c7f565b6105177f000000000000000000000000000000000000000000000000000000000000000081565b6103ce610955366004613da6565b60d360209081525f928352604080842090915290825290205460ff1681565b610432610982366004613dd0565b611d00565b6103ce610995366004613da6565b60d760209081525f928352604080842090915290825290205460ff1681565b6104326109c2366004613adf565b611e6a565b6104326109d5366004613ef6565b611ee5565b6104326109e8366004613f54565b61201a565b6104e16109fb366004613c01565b612200565b610432610a0e366004613d3c565b612210565b610432610a21366004613bea565b61235f565b60cb54610517906001600160a01b031681565b610432610a47366004613c1b565b612475565b610432610a5a366004613c1b565b6125c4565b60665460099061020090811603610a895760405163840a48d560e01b815260040160405180910390fd5b610a966020850185613adf565b610a9f81612743565b610abc5760405163932d94f760e01b815260040160405180910390fd5b610ac46127ed565b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610b10908890600401613fbf565b602060405180830381865afa158015610b2b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4f9190613fcd565b610b6c57604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610d125736858583818110610b8957610b89613fe8565b9050602002810190610b9b9190613ffc565b90505f60ce81610bae60208b018b613adf565b6001600160a01b031681526020808201929092526040015f90812054925090610bd9908a018a613adf565b8284604051602001610bed93929190614224565b6040516020818303038152906040528051906020012090505f610c0f84612846565b9050600160d75f610c2360208e018e613adf565b6001600160a01b0316815260208082019290925260409081015f9081208682529092529020805460ff1916911515919091179055610c62836001614267565b60ce5f610c7260208e018e613adf565b6001600160a01b03166001600160a01b031681526020019081526020015f208190555081336001600160a01b03167ffff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc7568c8688604051610cd39392919061427a565b60405180910390a3610d02333083610cf16040890160208a01613adf565b6001600160a01b0316929190612a31565b505060019092019150610b6e9050565b50610d1d6001609755565b5050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610dfc575f60ca610d5f60018461429f565b81548110610d6f57610d6f613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610dde5750806040015163ffffffff164210155b15610de95792915050565b5080610df4816142b2565b915050610d4b565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610e2c612a9c565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610f06573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2a9190613fcd565b610f4757604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610f6c5760405163c61dca5d60e01b815260040160405180910390fd5b610f7582612af6565b5050565b5f80610f886020840184613adf565b8360200135604051602001610fd19392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b6066546001906002908116036110175760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661104657604051635c427cd960e01b815260040160405180910390fd5b61104e6127ed565b5f5b8281101561116d573684848381811061106b5761106b613fe8565b905060200281019061107d91906142c7565b335f81815260ce602090815260408083205490519495509391926110a79290918591879101614359565b6040516020818303038152906040528051906020012090506110c883612b33565b335f90815260d0602090815260408083208484529091529020805460ff191660019081179091556110fa908390614267565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf2704829061114190889061437f565b60405180910390a4611162333060408601803590610cf19060208901613adf565b505050600101611050565b506111786001609755565b505050565b6066546002906004908116036111a65760405163840a48d560e01b815260040160405180910390fd5b6111ae6127ed565b6111b88383612c1e565b6111786001609755565b6066546003906008908116036111eb5760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b0316331461121657604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b90910481169083161161124957604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff161061126f576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f9061128e90600160a01b900463ffffffff1642614391565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036113df5760405163840a48d560e01b815260040160405180910390fd5b6113e76127ed565b5f5b838110156114265761141e85858381811061140657611406613fe8565b905060200281019061141891906143ad565b84612c1e565b6001016113e9565b506114316001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261148c90612ea6565b92915050565b61149a612a9c565b6114a381612f16565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611508573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152c9190613fcd565b61154957604051631d77d47760e21b815260040160405180910390fd5b6115535f19612af6565b565b5f6115d88260ca6115696020830183613d3c565b63ffffffff168154811061157f5761157f613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612f87565b506001919050565b6115e8612a9c565b6115535f61312a565b6115f9612a9c565b6114a38161317b565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546116359060019061429f565b8154811061164557611645613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036116c75760405163840a48d560e01b815260040160405180910390fd5b836116d181612743565b6116ee5760405163932d94f760e01b815260040160405180910390fd5b6116f66127ed565b5f5b83811015610d12573685858381811061171357611713613fe8565b90506020028101906117259190613ffc565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611756918b918591879101614224565b6040516020818303038152906040528051906020012090505f61177884612846565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff191660019081179091559091506117b6908490614267565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906118099088908a906143c1565b60405180910390a4611827333083610cf16040890160208a01613adf565b5050600190920191506116f89050565b6001600160a01b0382165f90815260d6602052604081206118b3908261186a611865368790038701876143d9565b6131d6565b815260208082019290925260409081015f208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152612ea6565b9392505050565b33610f758183613239565b6118cd612a9c565b6114a38161329c565b6066546007906080908116036118ff5760405163840a48d560e01b815260040160405180910390fd5b8261190981612743565b6119265760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061194290600160a01b900463ffffffff1642614391565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff16908201529192509061199b90612ea6565b6001600160a01b0387165f90815260d5602052604090209091506119c0908684613307565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b606654600690604090811603611a485760405163840a48d560e01b815260040160405180910390fd5b83611a5281612743565b611a6f5760405163932d94f760e01b815260040160405180910390fd5b60cb545f90611a8b90600160a01b900463ffffffff1642614391565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252919250611af290612ea6565b6001600160a01b038089165f90815260d460209081526040808320938b16835292905220909150611b24908684613307565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca8281548110611bc057611bc0613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252906118b390612ea6565b60ca545f905b63ffffffff811615611ce6578260ca611c9f600184614441565b63ffffffff1681548110611cb557611cb5613fe8565b905f5260205f2090600202015f015403611cd4576118b3600182614441565b80611cde8161445d565b915050611c85565b5060405163504570e360e01b815260040160405180910390fd5b81611d0a81612743565b611d275760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611d8b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611daf9190613fcd565b80611e43575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611e1d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e41919061447b565b115b611e605760405163fb494ea160e01b815260040160405180910390fd5b6111788383613239565b611e72612a9c565b6001600160a01b038116611edc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6114a38161312a565b5f54610100900460ff1615808015611f0357505f54600160ff909116105b80611f1c5750303b158015611f1c57505f5460ff166001145b611f7f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611ed3565b5f805460ff191660011790558015611fa0575f805461ff0019166101001790555b611fa985612af6565b611fb28661312a565b611fbb8461317b565b611fc483612f16565b611fcd8261329c565b8015612012575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b606654600890610100908116036120445760405163840a48d560e01b815260040160405180910390fd5b8361204e81612743565b61206b5760405163932d94f760e01b815260040160405180910390fd5b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc758906120b7908790600401613fbf565b602060405180830381865afa1580156120d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120f69190613fcd565b61211357604051631fb1705560e21b815260040160405180910390fd5b60cb545f9061212f90600160a01b900463ffffffff1642614391565b6001600160a01b0387165f90815260d66020526040812091925090612161908261186a611865368b90038b018b6143d9565b6001600160a01b0388165f90815260d6602052604081209192506121a69190612192611865368b90038b018b6143d9565b81526020019081526020015f208684613307565b866001600160a01b0316336001600160a01b03167f14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f18885858a6040516121ef9493929190614492565b60405180910390a350505050505050565b5f6001610f886020840184613adf565b6066546003906008908116036122395760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b0316331461226457604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff83161061228c576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff16815481106122a6576122a6613fe8565b905f5260205f20906002020190508060010160089054906101000a900460ff16156122e457604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff16421061231557604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123df91906144c6565b6001600160a01b0316336001600160a01b0316146124105760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146124375760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f9060019081160361249d5760405163840a48d560e01b815260040160405180910390fd5b6124a56127ed565b5f5b8281101561116d57368484838181106124c2576124c2613fe8565b90506020028101906124d491906142c7565b335f81815260ce602090815260408083205490519495509391926124fe9290918591879101614359565b60405160208183030381529060405280519060200120905061251f83612b33565b335f90815260cf602090815260408083208484529091529020805460ff19166001908117909155612551908390614267565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e62819061259890889061437f565b60405180910390a46125b9333060408601803590610cf19060208901613adf565b5050506001016124a7565b6066546004906010908116036125ed5760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661261c57604051635c427cd960e01b815260040160405180910390fd5b6126246127ed565b5f5b8281101561116d573684848381811061264157612641613fe8565b905060200281019061265391906142c7565b335f81815260ce6020908152604080832054905194955093919261267d9290918591879101614359565b60405160208183030381529060405280519060200120905061269e83612b33565b335f90815260d2602090815260408083208484529091529020805460ff191660019081179091556126d0908390614267565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b9061271790889061437f565b60405180910390a4612738333060408601803590610cf19060208901613adf565b505050600101612626565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156127c9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061148c9190613fcd565b60026097540361283f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611ed3565b6002609755565b5f61287961285483806144e1565b6128646080860160608701613d3c565b61287460a0870160808801613d3c565b6133d6565b5f61288760408401846144e1565b9050116128a75760405163796cc52560e01b815260040160405180910390fd5b426128b860a0840160808501613d3c565b6128c86080850160608601613d3c565b6128d29190614391565b63ffffffff16106128f65760405163150358a160e21b815260040160405180910390fd5b5f80805b61290760408601866144e1565b90508110156129f8573661291e60408701876144e1565b8381811061292e5761292e613fe8565b6040029190910191505f90506129476020830183613adf565b6001600160a01b03160361296e57604051630863a45360e11b815260040160405180910390fd5b61297b6020820182613adf565b6001600160a01b0316836001600160a01b0316106129ac576040516310fb47f160e31b815260040160405180910390fd5b5f8160200135116129d0576040516310eb483f60e21b815260040160405180910390fd5b6129dd6020820182613adf565b92506129ed602082013585614267565b9350506001016128fa565b506f4b3b4ca85a86c47a098a223fffffffff821115612a2a5760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6040516001600160a01b03808516602483015283166044820152606481018290526114319085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526136ae565b6033546001600160a01b031633146115535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611ed3565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b612b60612b4082806144e1565b612b506080850160608601613d3c565b61287460a0860160808701613d3c565b5f816040013511612b84576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff81604001351115612bb95760405163070b5a6f60e21b815260040160405180910390fd5b612be963ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642614267565b612bf96080830160608401613d3c565b63ffffffff1611156114a357604051637ee2b44360e01b815260040160405180910390fd5b5f60ca612c2e6020850185613d3c565b63ffffffff1681548110612c4457612c44613fe8565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff16151560608201529050612ca48382612f87565b5f612cb56080850160608601613adf565b6001600160a01b038082165f90815260cc60205260409020549192501680612cda5750805b336001600160a01b03821614612d0357604051635c427cd960e01b815260040160405180910390fd5b5f5b612d1260a0870187614526565b90508110156120125736612d2960e08801886144e1565b83818110612d3957612d39613fe8565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612d6d90850185613adf565b6001600160a01b03166001600160a01b031681526020019081526020015f2054905080826020013511612db35760405163aa385e8160e01b815260040160405180910390fd5b5f612dc282602085013561429f565b6001600160a01b0387165f90815260cd60209081526040822092935085018035929190612def9087613adf565b6001600160a01b031681526020808201929092526040015f2091909155612e309089908390612e2090870187613adf565b6001600160a01b03169190613781565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce3190612e746020890189613adf565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050600101612d05565b5f816040015163ffffffff165f1480612ed85750815161ffff908116148015612ed85750816040015163ffffffff1642105b15612ef057505060cb54600160e01b900461ffff1690565b816040015163ffffffff16421015612f0957815161148c565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b806060015115612faa57604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff16421015612fd557604051631437a2bb60e31b815260040160405180910390fd5b612fe260c0830183614526565b9050612ff160a0840184614526565b905014613011576040516343714afd60e01b815260040160405180910390fd5b61301e60e08301836144e1565b905061302d60c0840184614526565b90501461304d576040516343714afd60e01b815260040160405180910390fd5b8051613079906130636040850160208601613d3c565b613070604086018661456b565b866060016137b1565b5f5b61308860a0840184614526565b90508110156111785761312260808401356130a660a0860186614526565b848181106130b6576130b6613fe8565b90506020020160208101906130cb9190613d3c565b6130d860c0870187614526565b858181106130e8576130e8613fe8565b90506020028101906130fa919061456b565b61310760e08901896144e1565b8781811061311757613117613fe8565b905060400201613855565b60010161307b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b5f815f0151826020015163ffffffff1660405160200161322192919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261148c906145ad565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff8316111561332e5760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff16421161335c57604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f0361338357825461ffff191661ffff17835561339a565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b826133f45760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff16111561344157604051630dd0b9f560e21b815260040160405180910390fd5b61346b7f0000000000000000000000000000000000000000000000000000000000000000826145e4565b63ffffffff161561348f5760405163ee66470560e01b815260040160405180910390fd5b6134b97f0000000000000000000000000000000000000000000000000000000000000000836145e4565b63ffffffff16156134dd57604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642613516919061429f565b1115801561355057508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b61356d5760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015612012575f86868381811061358b5761358b613fe8565b6135a19260206040909202019081019150613adf565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa15801561360a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061362e9190613fcd565b8061365557506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61367257604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106136a45760405163dfad9ca160e01b815260040160405180910390fd5b9150600101613570565b5f613702826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138939092919063ffffffff16565b905080515f14806137225750808060200190518101906137229190613fcd565b6111785760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611ed3565b6040516001600160a01b03831660248201526044810182905261117890849063a9059cbb60e01b90606401612a65565b6137bc60208361460b565b6001901b8463ffffffff16106137e45760405162c6c39d60e71b815260040160405180910390fd5b5f6137ee82610f79565b905061383884848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166138a9565b612012576040516369ca16c960e01b815260040160405180910390fd5b61386060208361460b565b6001901b8463ffffffff16106138895760405163054ff4df60e51b815260040160405180910390fd5b5f6137ee82612200565b60606138a184845f856138c0565b949350505050565b5f836138b6868585613997565b1495945050505050565b6060824710156139215760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611ed3565b5f5f866001600160a01b0316858760405161393c919061461e565b5f6040518083038185875af1925050503d805f8114613976576040519150601f19603f3d011682016040523d82523d5f602084013e61397b565b606091505b509150915061398c87838387613a2e565b979650505050505050565b5f602084516139a69190614634565b156139c4576040516313717da960e21b815260040160405180910390fd5b8260205b85518111613a25576139db600285614634565b5f036139fc57815f528086015160205260405f209150600284049350613a13565b808601515f528160205260405f2091506002840493505b613a1e602082614267565b90506139c8565b50949350505050565b60608315613a9c5782515f03613a95576001600160a01b0385163b613a955760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611ed3565b50816138a1565b6138a18383815115613ab15781518083602001fd5b8060405162461bcd60e51b8152600401611ed39190614647565b6001600160a01b03811681146114a3575f5ffd5b5f60208284031215613aef575f5ffd5b81356118b381613acb565b5f60408284031215613b0a575f5ffd5b50919050565b5f5f83601f840112613b20575f5ffd5b5081356001600160401b03811115613b36575f5ffd5b6020830191508360208260051b8501011115613b50575f5ffd5b9250929050565b5f5f5f60608486031215613b69575f5ffd5b613b738585613afa565b925060408401356001600160401b03811115613b8d575f5ffd5b613b9986828701613b10565b9497909650939450505050565b80151581146114a3575f5ffd5b5f5f60408385031215613bc4575f5ffd5b8235613bcf81613acb565b91506020830135613bdf81613ba6565b809150509250929050565b5f60208284031215613bfa575f5ffd5b5035919050565b5f60408284031215613c11575f5ffd5b6118b38383613afa565b5f5f60208385031215613c2c575f5ffd5b82356001600160401b03811115613c41575f5ffd5b613c4d85828601613b10565b90969095509350505050565b5f6101008284031215613b0a575f5ffd5b5f5f60408385031215613c7b575f5ffd5b82356001600160401b03811115613c90575f5ffd5b613c9c85828601613c59565b9250506020830135613bdf81613acb565b803563ffffffff81168114612f11575f5ffd5b5f5f60408385031215613cd1575f5ffd5b82359150613ce160208401613cad565b90509250929050565b5f5f5f60408486031215613cfc575f5ffd5b83356001600160401b03811115613d11575f5ffd5b613d1d86828701613b10565b9094509250506020840135613d3181613acb565b809150509250925092565b5f60208284031215613d4c575f5ffd5b6118b382613cad565b5f60208284031215613d65575f5ffd5b813560ff811681146118b3575f5ffd5b5f60208284031215613d85575f5ffd5b81356001600160401b03811115613d9a575f5ffd5b6138a184828501613c59565b5f5f60408385031215613db7575f5ffd5b8235613dc281613acb565b946020939093013593505050565b5f5f60408385031215613de1575f5ffd5b8235613dec81613acb565b91506020830135613bdf81613acb565b5f5f5f60408486031215613e0e575f5ffd5b8335613e1981613acb565b925060208401356001600160401b03811115613b8d575f5ffd5b5f5f60608385031215613e44575f5ffd5b8235613e4f81613acb565b9150613ce18460208501613afa565b803561ffff81168114612f11575f5ffd5b5f60208284031215613e7f575f5ffd5b6118b382613e5e565b5f5f60408385031215613e99575f5ffd5b8235613ea481613acb565b9150613ce160208401613e5e565b5f5f5f60608486031215613ec4575f5ffd5b8335613ecf81613acb565b92506020840135613edf81613acb565b9150613eed60408501613e5e565b90509250925092565b5f5f5f5f5f60a08688031215613f0a575f5ffd5b8535613f1581613acb565b9450602086013593506040860135613f2c81613acb565b9250613f3a60608701613cad565b9150613f4860808701613e5e565b90509295509295909350565b5f5f5f60808486031215613f66575f5ffd5b8335613f7181613acb565b9250613f808560208601613afa565b9150613eed60608501613e5e565b8035613f9981613acb565b6001600160a01b0316825263ffffffff613fb560208301613cad565b1660208301525050565b6040810161148c8284613f8e565b5f60208284031215613fdd575f5ffd5b81516118b381613ba6565b634e487b7160e01b5f52603260045260245ffd5b5f823560be19833603018112614010575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261402f575f5ffd5b83016020810192503590506001600160401b0381111561404d575f5ffd5b8060061b3603821315613b50575f5ffd5b8183526020830192505f815f5b848110156140c157813561407e81613acb565b6001600160a01b0316865260208201356bffffffffffffffffffffffff81168082146140a8575f5ffd5b602088015250604095860195919091019060010161406b565b5093949350505050565b5f5f8335601e198436030181126140e0575f5ffd5b83016020810192503590506001600160401b038111156140fe575f5ffd5b803603821315613b50575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f61413f828361401a565b60c0855261415160c08601828461405e565b915050602083013561416281613acb565b6001600160a01b0316602085015261417d604084018461401a565b858303604087015280835290915f91906020015b818310156141cc5783356141a481613acb565b6001600160a01b03168152602084810135908201526040938401936001939093019201614191565b6141d860608701613cad565b63ffffffff8116606089015293506141f260808701613cad565b63ffffffff81166080890152935061420d60a08701876140cb565b9450925086810360a088015261398c81858561410c565b60018060a01b0384168152826020820152606060408201525f61424a6060830184614134565b95945050505050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561148c5761148c614253565b6142848185613f8e565b826040820152608060608201525f61424a6080830184614134565b8181038181111561148c5761148c614253565b5f816142c0576142c0614253565b505f190190565b5f8235609e19833603018112614010575f5ffd5b5f6142e6828361401a565b60a085526142f860a08601828461405e565b915050602083013561430981613acb565b6001600160a01b031660208501526040838101359085015263ffffffff61433260608501613cad565b16606085015263ffffffff61434960808501613cad565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f61424a60608301846142db565b602081525f6118b360208301846142db565b63ffffffff818116838216019081111561148c5761148c614253565b5f823560fe19833603018112614010575f5ffd5b828152604060208201525f6138a16040830184614134565b5f60408284031280156143ea575f5ffd5b50604080519081016001600160401b038111828210171561441957634e487b7160e01b5f52604160045260245ffd5b604052823561442781613acb565b815261443560208401613cad565b60208201529392505050565b63ffffffff828116828216039081111561148c5761148c614253565b5f63ffffffff82168061447257614472614253565b5f190192915050565b5f6020828403121561448b575f5ffd5b5051919050565b60a081016144a08287613f8e565b63ffffffff94909416604082015261ffff92831660608201529116608090910152919050565b5f602082840312156144d6575f5ffd5b81516118b381613acb565b5f5f8335601e198436030181126144f6575f5ffd5b8301803591506001600160401b0382111561450f575f5ffd5b6020019150600681901b3603821315613b50575f5ffd5b5f5f8335601e1984360301811261453b575f5ffd5b8301803591506001600160401b03821115614554575f5ffd5b6020019150600581901b3603821315613b50575f5ffd5b5f5f8335601e19843603018112614580575f5ffd5b8301803591506001600160401b03821115614599575f5ffd5b602001915036819003821315613b50575f5ffd5b80516020808301519190811015613b0a575f1960209190910360031b1b16919050565b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff8316806145f9576145f96145d0565b8063ffffffff84160691505092915050565b5f82614619576146196145d0565b500490565b5f82518060208501845e5f920191825250919050565b5f82614642576146426145d0565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea26469706673582212207c67616836c6a7c795552d9e8dfc776d40881dc1498dda9812cc4c094c4ad5f464736f6c634300081b0033",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams\",\"components\":[{\"name\":\"delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedOperatorSetRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"totalClaimed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defaultOperatorSplitBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetSplit\",\"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\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_defaultSplitBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedOperatorSetRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"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\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaims\",\"inputs\":[{\"name\":\"claims\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim[]\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDefaultOperatorSplit\",\"inputs\":[{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorSetSplit\",\"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\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultOperatorSplitBipsSet\",\"inputs\":[{\"name\":\"oldDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedAVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedOperatorSetRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorPISplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"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\"}]},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"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\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllEarnersCreated\",\"inputs\":[{\"name\":\"tokenHopper\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCalculationIntervalSecondsRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidClaimProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDurationRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarnerLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGenesisRewardsTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRootIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStartTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewRootMustBeForNewCalculatedPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousSplitPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SplitExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"SubmissionNotRetroactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]",
+ Bin: "0x6101e0604052348015610010575f5ffd5b50604051614d3b380380614d3b83398101604081905261002f9161034a565b610140810151608082015182516020840151604085015160a086015160c087015160e08801516101008901516101208a015160608b01516001600160a01b03811661008d576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03166080526100a38582610465565b63ffffffff16156100c757604051630e06bd3160e01b815260040160405180910390fd5b6100d46201518086610465565b63ffffffff16156100f85760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a05261014581610158565b6101c0525061015261019e565b506104f3565b5f5f829050601f8151111561018b578260405163305a27a960e01b81526004016101829190610498565b60405180910390fd5b8051610196826104cd565b179392505050565b5f54610100900460ff16156102055760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610182565b5f5460ff90811614610254575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b634e487b7160e01b5f52604160045260245ffd5b60405161016081016001600160401b038111828210171561028d5761028d610256565b60405290565b80516001600160a01b03811681146102a9575f5ffd5b919050565b805163ffffffff811681146102a9575f5ffd5b5f82601f8301126102d0575f5ffd5b81516001600160401b038111156102e9576102e9610256565b604051601f8201601f19908116603f011681016001600160401b038111828210171561031757610317610256565b60405281815283820160200185101561032e575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561035a575f5ffd5b81516001600160401b0381111561036f575f5ffd5b82016101608185031215610381575f5ffd5b61038961026a565b61039282610293565b81526103a060208301610293565b60208201526103b160408301610293565b60408201526103c260608301610293565b60608201526103d360808301610293565b60808201526103e460a083016102ae565b60a08201526103f560c083016102ae565b60c082015261040660e083016102ae565b60e082015261041861010083016102ae565b61010082015261042b61012083016102ae565b6101208201526101408201516001600160401b0381111561044a575f5ffd5b610456868285016102c1565b61014083015250949350505050565b5f63ffffffff83168061048657634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156104ed575f198160200360031b1b821691505b50919050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516147666105d55f395f6114b901525f81816105f001526127d101525f81816104a401526135b501525f81816103f30152612c1301525f8181610552015261357301525f818161087e015261348301525f81816107bf015281816134d3015261352101525f81816108d201528181610afb01528181611e2601526120d201525f8181610579015261365001525f81816109450152611d9601525f818161075101528181610ed90152818161150b01526123b101526147665ff3fe608060405234801561000f575f5ffd5b50600436106103b3575f3560e01c8063886f1195116101f5578063de02e50311610114578063f6efbb59116100a9578063fabc1cbc11610079578063fabc1cbc14610a33578063fbf1e2c114610a46578063fce36c7d14610a59578063ff9f6cce14610a6c575f5ffd5b8063f6efbb59146109e7578063f74e8eac146109fa578063f8cd844814610a0d578063f96abf2e14610a20575f5ffd5b8063ed71e6a2116100e4578063ed71e6a214610967578063f22cef8514610994578063f2f07ab4146109a7578063f2fde38b146109d4575f5ffd5b8063de02e50314610907578063e063f81f1461091a578063e810ce211461092d578063ea4d3c9b14610940575f5ffd5b8063a50a1d9c1161018a578063bf21a8aa1161015a578063bf21a8aa14610879578063c46db606146108a0578063ca8aa7c7146108cd578063dcbb03b3146108f4575f5ffd5b8063a50a1d9c14610807578063aebd8bae1461081a578063b3dbb0e014610847578063bb7e451f1461085a575f5ffd5b80639cb9a5fa116101c55780639cb9a5fa146107a75780639d45c281146107ba5780639de4b35f146107e1578063a0169ddd146107f4575f5ffd5b8063886f11951461074c5780638da5cb5b146107735780639104c319146107845780639be3d4e41461079f575f5ffd5b80634596021c116102e15780635c975abb11610276578063715018a611610246578063715018a6146106ff5780637b8f8b0514610707578063863cb9a91461070f578063865c695314610722575f5ffd5b80635c975abb146106a25780635e9d8348146106aa57806363f6a798146106bd5780636d21117e146106d2575f5ffd5b806354fd4d50116102b157806354fd4d501461064f57806358baaa3e14610664578063595c6a67146106775780635ac86ab71461067f575f5ffd5b80634596021c146105d85780634657e26a146105eb5780634b943960146106125780634d18cc3514610638575f5ffd5b8063149bc8721161035757806339b70e381161032757806339b70e38146105745780633a8c07861461059b5780633ccc861d146105b25780633efe1db6146105c5575f5ffd5b8063149bc872146104d95780632b9f64a4146104fa57806336af41fa1461053a57806337838ed01461054d575f5ffd5b80630e9a53cf116103925780630e9a53cf1461043f5780630eb383451461048c578063131433b41461049f578063136439dd146104c6575f5ffd5b806218572c146103b757806304a0c502146103ee5780630ca298991461042a575b5f5ffd5b6103d96103c5366004613b93565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6104157f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103e5565b61043d610438366004613c0b565b610a7f565b005b610447610d44565b6040516103e591905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61043d61049a366004613c67565b610e44565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b61043d6104d4366004613c9e565b610ec4565b6104ec6104e7366004613cb5565b610f99565b6040519081526020016103e5565b610522610508366004613b93565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103e5565b61043d610548366004613ccf565b61100e565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b6105227f000000000000000000000000000000000000000000000000000000000000000081565b60cb5461041590600160a01b900463ffffffff1681565b61043d6105c0366004613d1e565b61119d565b61043d6105d3366004613d74565b6111e2565b61043d6105e6366004613d9e565b6113d6565b6105227f000000000000000000000000000000000000000000000000000000000000000081565b610625610620366004613b93565b611457565b60405161ffff90911681526020016103e5565b60cb5461041590600160c01b900463ffffffff1681565b6106576114b2565b6040516103e59190613df0565b61043d610672366004613e25565b6114e2565b61043d6114f6565b6103d961068d366004613e3e565b606654600160ff9092169190911b9081161490565b6066546104ec565b6103d96106b8366004613e5e565b6115a5565b60cb5461062590600160e01b900461ffff1681565b6103d96106e0366004613e8f565b60cf60209081525f928352604080842090915290825290205460ff1681565b61043d611630565b60ca546104ec565b61043d61071d366004613b93565b611641565b6104ec610730366004613eb9565b60cd60209081525f928352604080842090915290825290205481565b6105227f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b0316610522565b61052273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b610447611652565b61043d6107b5366004613ee5565b6116ee565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b6106256107ef366004613f1c565b611887565b61043d610802366004613b93565b61190a565b61043d610815366004613f58565b611915565b6103d9610828366004613e8f565b60d260209081525f928352604080842090915290825290205460ff1681565b61043d610855366004613f71565b611926565b6104ec610868366004613b93565b60ce6020525f908152604090205481565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b6103d96108ae366004613e8f565b60d060209081525f928352604080842090915290825290205460ff1681565b6105227f000000000000000000000000000000000000000000000000000000000000000081565b61043d610902366004613f9b565b611a6f565b610447610915366004613c9e565b611bda565b610625610928366004613eb9565b611c6a565b61041561093b366004613c9e565b611ccf565b6105227f000000000000000000000000000000000000000000000000000000000000000081565b6103d9610975366004613e8f565b60d360209081525f928352604080842090915290825290205460ff1681565b61043d6109a2366004613eb9565b611d50565b6103d96109b5366004613e8f565b60d760209081525f928352604080842090915290825290205460ff1681565b61043d6109e2366004613b93565b611eba565b61043d6109f5366004613fdf565b611f35565b61043d610a0836600461403d565b61206a565b6104ec610a1b366004613cb5565b612250565b61043d610a2e366004613e25565b612260565b61043d610a41366004613c9e565b6123af565b60cb54610522906001600160a01b031681565b61043d610a67366004613ccf565b6124c5565b61043d610a7a366004613ccf565b612614565b60665460099061020090811603610aa95760405163840a48d560e01b815260040160405180910390fd5b610ab66020850185613b93565b610abf81612793565b610adc5760405163932d94f760e01b815260040160405180910390fd5b610ae461283d565b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610b309088906004016140a8565b602060405180830381865afa158015610b4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6f91906140b6565b610b8c57604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610d325736858583818110610ba957610ba96140d1565b9050602002810190610bbb91906140e5565b90505f60ce81610bce60208b018b613b93565b6001600160a01b031681526020808201929092526040015f90812054925090610bf9908a018a613b93565b8284604051602001610c0d9392919061430d565b6040516020818303038152906040528051906020012090505f610c2f84612896565b9050600160d75f610c4360208e018e613b93565b6001600160a01b0316815260208082019290925260409081015f9081208682529092529020805460ff1916911515919091179055610c82836001614350565b60ce5f610c9260208e018e613b93565b6001600160a01b03166001600160a01b031681526020019081526020015f208190555081336001600160a01b03167ffff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc7568c8688604051610cf393929190614363565b60405180910390a3610d22333083610d116040890160208a01613b93565b6001600160a01b0316929190612a81565b505060019092019150610b8e9050565b50610d3d6001609755565b5050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610e1c575f60ca610d7f600184614388565b81548110610d8f57610d8f6140d1565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610dfe5750806040015163ffffffff164210155b15610e095792915050565b5080610e148161439b565b915050610d6b565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610e4c612aec565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610f26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4a91906140b6565b610f6757604051631d77d47760e21b815260040160405180910390fd5b6066548181168114610f8c5760405163c61dca5d60e01b815260040160405180910390fd5b610f9582612b46565b5050565b5f80610fa86020840184613b93565b8360200135604051602001610ff19392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b6066546001906002908116036110375760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661106657604051635c427cd960e01b815260040160405180910390fd5b61106e61283d565b5f5b8281101561118d573684848381811061108b5761108b6140d1565b905060200281019061109d91906143b0565b335f81815260ce602090815260408083205490519495509391926110c79290918591879101614442565b6040516020818303038152906040528051906020012090506110e883612b83565b335f90815260d0602090815260408083208484529091529020805460ff1916600190811790915561111a908390614350565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290611161908890614468565b60405180910390a4611182333060408601803590610d119060208901613b93565b505050600101611070565b506111986001609755565b505050565b6066546002906004908116036111c65760405163840a48d560e01b815260040160405180910390fd5b6111ce61283d565b6111d88383612c6e565b6111986001609755565b60665460039060089081160361120b5760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b0316331461123657604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b90910481169083161161126957604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff161061128f576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f906112ae90600160a01b900463ffffffff164261447a565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6066546002906004908116036113ff5760405163840a48d560e01b815260040160405180910390fd5b61140761283d565b5f5b838110156114465761143e858583818110611426576114266140d1565b90506020028101906114389190614496565b84612c6e565b600101611409565b506114516001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff16908201526114ac90612ef6565b92915050565b60606114dd7f0000000000000000000000000000000000000000000000000000000000000000612f66565b905090565b6114ea612aec565b6114f381612fa3565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611558573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061157c91906140b6565b61159957604051631d77d47760e21b815260040160405180910390fd5b6115a35f19612b46565b565b5f6116288260ca6115b96020830183613e25565b63ffffffff16815481106115cf576115cf6140d1565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152613014565b506001919050565b611638612aec565b6115a35f6131b7565b611649612aec565b6114f381613208565b604080516080810182525f80825260208201819052918101829052606081019190915260ca805461168590600190614388565b81548110611695576116956140d1565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6066546005906020908116036117175760405163840a48d560e01b815260040160405180910390fd5b8361172181612793565b61173e5760405163932d94f760e01b815260040160405180910390fd5b61174661283d565b5f5b83811015610d325736858583818110611763576117636140d1565b905060200281019061177591906140e5565b6001600160a01b0388165f90815260ce60209081526040808320549051939450926117a6918b91859187910161430d565b6040516020818303038152906040528051906020012090505f6117c884612896565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff19166001908117909155909150611806908490614350565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0906118599088908a906144aa565b60405180910390a4611877333083610d116040890160208a01613b93565b5050600190920191506117489050565b6001600160a01b0382165f90815260d66020526040812061190390826118ba6118b5368790038701876144c2565b613263565b815260208082019290925260409081015f208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152612ef6565b9392505050565b33610f9581836132c6565b61191d612aec565b6114f381613329565b60665460079060809081160361194f5760405163840a48d560e01b815260040160405180910390fd5b8261195981612793565b6119765760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061199290600160a01b900463ffffffff164261447a565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152919250906119eb90612ef6565b6001600160a01b0387165f90815260d560205260409020909150611a10908684613394565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b606654600690604090811603611a985760405163840a48d560e01b815260040160405180910390fd5b83611aa281612793565b611abf5760405163932d94f760e01b815260040160405180910390fd5b60cb545f90611adb90600160a01b900463ffffffff164261447a565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252919250611b4290612ef6565b6001600160a01b038089165f90815260d460209081526040808320938b16835292905220909150611b74908684613394565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca8281548110611c1057611c106140d1565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff16928101929092529061190390612ef6565b60ca545f905b63ffffffff811615611d36578260ca611cef60018461452a565b63ffffffff1681548110611d0557611d056140d1565b905f5260205f2090600202015f015403611d245761190360018261452a565b80611d2e81614546565b915050611cd5565b5060405163504570e360e01b815260040160405180910390fd5b81611d5a81612793565b611d775760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611ddb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dff91906140b6565b80611e93575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611e6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e919190614564565b115b611eb05760405163fb494ea160e01b815260040160405180910390fd5b61119883836132c6565b611ec2612aec565b6001600160a01b038116611f2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6114f3816131b7565b5f54610100900460ff1615808015611f5357505f54600160ff909116105b80611f6c5750303b158015611f6c57505f5460ff166001145b611fcf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611f23565b5f805460ff191660011790558015611ff0575f805461ff0019166101001790555b611ff985612b46565b612002866131b7565b61200b84613208565b61201483612fa3565b61201d82613329565b8015612062575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b606654600890610100908116036120945760405163840a48d560e01b815260040160405180910390fd5b8361209e81612793565b6120bb5760405163932d94f760e01b815260040160405180910390fd5b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc758906121079087906004016140a8565b602060405180830381865afa158015612122573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214691906140b6565b61216357604051631fb1705560e21b815260040160405180910390fd5b60cb545f9061217f90600160a01b900463ffffffff164261447a565b6001600160a01b0387165f90815260d660205260408120919250906121b190826118ba6118b5368b90038b018b6144c2565b6001600160a01b0388165f90815260d6602052604081209192506121f691906121e26118b5368b90038b018b6144c2565b81526020019081526020015f208684613394565b866001600160a01b0316336001600160a01b03167f14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f18885858a60405161223f949392919061457b565b60405180910390a350505050505050565b5f6001610fa86020840184613b93565b6066546003906008908116036122895760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b031633146122b457604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff8316106122dc576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff16815481106122f6576122f66140d1565b905f5260205f20906002020190508060010160089054906101000a900460ff161561233457604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff16421061236557604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561240b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242f91906145af565b6001600160a01b0316336001600160a01b0316146124605760405163794821ff60e01b815260040160405180910390fd5b606654801982198116146124875760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6066545f906001908116036124ed5760405163840a48d560e01b815260040160405180910390fd5b6124f561283d565b5f5b8281101561118d5736848483818110612512576125126140d1565b905060200281019061252491906143b0565b335f81815260ce6020908152604080832054905194955093919261254e9290918591879101614442565b60405160208183030381529060405280519060200120905061256f83612b83565b335f90815260cf602090815260408083208484529091529020805460ff191660019081179091556125a1908390614350565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281906125e8908890614468565b60405180910390a4612609333060408601803590610d119060208901613b93565b5050506001016124f7565b60665460049060109081160361263d5760405163840a48d560e01b815260040160405180910390fd5b335f90815260d1602052604090205460ff1661266c57604051635c427cd960e01b815260040160405180910390fd5b61267461283d565b5f5b8281101561118d5736848483818110612691576126916140d1565b90506020028101906126a391906143b0565b335f81815260ce602090815260408083205490519495509391926126cd9290918591879101614442565b6040516020818303038152906040528051906020012090506126ee83612b83565b335f90815260d2602090815260408083208484529091529020805460ff19166001908117909155612720908390614350565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b90612767908890614468565b60405180910390a4612788333060408601803590610d119060208901613b93565b505050600101612676565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612819573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ac91906140b6565b60026097540361288f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611f23565b6002609755565b5f6128c96128a483806145ca565b6128b46080860160608701613e25565b6128c460a0870160808801613e25565b613463565b5f6128d760408401846145ca565b9050116128f75760405163796cc52560e01b815260040160405180910390fd5b4261290860a0840160808501613e25565b6129186080850160608601613e25565b612922919061447a565b63ffffffff16106129465760405163150358a160e21b815260040160405180910390fd5b5f80805b61295760408601866145ca565b9050811015612a48573661296e60408701876145ca565b8381811061297e5761297e6140d1565b6040029190910191505f90506129976020830183613b93565b6001600160a01b0316036129be57604051630863a45360e11b815260040160405180910390fd5b6129cb6020820182613b93565b6001600160a01b0316836001600160a01b0316106129fc576040516310fb47f160e31b815260040160405180910390fd5b5f816020013511612a20576040516310eb483f60e21b815260040160405180910390fd5b612a2d6020820182613b93565b9250612a3d602082013585614350565b93505060010161294a565b506f4b3b4ca85a86c47a098a223fffffffff821115612a7a5760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6040516001600160a01b03808516602483015283166044820152606481018290526114519085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261373b565b6033546001600160a01b031633146115a35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611f23565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b612bb0612b9082806145ca565b612ba06080850160608601613e25565b6128c460a0860160808701613e25565b5f816040013511612bd4576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff81604001351115612c095760405163070b5a6f60e21b815260040160405180910390fd5b612c3963ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642614350565b612c496080830160608401613e25565b63ffffffff1611156114f357604051637ee2b44360e01b815260040160405180910390fd5b5f60ca612c7e6020850185613e25565b63ffffffff1681548110612c9457612c946140d1565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff16151560608201529050612cf48382613014565b5f612d056080850160608601613b93565b6001600160a01b038082165f90815260cc60205260409020549192501680612d2a5750805b336001600160a01b03821614612d5357604051635c427cd960e01b815260040160405180910390fd5b5f5b612d6260a087018761460f565b90508110156120625736612d7960e08801886145ca565b83818110612d8957612d896140d1565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612dbd90850185613b93565b6001600160a01b03166001600160a01b031681526020019081526020015f2054905080826020013511612e035760405163aa385e8160e01b815260040160405180910390fd5b5f612e12826020850135614388565b6001600160a01b0387165f90815260cd60209081526040822092935085018035929190612e3f9087613b93565b6001600160a01b031681526020808201929092526040015f2091909155612e809089908390612e7090870187613b93565b6001600160a01b0316919061380e565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce3190612ec46020890189613b93565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050600101612d55565b5f816040015163ffffffff165f1480612f285750815161ffff908116148015612f285750816040015163ffffffff1642105b15612f4057505060cb54600160e01b900461ffff1690565b816040015163ffffffff16421015612f595781516114ac565b506020015190565b919050565b60605f612f728361383e565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80606001511561303757604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff1642101561306257604051631437a2bb60e31b815260040160405180910390fd5b61306f60c083018361460f565b905061307e60a084018461460f565b90501461309e576040516343714afd60e01b815260040160405180910390fd5b6130ab60e08301836145ca565b90506130ba60c084018461460f565b9050146130da576040516343714afd60e01b815260040160405180910390fd5b8051613106906130f06040850160208601613e25565b6130fd6040860186614654565b86606001613865565b5f5b61311560a084018461460f565b9050811015611198576131af608084013561313360a086018661460f565b84818110613143576131436140d1565b90506020020160208101906131589190613e25565b61316560c087018761460f565b85818110613175576131756140d1565b90506020028101906131879190614654565b61319460e08901896145ca565b878181106131a4576131a46140d1565b905060400201613909565b600101613108565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b5f815f0151826020015163ffffffff166040516020016132ae92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526114ac90614696565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff831611156133bb5760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff1642116133e957604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f0361341057825461ffff191661ffff178355613427565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b826134815760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff1611156134ce57604051630dd0b9f560e21b815260040160405180910390fd5b6134f87f0000000000000000000000000000000000000000000000000000000000000000826146cd565b63ffffffff161561351c5760405163ee66470560e01b815260040160405180910390fd5b6135467f0000000000000000000000000000000000000000000000000000000000000000836146cd565b63ffffffff161561356a57604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff16426135a39190614388565b111580156135dd57508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b6135fa5760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015612062575f868683818110613618576136186140d1565b61362e9260206040909202019081019150613b93565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613697573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136bb91906140b6565b806136e257506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6136ff57604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106137315760405163dfad9ca160e01b815260040160405180910390fd5b91506001016135fd565b5f61378f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139479092919063ffffffff16565b905080515f14806137af5750808060200190518101906137af91906140b6565b6111985760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611f23565b6040516001600160a01b03831660248201526044810182905261119890849063a9059cbb60e01b90606401612ab5565b5f60ff8216601f8111156114ac57604051632cd44ac360e21b815260040160405180910390fd5b6138706020836146f4565b6001901b8463ffffffff16106138985760405162c6c39d60e71b815260040160405180910390fd5b5f6138a282610f99565b90506138ec84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff891661395d565b612062576040516369ca16c960e01b815260040160405180910390fd5b6139146020836146f4565b6001901b8463ffffffff161061393d5760405163054ff4df60e51b815260040160405180910390fd5b5f6138a282612250565b606061395584845f85613974565b949350505050565b5f8361396a868585613a4b565b1495945050505050565b6060824710156139d55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611f23565b5f5f866001600160a01b031685876040516139f09190614707565b5f6040518083038185875af1925050503d805f8114613a2a576040519150601f19603f3d011682016040523d82523d5f602084013e613a2f565b606091505b5091509150613a4087838387613ae2565b979650505050505050565b5f60208451613a5a919061471d565b15613a78576040516313717da960e21b815260040160405180910390fd5b8260205b85518111613ad957613a8f60028561471d565b5f03613ab057815f528086015160205260405f209150600284049350613ac7565b808601515f528160205260405f2091506002840493505b613ad2602082614350565b9050613a7c565b50949350505050565b60608315613b505782515f03613b49576001600160a01b0385163b613b495760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611f23565b5081613955565b6139558383815115613b655781518083602001fd5b8060405162461bcd60e51b8152600401611f239190613df0565b6001600160a01b03811681146114f3575f5ffd5b5f60208284031215613ba3575f5ffd5b813561190381613b7f565b5f60408284031215613bbe575f5ffd5b50919050565b5f5f83601f840112613bd4575f5ffd5b5081356001600160401b03811115613bea575f5ffd5b6020830191508360208260051b8501011115613c04575f5ffd5b9250929050565b5f5f5f60608486031215613c1d575f5ffd5b613c278585613bae565b925060408401356001600160401b03811115613c41575f5ffd5b613c4d86828701613bc4565b9497909650939450505050565b80151581146114f3575f5ffd5b5f5f60408385031215613c78575f5ffd5b8235613c8381613b7f565b91506020830135613c9381613c5a565b809150509250929050565b5f60208284031215613cae575f5ffd5b5035919050565b5f60408284031215613cc5575f5ffd5b6119038383613bae565b5f5f60208385031215613ce0575f5ffd5b82356001600160401b03811115613cf5575f5ffd5b613d0185828601613bc4565b90969095509350505050565b5f6101008284031215613bbe575f5ffd5b5f5f60408385031215613d2f575f5ffd5b82356001600160401b03811115613d44575f5ffd5b613d5085828601613d0d565b9250506020830135613c9381613b7f565b803563ffffffff81168114612f61575f5ffd5b5f5f60408385031215613d85575f5ffd5b82359150613d9560208401613d61565b90509250929050565b5f5f5f60408486031215613db0575f5ffd5b83356001600160401b03811115613dc5575f5ffd5b613dd186828701613bc4565b9094509250506020840135613de581613b7f565b809150509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215613e35575f5ffd5b61190382613d61565b5f60208284031215613e4e575f5ffd5b813560ff81168114611903575f5ffd5b5f60208284031215613e6e575f5ffd5b81356001600160401b03811115613e83575f5ffd5b61395584828501613d0d565b5f5f60408385031215613ea0575f5ffd5b8235613eab81613b7f565b946020939093013593505050565b5f5f60408385031215613eca575f5ffd5b8235613ed581613b7f565b91506020830135613c9381613b7f565b5f5f5f60408486031215613ef7575f5ffd5b8335613f0281613b7f565b925060208401356001600160401b03811115613c41575f5ffd5b5f5f60608385031215613f2d575f5ffd5b8235613f3881613b7f565b9150613d958460208501613bae565b803561ffff81168114612f61575f5ffd5b5f60208284031215613f68575f5ffd5b61190382613f47565b5f5f60408385031215613f82575f5ffd5b8235613f8d81613b7f565b9150613d9560208401613f47565b5f5f5f60608486031215613fad575f5ffd5b8335613fb881613b7f565b92506020840135613fc881613b7f565b9150613fd660408501613f47565b90509250925092565b5f5f5f5f5f60a08688031215613ff3575f5ffd5b8535613ffe81613b7f565b945060208601359350604086013561401581613b7f565b925061402360608701613d61565b915061403160808701613f47565b90509295509295909350565b5f5f5f6080848603121561404f575f5ffd5b833561405a81613b7f565b92506140698560208601613bae565b9150613fd660608501613f47565b803561408281613b7f565b6001600160a01b0316825263ffffffff61409e60208301613d61565b1660208301525050565b604081016114ac8284614077565b5f602082840312156140c6575f5ffd5b815161190381613c5a565b634e487b7160e01b5f52603260045260245ffd5b5f823560be198336030181126140f9575f5ffd5b9190910192915050565b5f5f8335601e19843603018112614118575f5ffd5b83016020810192503590506001600160401b03811115614136575f5ffd5b8060061b3603821315613c04575f5ffd5b8183526020830192505f815f5b848110156141aa57813561416781613b7f565b6001600160a01b0316865260208201356bffffffffffffffffffffffff8116808214614191575f5ffd5b6020880152506040958601959190910190600101614154565b5093949350505050565b5f5f8335601e198436030181126141c9575f5ffd5b83016020810192503590506001600160401b038111156141e7575f5ffd5b803603821315613c04575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f6142288283614103565b60c0855261423a60c086018284614147565b915050602083013561424b81613b7f565b6001600160a01b031660208501526142666040840184614103565b858303604087015280835290915f91906020015b818310156142b557833561428d81613b7f565b6001600160a01b0316815260208481013590820152604093840193600193909301920161427a565b6142c160608701613d61565b63ffffffff8116606089015293506142db60808701613d61565b63ffffffff8116608089015293506142f660a08701876141b4565b9450925086810360a0880152613a408185856141f5565b60018060a01b0384168152826020820152606060408201525f614333606083018461421d565b95945050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156114ac576114ac61433c565b61436d8185614077565b826040820152608060608201525f614333608083018461421d565b818103818111156114ac576114ac61433c565b5f816143a9576143a961433c565b505f190190565b5f8235609e198336030181126140f9575f5ffd5b5f6143cf8283614103565b60a085526143e160a086018284614147565b91505060208301356143f281613b7f565b6001600160a01b031660208501526040838101359085015263ffffffff61441b60608501613d61565b16606085015263ffffffff61443260808501613d61565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f61433360608301846143c4565b602081525f61190360208301846143c4565b63ffffffff81811683821601908111156114ac576114ac61433c565b5f823560fe198336030181126140f9575f5ffd5b828152604060208201525f613955604083018461421d565b5f60408284031280156144d3575f5ffd5b50604080519081016001600160401b038111828210171561450257634e487b7160e01b5f52604160045260245ffd5b604052823561451081613b7f565b815261451e60208401613d61565b60208201529392505050565b63ffffffff82811682821603908111156114ac576114ac61433c565b5f63ffffffff82168061455b5761455b61433c565b5f190192915050565b5f60208284031215614574575f5ffd5b5051919050565b60a081016145898287614077565b63ffffffff94909416604082015261ffff92831660608201529116608090910152919050565b5f602082840312156145bf575f5ffd5b815161190381613b7f565b5f5f8335601e198436030181126145df575f5ffd5b8301803591506001600160401b038211156145f8575f5ffd5b6020019150600681901b3603821315613c04575f5ffd5b5f5f8335601e19843603018112614624575f5ffd5b8301803591506001600160401b0382111561463d575f5ffd5b6020019150600581901b3603821315613c04575f5ffd5b5f5f8335601e19843603018112614669575f5ffd5b8301803591506001600160401b03821115614682575f5ffd5b602001915036819003821315613c04575f5ffd5b80516020808301519190811015613bbe575f1960209190910360031b1b16919050565b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff8316806146e2576146e26146b9565b8063ffffffff84160691505092915050565b5f82614702576147026146b9565b500490565b5f82518060208501845e5f920191825250919050565b5f8261472b5761472b6146b9565b50069056fea264697066735822122022600ec9e2eed9be16e0d50f6089b8f35498044e5ce160d09315e30c20beddce64736f6c634300081b0033",
}
// RewardsCoordinatorABI is the input ABI used to generate the binding from.
@@ -112,7 +127,7 @@ var RewardsCoordinatorABI = RewardsCoordinatorMetaData.ABI
var RewardsCoordinatorBin = RewardsCoordinatorMetaData.Bin
// DeployRewardsCoordinator deploys a new Ethereum contract, binding an instance of RewardsCoordinator to it.
-func DeployRewardsCoordinator(auth *bind.TransactOpts, backend bind.ContractBackend, _delegationManager common.Address, _strategyManager common.Address, _allocationManager common.Address, _pauserRegistry common.Address, _permissionController common.Address, _CALCULATION_INTERVAL_SECONDS uint32, _MAX_REWARDS_DURATION uint32, _MAX_RETROACTIVE_LENGTH uint32, _MAX_FUTURE_LENGTH uint32, _GENESIS_REWARDS_TIMESTAMP uint32) (common.Address, *types.Transaction, *RewardsCoordinator, error) {
+func DeployRewardsCoordinator(auth *bind.TransactOpts, backend bind.ContractBackend, params IRewardsCoordinatorTypesRewardsCoordinatorConstructorParams) (common.Address, *types.Transaction, *RewardsCoordinator, error) {
parsed, err := RewardsCoordinatorMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
@@ -121,7 +136,7 @@ func DeployRewardsCoordinator(auth *bind.TransactOpts, backend bind.ContractBack
return common.Address{}, nil, nil, errors.New("GetABI returned nil")
}
- address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(RewardsCoordinatorBin), backend, _delegationManager, _strategyManager, _allocationManager, _pauserRegistry, _permissionController, _CALCULATION_INTERVAL_SECONDS, _MAX_REWARDS_DURATION, _MAX_RETROACTIVE_LENGTH, _MAX_FUTURE_LENGTH, _GENESIS_REWARDS_TIMESTAMP)
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(RewardsCoordinatorBin), backend, params)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -1448,6 +1463,37 @@ func (_RewardsCoordinator *RewardsCoordinatorCallerSession) SubmissionNonce(avs
return _RewardsCoordinator.Contract.SubmissionNonce(&_RewardsCoordinator.CallOpts, avs)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_RewardsCoordinator *RewardsCoordinatorCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _RewardsCoordinator.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_RewardsCoordinator *RewardsCoordinatorSession) Version() (string, error) {
+ return _RewardsCoordinator.Contract.Version(&_RewardsCoordinator.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_RewardsCoordinator *RewardsCoordinatorCallerSession) Version() (string, error) {
+ return _RewardsCoordinator.Contract.Version(&_RewardsCoordinator.CallOpts)
+}
+
// CreateAVSRewardsSubmission is a paid mutator transaction binding the contract method 0xfce36c7d.
//
// Solidity: function createAVSRewardsSubmission(((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
diff --git a/pkg/bindings/RewardsCoordinatorStorage/binding.go b/pkg/bindings/RewardsCoordinatorStorage/binding.go
index f13a448a4a..9ed70dc128 100644
--- a/pkg/bindings/RewardsCoordinatorStorage/binding.go
+++ b/pkg/bindings/RewardsCoordinatorStorage/binding.go
@@ -99,7 +99,7 @@ type OperatorSet struct {
// RewardsCoordinatorStorageMetaData contains all meta data concerning the RewardsCoordinatorStorage contract.
var RewardsCoordinatorStorageMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedOperatorSetRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"totalClaimed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defaultOperatorSplitBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetSplit\",\"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\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_defaultSplitBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedOperatorSetRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaims\",\"inputs\":[{\"name\":\"claims\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim[]\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDefaultOperatorSplit\",\"inputs\":[{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorSetSplit\",\"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\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultOperatorSplitBipsSet\",\"inputs\":[{\"name\":\"oldDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedAVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedOperatorSetRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorPISplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"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\"}]},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllEarnersCreated\",\"inputs\":[{\"name\":\"tokenHopper\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCalculationIntervalSecondsRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidClaimProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDurationRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarnerLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGenesisRewardsTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRootIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStartTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewRootMustBeForNewCalculatedPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousSplitPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SplitExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SubmissionNotRetroactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]",
+ ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedOperatorSetRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"totalClaimed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defaultOperatorSplitBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetSplit\",\"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\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_defaultSplitBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedOperatorSetRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaims\",\"inputs\":[{\"name\":\"claims\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim[]\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDefaultOperatorSplit\",\"inputs\":[{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorSetSplit\",\"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\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultOperatorSplitBipsSet\",\"inputs\":[{\"name\":\"oldDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedAVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedOperatorSetRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorPISplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"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\"}]},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllEarnersCreated\",\"inputs\":[{\"name\":\"tokenHopper\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCalculationIntervalSecondsRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidClaimProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDurationRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarnerLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGenesisRewardsTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRootIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStartTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewRootMustBeForNewCalculatedPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousSplitPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SplitExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SubmissionNotRetroactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]",
}
// RewardsCoordinatorStorageABI is the input ABI used to generate the binding from.
@@ -1271,6 +1271,37 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) Submis
return _RewardsCoordinatorStorage.Contract.SubmissionNonce(&_RewardsCoordinatorStorage.CallOpts, avs)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _RewardsCoordinatorStorage.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) Version() (string, error) {
+ return _RewardsCoordinatorStorage.Contract.Version(&_RewardsCoordinatorStorage.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) Version() (string, error) {
+ return _RewardsCoordinatorStorage.Contract.Version(&_RewardsCoordinatorStorage.CallOpts)
+}
+
// CreateAVSRewardsSubmission is a paid mutator transaction binding the contract method 0xfce36c7d.
//
// Solidity: function createAVSRewardsSubmission(((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
diff --git a/pkg/bindings/SemVerMixin/binding.go b/pkg/bindings/SemVerMixin/binding.go
new file mode 100644
index 0000000000..1d66098f63
--- /dev/null
+++ b/pkg/bindings/SemVerMixin/binding.go
@@ -0,0 +1,212 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package SemVerMixin
+
+import (
+ "errors"
+ "math/big"
+ "strings"
+
+ ethereum "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+ _ = errors.New
+ _ = big.NewInt
+ _ = strings.NewReader
+ _ = ethereum.NotFound
+ _ = bind.Bind
+ _ = common.Big1
+ _ = types.BloomLookup
+ _ = event.NewSubscription
+ _ = abi.ConvertType
+)
+
+// SemVerMixinMetaData contains all meta data concerning the SemVerMixin contract.
+var SemVerMixinMetaData = &bind.MetaData{
+ ABI: "[{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
+}
+
+// SemVerMixinABI is the input ABI used to generate the binding from.
+// Deprecated: Use SemVerMixinMetaData.ABI instead.
+var SemVerMixinABI = SemVerMixinMetaData.ABI
+
+// SemVerMixin is an auto generated Go binding around an Ethereum contract.
+type SemVerMixin struct {
+ SemVerMixinCaller // Read-only binding to the contract
+ SemVerMixinTransactor // Write-only binding to the contract
+ SemVerMixinFilterer // Log filterer for contract events
+}
+
+// SemVerMixinCaller is an auto generated read-only Go binding around an Ethereum contract.
+type SemVerMixinCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SemVerMixinTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type SemVerMixinTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SemVerMixinFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type SemVerMixinFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SemVerMixinSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type SemVerMixinSession struct {
+ Contract *SemVerMixin // Generic contract binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// SemVerMixinCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type SemVerMixinCallerSession struct {
+ Contract *SemVerMixinCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// SemVerMixinTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type SemVerMixinTransactorSession struct {
+ Contract *SemVerMixinTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// SemVerMixinRaw is an auto generated low-level Go binding around an Ethereum contract.
+type SemVerMixinRaw struct {
+ Contract *SemVerMixin // Generic contract binding to access the raw methods on
+}
+
+// SemVerMixinCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type SemVerMixinCallerRaw struct {
+ Contract *SemVerMixinCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// SemVerMixinTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type SemVerMixinTransactorRaw struct {
+ Contract *SemVerMixinTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewSemVerMixin creates a new instance of SemVerMixin, bound to a specific deployed contract.
+func NewSemVerMixin(address common.Address, backend bind.ContractBackend) (*SemVerMixin, error) {
+ contract, err := bindSemVerMixin(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &SemVerMixin{SemVerMixinCaller: SemVerMixinCaller{contract: contract}, SemVerMixinTransactor: SemVerMixinTransactor{contract: contract}, SemVerMixinFilterer: SemVerMixinFilterer{contract: contract}}, nil
+}
+
+// NewSemVerMixinCaller creates a new read-only instance of SemVerMixin, bound to a specific deployed contract.
+func NewSemVerMixinCaller(address common.Address, caller bind.ContractCaller) (*SemVerMixinCaller, error) {
+ contract, err := bindSemVerMixin(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &SemVerMixinCaller{contract: contract}, nil
+}
+
+// NewSemVerMixinTransactor creates a new write-only instance of SemVerMixin, bound to a specific deployed contract.
+func NewSemVerMixinTransactor(address common.Address, transactor bind.ContractTransactor) (*SemVerMixinTransactor, error) {
+ contract, err := bindSemVerMixin(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &SemVerMixinTransactor{contract: contract}, nil
+}
+
+// NewSemVerMixinFilterer creates a new log filterer instance of SemVerMixin, bound to a specific deployed contract.
+func NewSemVerMixinFilterer(address common.Address, filterer bind.ContractFilterer) (*SemVerMixinFilterer, error) {
+ contract, err := bindSemVerMixin(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &SemVerMixinFilterer{contract: contract}, nil
+}
+
+// bindSemVerMixin binds a generic wrapper to an already deployed contract.
+func bindSemVerMixin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := SemVerMixinMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_SemVerMixin *SemVerMixinRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _SemVerMixin.Contract.SemVerMixinCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_SemVerMixin *SemVerMixinRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _SemVerMixin.Contract.SemVerMixinTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_SemVerMixin *SemVerMixinRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _SemVerMixin.Contract.SemVerMixinTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_SemVerMixin *SemVerMixinCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _SemVerMixin.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_SemVerMixin *SemVerMixinTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _SemVerMixin.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_SemVerMixin *SemVerMixinTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _SemVerMixin.Contract.contract.Transact(opts, method, params...)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_SemVerMixin *SemVerMixinCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _SemVerMixin.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_SemVerMixin *SemVerMixinSession) Version() (string, error) {
+ return _SemVerMixin.Contract.Version(&_SemVerMixin.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_SemVerMixin *SemVerMixinCallerSession) Version() (string, error) {
+ return _SemVerMixin.Contract.Version(&_SemVerMixin.CallOpts)
+}
diff --git a/pkg/bindings/SignatureUtilsMixin/binding.go b/pkg/bindings/SignatureUtilsMixin/binding.go
new file mode 100644
index 0000000000..54dc306097
--- /dev/null
+++ b/pkg/bindings/SignatureUtilsMixin/binding.go
@@ -0,0 +1,243 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package SignatureUtilsMixin
+
+import (
+ "errors"
+ "math/big"
+ "strings"
+
+ ethereum "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+ _ = errors.New
+ _ = big.NewInt
+ _ = strings.NewReader
+ _ = ethereum.NotFound
+ _ = bind.Bind
+ _ = common.Big1
+ _ = types.BloomLookup
+ _ = event.NewSubscription
+ _ = abi.ConvertType
+)
+
+// SignatureUtilsMixinMetaData contains all meta data concerning the SignatureUtilsMixin contract.
+var SignatureUtilsMixinMetaData = &bind.MetaData{
+ ABI: "[{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
+}
+
+// SignatureUtilsMixinABI is the input ABI used to generate the binding from.
+// Deprecated: Use SignatureUtilsMixinMetaData.ABI instead.
+var SignatureUtilsMixinABI = SignatureUtilsMixinMetaData.ABI
+
+// SignatureUtilsMixin is an auto generated Go binding around an Ethereum contract.
+type SignatureUtilsMixin struct {
+ SignatureUtilsMixinCaller // Read-only binding to the contract
+ SignatureUtilsMixinTransactor // Write-only binding to the contract
+ SignatureUtilsMixinFilterer // Log filterer for contract events
+}
+
+// SignatureUtilsMixinCaller is an auto generated read-only Go binding around an Ethereum contract.
+type SignatureUtilsMixinCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SignatureUtilsMixinTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type SignatureUtilsMixinTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SignatureUtilsMixinFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type SignatureUtilsMixinFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SignatureUtilsMixinSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type SignatureUtilsMixinSession struct {
+ Contract *SignatureUtilsMixin // Generic contract binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// SignatureUtilsMixinCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type SignatureUtilsMixinCallerSession struct {
+ Contract *SignatureUtilsMixinCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// SignatureUtilsMixinTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type SignatureUtilsMixinTransactorSession struct {
+ Contract *SignatureUtilsMixinTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// SignatureUtilsMixinRaw is an auto generated low-level Go binding around an Ethereum contract.
+type SignatureUtilsMixinRaw struct {
+ Contract *SignatureUtilsMixin // Generic contract binding to access the raw methods on
+}
+
+// SignatureUtilsMixinCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type SignatureUtilsMixinCallerRaw struct {
+ Contract *SignatureUtilsMixinCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// SignatureUtilsMixinTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type SignatureUtilsMixinTransactorRaw struct {
+ Contract *SignatureUtilsMixinTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewSignatureUtilsMixin creates a new instance of SignatureUtilsMixin, bound to a specific deployed contract.
+func NewSignatureUtilsMixin(address common.Address, backend bind.ContractBackend) (*SignatureUtilsMixin, error) {
+ contract, err := bindSignatureUtilsMixin(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &SignatureUtilsMixin{SignatureUtilsMixinCaller: SignatureUtilsMixinCaller{contract: contract}, SignatureUtilsMixinTransactor: SignatureUtilsMixinTransactor{contract: contract}, SignatureUtilsMixinFilterer: SignatureUtilsMixinFilterer{contract: contract}}, nil
+}
+
+// NewSignatureUtilsMixinCaller creates a new read-only instance of SignatureUtilsMixin, bound to a specific deployed contract.
+func NewSignatureUtilsMixinCaller(address common.Address, caller bind.ContractCaller) (*SignatureUtilsMixinCaller, error) {
+ contract, err := bindSignatureUtilsMixin(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &SignatureUtilsMixinCaller{contract: contract}, nil
+}
+
+// NewSignatureUtilsMixinTransactor creates a new write-only instance of SignatureUtilsMixin, bound to a specific deployed contract.
+func NewSignatureUtilsMixinTransactor(address common.Address, transactor bind.ContractTransactor) (*SignatureUtilsMixinTransactor, error) {
+ contract, err := bindSignatureUtilsMixin(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &SignatureUtilsMixinTransactor{contract: contract}, nil
+}
+
+// NewSignatureUtilsMixinFilterer creates a new log filterer instance of SignatureUtilsMixin, bound to a specific deployed contract.
+func NewSignatureUtilsMixinFilterer(address common.Address, filterer bind.ContractFilterer) (*SignatureUtilsMixinFilterer, error) {
+ contract, err := bindSignatureUtilsMixin(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &SignatureUtilsMixinFilterer{contract: contract}, nil
+}
+
+// bindSignatureUtilsMixin binds a generic wrapper to an already deployed contract.
+func bindSignatureUtilsMixin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := SignatureUtilsMixinMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_SignatureUtilsMixin *SignatureUtilsMixinRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _SignatureUtilsMixin.Contract.SignatureUtilsMixinCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_SignatureUtilsMixin *SignatureUtilsMixinRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _SignatureUtilsMixin.Contract.SignatureUtilsMixinTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_SignatureUtilsMixin *SignatureUtilsMixinRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _SignatureUtilsMixin.Contract.SignatureUtilsMixinTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_SignatureUtilsMixin *SignatureUtilsMixinCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _SignatureUtilsMixin.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_SignatureUtilsMixin *SignatureUtilsMixinTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _SignatureUtilsMixin.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_SignatureUtilsMixin *SignatureUtilsMixinTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _SignatureUtilsMixin.Contract.contract.Transact(opts, method, params...)
+}
+
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_SignatureUtilsMixin *SignatureUtilsMixinCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error) {
+ var out []interface{}
+ err := _SignatureUtilsMixin.contract.Call(opts, &out, "domainSeparator")
+
+ if err != nil {
+ return *new([32]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+ return out0, err
+
+}
+
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_SignatureUtilsMixin *SignatureUtilsMixinSession) DomainSeparator() ([32]byte, error) {
+ return _SignatureUtilsMixin.Contract.DomainSeparator(&_SignatureUtilsMixin.CallOpts)
+}
+
+// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
+//
+// Solidity: function domainSeparator() view returns(bytes32)
+func (_SignatureUtilsMixin *SignatureUtilsMixinCallerSession) DomainSeparator() ([32]byte, error) {
+ return _SignatureUtilsMixin.Contract.DomainSeparator(&_SignatureUtilsMixin.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_SignatureUtilsMixin *SignatureUtilsMixinCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _SignatureUtilsMixin.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_SignatureUtilsMixin *SignatureUtilsMixinSession) Version() (string, error) {
+ return _SignatureUtilsMixin.Contract.Version(&_SignatureUtilsMixin.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_SignatureUtilsMixin *SignatureUtilsMixinCallerSession) Version() (string, error) {
+ return _SignatureUtilsMixin.Contract.Version(&_SignatureUtilsMixin.CallOpts)
+}
diff --git a/pkg/bindings/SlashingLib/binding.go b/pkg/bindings/SlashingLib/binding.go
index 32b0744054..133c4e1548 100644
--- a/pkg/bindings/SlashingLib/binding.go
+++ b/pkg/bindings/SlashingLib/binding.go
@@ -32,7 +32,7 @@ var (
// SlashingLibMetaData contains all meta data concerning the SlashingLib contract.
var SlashingLibMetaData = &bind.MetaData{
ABI: "[]",
- Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220031531159115e859f21eed5ce5e4aaa5ca9fd89d5ab9cee05fde16361a4e53a664736f6c634300081b0033",
+ Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212208f1bde89f8f3aa0f34d6051969b229fa83efd16a534afe1769532efc8662438a64736f6c634300081b0033",
}
// 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 351dab3266..56728b842b 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: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212202269455111f3a63331a42edaf90ec124683e8dcd2c97e7d0cc1d0f6a66af373f64736f6c634300081b0033",
+ Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122039ae8d80d6b79cfe3f3fa1acda95d5467ae7b0e1b54d0fccbf6fba10d9bd1f4864736f6c634300081b0033",
}
// SnapshotsABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/StrategyBase/binding.go b/pkg/bindings/StrategyBase/binding.go
index ac8559c396..79b9ed7779 100644
--- a/pkg/bindings/StrategyBase/binding.go
+++ b/pkg/bindings/StrategyBase/binding.go
@@ -31,8 +31,8 @@ var (
// StrategyBaseMetaData contains all meta data concerning the StrategyBase contract.
var StrategyBaseMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]",
- Bin: "0x60c060405234801561000f575f5ffd5b506040516113a63803806113a683398101604081905261002e9161014b565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610183565b5f54610100900460ff16156100e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610132575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610148575f5ffd5b50565b5f5f6040838503121561015c575f5ffd5b825161016781610134565b602084015190925061017881610134565b809150509250929050565b60805160a0516111d86101ce5f395f81816101750152818161040201528181610796015261083301525f818161022b0152818161030f01528181610543015261096101526111d85ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063886f1195116100a9578063ce7c2ac21161006e578063ce7c2ac21461029b578063d9caed12146102ae578063e3dae51c146102c1578063f3e73875146102d4578063fabc1cbc146102e7575f5ffd5b8063886f1195146102265780638c8710191461024d5780638f6a624014610260578063ab5921e114610273578063c4d66de814610288575f5ffd5b8063553ca5f8116100ef578063553ca5f8146101c1578063595c6a67146101d45780635ac86ab7146101dc5780635c975abb1461020b5780637a8b263714610213575f5ffd5b8063136439dd1461012b5780632495a5991461014057806339b70e38146101705780633a98ef391461019757806347e7ef24146101ae575b5f5ffd5b61013e610139366004610f4d565b6102fa565b005b603254610153906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a060335481565b604051908152602001610167565b6101a06101bc366004610f7b565b6103cf565b6101a06101cf366004610fa5565b61051b565b61013e61052e565b6101fb6101ea366004610fd5565b6001805460ff9092161b9081161490565b6040519015158152602001610167565b6001546101a0565b6101a0610221366004610f4d565b6105dd565b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a061025b366004610f4d565b610626565b6101a061026e366004610fa5565b610630565b61027b61063d565b6040516101679190610ff0565b61013e610296366004610fa5565b61065d565b6101a06102a9366004610fa5565b61076f565b61013e6102bc366004611025565b610801565b6101a06102cf366004610f4d565b61091e565b6101a06102e2366004610f4d565b610955565b61013e6102f5366004610f4d565b61095f565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561035c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190611063565b61039d57604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103c25760405163c61dca5d60e01b815260040160405180910390fd5b6103cb82610a75565b5050565b600180545f9182918116036103f75760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610440576040516348da714f60e01b815260040160405180910390fd5b61044a8484610ab2565b6033545f61045a6103e883611096565b90505f6103e8610468610ae0565b6104729190611096565b90505f61047f87836110a9565b90508061048c84896110bc565b61049691906110d3565b9550855f036104b857604051630c392ed360e11b815260040160405180910390fd5b6104c28685611096565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156104f757604051632f14e8a360e11b815260040160405180910390fd5b610510826103e860335461050b9190611096565b610b4f565b505050505092915050565b5f6105286102218361076f565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610590573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b49190611063565b6105d157604051631d77d47760e21b815260040160405180910390fd5b6105db5f19610a75565b565b5f5f6103e86033546105ef9190611096565b90505f6103e86105fd610ae0565b6106079190611096565b90508161061485836110bc565b61061e91906110d3565b949350505050565b5f6105288261091e565b5f6105286102e28361076f565b60606040518060800160405280604d8152602001611156604d9139905090565b5f54610100900460ff161580801561067b57505f54600160ff909116105b806106945750303b15801561069457505f5460ff166001145b6106fc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561071d575f805461ff0019166101001790555b61072682610b9b565b80156103cb575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156107dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052891906110f2565b600180546002908116036108285760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610871576040516348da714f60e01b815260040160405180910390fd5b61087c848484610ce6565b603354808311156108a057604051630b469df360e41b815260040160405180910390fd5b5f6108ad6103e883611096565b90505f6103e86108bb610ae0565b6108c59190611096565b90505f826108d387846110bc565b6108dd91906110d3565b90506108e986856110a9565b6033556109096108f982846110a9565b6103e860335461050b9190611096565b610914888883610d19565b5050505050505050565b5f5f6103e86033546109309190611096565b90505f6103e861093e610ae0565b6109489190611096565b90508061061483866110bc565b5f610528826105dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109df9190611109565b6001600160a01b0316336001600160a01b031614610a105760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610a375760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b038381169116146103cb57604051630312abdd60e61b815260040160405180910390fd5b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4a91906110f2565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610b8384670de0b6b3a76400006110bc565b610b8d91906110d3565b604051908152602001610763565b5f54610100900460ff16610c055760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016106f3565b603280546001600160a01b0319166001600160a01b038316179055610c295f610a75565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbf9190611124565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610d1457604051630312abdd60e61b815260040160405180910390fd5b505050565b604080516001600160a01b03858116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610d1492908516918691859185918591905f90610db19084908490610e30565b905080515f1480610dd1575080806020019051810190610dd19190611063565b610d145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106f3565b606061061e84845f85855f5f866001600160a01b03168587604051610e55919061113f565b5f6040518083038185875af1925050503d805f8114610e8f576040519150601f19603f3d011682016040523d82523d5f602084013e610e94565b606091505b5091509150610ea587838387610eb0565b979650505050505050565b60608315610f1e5782515f03610f17576001600160a01b0385163b610f175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106f3565b508161061e565b61061e8383815115610f335781518083602001fd5b8060405162461bcd60e51b81526004016106f39190610ff0565b5f60208284031215610f5d575f5ffd5b5035919050565b6001600160a01b0381168114610f78575f5ffd5b50565b5f5f60408385031215610f8c575f5ffd5b8235610f9781610f64565b946020939093013593505050565b5f60208284031215610fb5575f5ffd5b8135610fc081610f64565b9392505050565b60ff81168114610f78575f5ffd5b5f60208284031215610fe5575f5ffd5b8135610fc081610fc7565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611037575f5ffd5b833561104281610f64565b9250602084013561105281610f64565b929592945050506040919091013590565b5f60208284031215611073575f5ffd5b81518015158114610fc0575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561052857610528611082565b8181038181111561052857610528611082565b808202811582820484141761052857610528611082565b5f826110ed57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611102575f5ffd5b5051919050565b5f60208284031215611119575f5ffd5b8151610fc081610f64565b5f60208284031215611134575f5ffd5b8151610fc081610fc7565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220a9e1d168f120543456936f851169e525e4634e520a4ecc4b7511b0e89c451d2f64736f6c634300081b0033",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]",
+ Bin: "0x60e060405234801561000f575f5ffd5b506040516115c03803806115c083398101604081905261002e916101b6565b80826001600160a01b038116610057576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261006c8161008d565b60a052506001600160a01b03831660c0526100856100d3565b5050506102e7565b5f5f829050601f815111156100c0578260405163305a27a960e01b81526004016100b7919061028c565b60405180910390fd5b80516100cb826102c1565b179392505050565b5f54610100900460ff161561013a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100b7565b5f5460ff90811614610189575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461019f575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101c8575f5ffd5b83516101d38161018b565b60208501519093506101e48161018b565b60408501519092506001600160401b038111156101ff575f5ffd5b8401601f8101861361020f575f5ffd5b80516001600160401b03811115610228576102286101a2565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610256576102566101a2565b60405281815282820160200188101561026d575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102e1575f198160200360031b1b821691505b50919050565b60805160a05160c05161128561033b5f395f818161018001528181610415015281816107d9015261087601525f61053501525f818161024b015281816103220152818161058601526109a401526112855ff3fe608060405234801561000f575f5ffd5b5060043610610132575f3560e01c80637a8b2637116100b4578063c4d66de811610079578063c4d66de81461029b578063ce7c2ac2146102ae578063d9caed12146102c1578063e3dae51c146102d4578063f3e73875146102e7578063fabc1cbc146102fa575f5ffd5b80637a8b263714610233578063886f1195146102465780638c8710191461026d5780638f6a624014610280578063ab5921e114610293575f5ffd5b806354fd4d50116100fa57806354fd4d50146101cc578063553ca5f8146101e1578063595c6a67146101f45780635ac86ab7146101fc5780635c975abb1461022b575f5ffd5b8063136439dd146101365780632495a5991461014b57806339b70e381461017b5780633a98ef39146101a257806347e7ef24146101b9575b5f5ffd5b610149610144366004610ffa565b61030d565b005b60325461015e906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61015e7f000000000000000000000000000000000000000000000000000000000000000081565b6101ab60335481565b604051908152602001610172565b6101ab6101c7366004611028565b6103e2565b6101d461052e565b6040516101729190611052565b6101ab6101ef366004611087565b61055e565b610149610571565b61021b61020a3660046110b7565b6001805460ff9092161b9081161490565b6040519015158152602001610172565b6001546101ab565b6101ab610241366004610ffa565b610620565b61015e7f000000000000000000000000000000000000000000000000000000000000000081565b6101ab61027b366004610ffa565b610669565b6101ab61028e366004611087565b610673565b6101d4610680565b6101496102a9366004611087565b6106a0565b6101ab6102bc366004611087565b6107b2565b6101496102cf3660046110d2565b610844565b6101ab6102e2366004610ffa565b610961565b6101ab6102f5366004610ffa565b610998565b610149610308366004610ffa565b6109a2565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561036f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103939190611110565b6103b057604051631d77d47760e21b815260040160405180910390fd5b60015481811681146103d55760405163c61dca5d60e01b815260040160405180910390fd5b6103de82610ab8565b5050565b600180545f91829181160361040a5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610453576040516348da714f60e01b815260040160405180910390fd5b61045d8484610af5565b6033545f61046d6103e883611143565b90505f6103e861047b610b23565b6104859190611143565b90505f6104928783611156565b90508061049f8489611169565b6104a99190611180565b9550855f036104cb57604051630c392ed360e11b815260040160405180910390fd5b6104d58685611143565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561050a57604051632f14e8a360e11b815260040160405180910390fd5b610523826103e860335461051e9190611143565b610b8d565b505050505092915050565b60606105597f0000000000000000000000000000000000000000000000000000000000000000610bd9565b905090565b5f61056b610241836107b2565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156105d3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f79190611110565b61061457604051631d77d47760e21b815260040160405180910390fd5b61061e5f19610ab8565b565b5f5f6103e86033546106329190611143565b90505f6103e8610640610b23565b61064a9190611143565b9050816106578583611169565b6106619190611180565b949350505050565b5f61056b82610961565b5f61056b6102f5836107b2565b60606040518060800160405280604d8152602001611203604d9139905090565b5f54610100900460ff16158080156106be57505f54600160ff909116105b806106d75750303b1580156106d757505f5460ff166001145b61073f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015610760575f805461ff0019166101001790555b61076982610c16565b80156103de575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa158015610820573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061056b919061119f565b6001805460029081160361086b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108b4576040516348da714f60e01b815260040160405180910390fd5b6108bf848484610d61565b603354808311156108e357604051630b469df360e41b815260040160405180910390fd5b5f6108f06103e883611143565b90505f6103e86108fe610b23565b6109089190611143565b90505f826109168784611169565b6109209190611180565b905061092c8685611156565b60335561094c61093c8284611156565b6103e860335461051e9190611143565b610957888883610d94565b5050505050505050565b5f5f6103e86033546109739190611143565b90505f6103e8610981610b23565b61098b9190611143565b9050806106578386611169565b5f61056b82610620565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109fe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2291906111b6565b6001600160a01b0316336001600160a01b031614610a535760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610a7a5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6032546001600160a01b038381169116146103de57604051630312abdd60e61b815260040160405180910390fd5b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b69573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610559919061119f565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610bc184670de0b6b3a7640000611169565b610bcb9190611180565b6040519081526020016107a6565b60605f610be583610da8565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f54610100900460ff16610c805760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610736565b603280546001600160a01b0319166001600160a01b038316179055610ca45f610ab8565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d3a91906111d1565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610d8f57604051630312abdd60e61b815260040160405180910390fd5b505050565b610d8f6001600160a01b0383168483610dcf565b5f60ff8216601f81111561056b57604051632cd44ac360e21b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610d8f928692915f91610e5e918516908490610edd565b905080515f1480610e7e575080806020019051810190610e7e9190611110565b610d8f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610736565b606061066184845f85855f5f866001600160a01b03168587604051610f0291906111ec565b5f6040518083038185875af1925050503d805f8114610f3c576040519150601f19603f3d011682016040523d82523d5f602084013e610f41565b606091505b5091509150610f5287838387610f5d565b979650505050505050565b60608315610fcb5782515f03610fc4576001600160a01b0385163b610fc45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610736565b5081610661565b6106618383815115610fe05781518083602001fd5b8060405162461bcd60e51b81526004016107369190611052565b5f6020828403121561100a575f5ffd5b5035919050565b6001600160a01b0381168114611025575f5ffd5b50565b5f5f60408385031215611039575f5ffd5b823561104481611011565b946020939093013593505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215611097575f5ffd5b81356110a281611011565b9392505050565b60ff81168114611025575f5ffd5b5f602082840312156110c7575f5ffd5b81356110a2816110a9565b5f5f5f606084860312156110e4575f5ffd5b83356110ef81611011565b925060208401356110ff81611011565b929592945050506040919091013590565b5f60208284031215611120575f5ffd5b815180151581146110a2575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561056b5761056b61112f565b8181038181111561056b5761056b61112f565b808202811582820484141761056b5761056b61112f565b5f8261119a57634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156111af575f5ffd5b5051919050565b5f602082840312156111c6575f5ffd5b81516110a281611011565b5f602082840312156111e1575f5ffd5b81516110a2816110a9565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212204d9e7acdccb6b2ab49ed660281c7c36883d5311df800ee23ac0d7d690db0802964736f6c634300081b0033",
}
// StrategyBaseABI is the input ABI used to generate the binding from.
@@ -44,7 +44,7 @@ var StrategyBaseABI = StrategyBaseMetaData.ABI
var StrategyBaseBin = StrategyBaseMetaData.Bin
// DeployStrategyBase deploys a new Ethereum contract, binding an instance of StrategyBase to it.
-func DeployStrategyBase(auth *bind.TransactOpts, backend bind.ContractBackend, _strategyManager common.Address, _pauserRegistry common.Address) (common.Address, *types.Transaction, *StrategyBase, error) {
+func DeployStrategyBase(auth *bind.TransactOpts, backend bind.ContractBackend, _strategyManager common.Address, _pauserRegistry common.Address, _version string) (common.Address, *types.Transaction, *StrategyBase, error) {
parsed, err := StrategyBaseMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
@@ -53,7 +53,7 @@ func DeployStrategyBase(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(StrategyBaseBin), backend, _strategyManager, _pauserRegistry)
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(StrategyBaseBin), backend, _strategyManager, _pauserRegistry, _version)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -605,6 +605,37 @@ func (_StrategyBase *StrategyBaseCallerSession) UserUnderlyingView(user common.A
return _StrategyBase.Contract.UserUnderlyingView(&_StrategyBase.CallOpts, user)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyBase *StrategyBaseCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _StrategyBase.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyBase *StrategyBaseSession) Version() (string, error) {
+ return _StrategyBase.Contract.Version(&_StrategyBase.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyBase *StrategyBaseCallerSession) Version() (string, error) {
+ return _StrategyBase.Contract.Version(&_StrategyBase.CallOpts)
+}
+
// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
//
// Solidity: function deposit(address token, uint256 amount) returns(uint256 newShares)
diff --git a/pkg/bindings/StrategyBaseTVLLimits/binding.go b/pkg/bindings/StrategyBaseTVLLimits/binding.go
index 474dfd630a..bc4fc3c1dd 100644
--- a/pkg/bindings/StrategyBaseTVLLimits/binding.go
+++ b/pkg/bindings/StrategyBaseTVLLimits/binding.go
@@ -31,8 +31,8 @@ var (
// StrategyBaseTVLLimitsMetaData contains all meta data concerning the StrategyBaseTVLLimits contract.
var StrategyBaseTVLLimitsMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]",
- Bin: "0x60c060405234801561000f575f5ffd5b5060405161173e38038061173e83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516115656101d95f395f81816101ce01528181610556015281816109790152610a1601525f81816102960152818161039501528181610467015281816106970152610b4401526115655ff3fe608060405234801561000f575f5ffd5b506004361061016d575f3560e01c80637a8b2637116100d9578063c4d66de811610093578063df6fadc11161006e578063df6fadc11461033f578063e3dae51c1461035a578063f3e738751461036d578063fabc1cbc14610380575f5ffd5b8063c4d66de814610306578063ce7c2ac214610319578063d9caed121461032c575f5ffd5b80637a8b26371461027e578063886f1195146102915780638c871019146102b85780638f6a6240146102cb578063a6ab36f2146102de578063ab5921e1146102f1575f5ffd5b806347e7ef241161012a57806347e7ef2414610210578063553ca5f814610223578063595c6a67146102365780635ac86ab71461023e5780635c975abb1461026d57806361b01b5d14610275575f5ffd5b806311c70c9d14610171578063136439dd146101865780632495a5991461019957806339b70e38146101c95780633a98ef39146101f057806343fe08b014610207575b5f5ffd5b61018461017f366004611236565b610393565b005b610184610194366004611256565b610452565b6032546101ac906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f960335481565b6040519081526020016101c0565b6101f960645481565b6101f961021e366004611284565b610523565b6101f96102313660046112ae565b61066f565b610184610682565b61025d61024c3660046112de565b6001805460ff9092161b9081161490565b60405190151581526020016101c0565b6001546101f9565b6101f960655481565b6101f961028c366004611256565b610731565b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f96102c6366004611256565b61077a565b6101f96102d93660046112ae565b610784565b6101846102ec3660046112f9565b610791565b6102f961086c565b6040516101c0919061132f565b6101846103143660046112ae565b61088c565b6101f96103273660046112ae565b610952565b61018461033a366004611364565b6109e4565b606454606554604080519283526020830191909152016101c0565b6101f9610368366004611256565b610b01565b6101f961037b366004611256565b610b38565b61018461038e366004611256565b610b42565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041391906113a2565b6001600160a01b0316336001600160a01b0316146104445760405163794821ff60e01b815260040160405180910390fd5b61044e8282610c58565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906113bd565b6104f557604051631d77d47760e21b815260040160405180910390fd5b600154818116811461051a5760405163c61dca5d60e01b815260040160405180910390fd5b61044e82610cfc565b600180545f91829181160361054b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610594576040516348da714f60e01b815260040160405180910390fd5b61059e8484610d39565b6033545f6105ae6103e8836113f0565b90505f6103e86105bc610d90565b6105c691906113f0565b90505f6105d38783611403565b9050806105e08489611416565b6105ea919061142d565b9550855f0361060c57604051630c392ed360e11b815260040160405180910390fd5b61061686856113f0565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561064b57604051632f14e8a360e11b815260040160405180910390fd5b610664826103e860335461065f91906113f0565b610dff565b505050505092915050565b5f61067c61028c83610952565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106e4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906113bd565b61072557604051631d77d47760e21b815260040160405180910390fd5b61072f5f19610cfc565b565b5f5f6103e860335461074391906113f0565b90505f6103e8610751610d90565b61075b91906113f0565b9050816107688583611416565b610772919061142d565b949350505050565b5f61067c82610b01565b5f61067c61037b83610952565b5f54610100900460ff16158080156107af57505f54600160ff909116105b806107c85750303b1580156107c857505f5460ff166001145b6107ed5760405162461bcd60e51b81526004016107e49061144c565b60405180910390fd5b5f805460ff19166001179055801561080e575f805461ff0019166101001790555b6108188484610c58565b61082182610e4b565b8015610866575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60606040518060800160405280604d81526020016114e3604d9139905090565b5f54610100900460ff16158080156108aa57505f54600160ff909116105b806108c35750303b1580156108c357505f5460ff166001145b6108df5760405162461bcd60e51b81526004016107e49061144c565b5f805460ff191660011790558015610900575f805461ff0019166101001790555b61090982610e4b565b801561044e575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156109c0573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067c919061149a565b60018054600290811603610a0b5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a54576040516348da714f60e01b815260040160405180910390fd5b610a5f848484610f96565b60335480831115610a8357604051630b469df360e41b815260040160405180910390fd5b5f610a906103e8836113f0565b90505f6103e8610a9e610d90565b610aa891906113f0565b90505f82610ab68784611416565b610ac0919061142d565b9050610acc8685611403565b603355610aec610adc8284611403565b6103e860335461065f91906113f0565b610af7888883610fc9565b5050505050505050565b5f5f6103e8603354610b1391906113f0565b90505f6103e8610b21610d90565b610b2b91906113f0565b9050806107688386611416565b5f61067c82610731565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc291906113a2565b6001600160a01b0316336001600160a01b031614610bf35760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610c1a5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610cf15760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b606454811115610d5c5760405163052b07b760e21b815260040160405180910390fd5b606554610d67610d90565b1115610d865760405163d86bae6760e01b815260040160405180910390fd5b61044e8282610fdd565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610dd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dfa919061149a565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610e3384670de0b6b3a7640000611416565b610e3d919061142d565b604051908152602001610946565b5f54610100900460ff16610eb55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107e4565b603280546001600160a01b0319166001600160a01b038316179055610ed95f610cfc565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6f91906114b1565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610fc457604051630312abdd60e61b815260040160405180910390fd5b505050565b610fc46001600160a01b038316848361100b565b6032546001600160a01b0383811691161461044e57604051630312abdd60e61b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610fc4928692915f9161109a918516908490611119565b905080515f14806110ba5750808060200190518101906110ba91906113bd565b610fc45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107e4565b606061077284845f85855f5f866001600160a01b0316858760405161113e91906114cc565b5f6040518083038185875af1925050503d805f8114611178576040519150601f19603f3d011682016040523d82523d5f602084013e61117d565b606091505b509150915061118e87838387611199565b979650505050505050565b606083156112075782515f03611200576001600160a01b0385163b6112005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e4565b5081610772565b610772838381511561121c5781518083602001fd5b8060405162461bcd60e51b81526004016107e4919061132f565b5f5f60408385031215611247575f5ffd5b50508035926020909101359150565b5f60208284031215611266575f5ffd5b5035919050565b6001600160a01b0381168114611281575f5ffd5b50565b5f5f60408385031215611295575f5ffd5b82356112a08161126d565b946020939093013593505050565b5f602082840312156112be575f5ffd5b81356112c98161126d565b9392505050565b60ff81168114611281575f5ffd5b5f602082840312156112ee575f5ffd5b81356112c9816112d0565b5f5f5f6060848603121561130b575f5ffd5b833592506020840135915060408401356113248161126d565b809150509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611376575f5ffd5b83356113818161126d565b925060208401356113918161126d565b929592945050506040919091013590565b5f602082840312156113b2575f5ffd5b81516112c98161126d565b5f602082840312156113cd575f5ffd5b815180151581146112c9575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561067c5761067c6113dc565b8181038181111561067c5761067c6113dc565b808202811582820484141761067c5761067c6113dc565b5f8261144757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156114aa575f5ffd5b5051919050565b5f602082840312156114c1575f5ffd5b81516112c9816112d0565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212208c53540f8e55ee9e91a437707dac638091cff6d578e7c91da177d7e72a1d24c664736f6c634300081b0033",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]",
+ Bin: "0x60e060405234801561000f575f5ffd5b5060405161195e38038061195e83398101604081905261002e916101bc565b82828280826001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261006f81610093565b60a052506001600160a01b03831660c0526100886100d9565b5050505050506102ed565b5f5f829050601f815111156100c6578260405163305a27a960e01b81526004016100bd9190610292565b60405180910390fd5b80516100d1826102c7565b179392505050565b5f54610100900460ff16156101405760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100bd565b5f5460ff9081161461018f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101a5575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101ce575f5ffd5b83516101d981610191565b60208501519093506101ea81610191565b60408501519092506001600160401b03811115610205575f5ffd5b8401601f81018613610215575f5ffd5b80516001600160401b0381111561022e5761022e6101a8565b604051601f8201601f19908116603f011681016001600160401b038111828210171561025c5761025c6101a8565b604052818152828201602001881015610273575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102e7575f198160200360031b1b821691505b50919050565b60805160a05160c0516116166103485f395f81816101e801528181610578015281816109cb0152610a6801525f61069801525f81816102c5015281816103b701528181610489015281816106e90152610b9601526116165ff3fe608060405234801561000f575f5ffd5b5060043610610187575f3560e01c80637a8b2637116100d9578063c4d66de811610093578063df6fadc11161006e578063df6fadc114610361578063e3dae51c1461037c578063f3e738751461038f578063fabc1cbc146103a2575f5ffd5b8063c4d66de814610328578063ce7c2ac21461033b578063d9caed121461034e575f5ffd5b80637a8b2637146102ad578063886f1195146102c05780638c871019146102e75780638f6a6240146102fa578063a6ab36f21461030d578063ab5921e114610320575f5ffd5b806347e7ef2411610144578063595c6a671161011f578063595c6a67146102655780635ac86ab71461026d5780635c975abb1461029c57806361b01b5d146102a4575f5ffd5b806347e7ef241461022a57806354fd4d501461023d578063553ca5f814610252575f5ffd5b806311c70c9d1461018b578063136439dd146101a05780632495a599146101b357806339b70e38146101e35780633a98ef391461020a57806343fe08b014610221575b5f5ffd5b61019e6101993660046112e7565b6103b5565b005b61019e6101ae366004611307565b610474565b6032546101c6906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101c67f000000000000000000000000000000000000000000000000000000000000000081565b61021360335481565b6040519081526020016101da565b61021360645481565b610213610238366004611335565b610545565b610245610691565b6040516101da919061135f565b610213610260366004611394565b6106c1565b61019e6106d4565b61028c61027b3660046113c4565b6001805460ff9092161b9081161490565b60405190151581526020016101da565b600154610213565b61021360655481565b6102136102bb366004611307565b610783565b6101c67f000000000000000000000000000000000000000000000000000000000000000081565b6102136102f5366004611307565b6107cc565b610213610308366004611394565b6107d6565b61019e61031b3660046113df565b6107e3565b6102456108be565b61019e610336366004611394565b6108de565b610213610349366004611394565b6109a4565b61019e61035c366004611415565b610a36565b606454606554604080519283526020830191909152016101da565b61021361038a366004611307565b610b53565b61021361039d366004611307565b610b8a565b61019e6103b0366004611307565b610b94565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610411573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104359190611453565b6001600160a01b0316336001600160a01b0316146104665760405163794821ff60e01b815260040160405180910390fd5b6104708282610caa565b5050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156104d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fa919061146e565b61051757604051631d77d47760e21b815260040160405180910390fd5b600154818116811461053c5760405163c61dca5d60e01b815260040160405180910390fd5b61047082610d4e565b600180545f91829181160361056d5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105b6576040516348da714f60e01b815260040160405180910390fd5b6105c08484610d8b565b6033545f6105d06103e8836114a1565b90505f6103e86105de610de2565b6105e891906114a1565b90505f6105f587836114b4565b90508061060284896114c7565b61060c91906114de565b9550855f0361062e57604051630c392ed360e11b815260040160405180910390fd5b61063886856114a1565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561066d57604051632f14e8a360e11b815260040160405180910390fd5b610686826103e860335461068191906114a1565b610e4c565b505050505092915050565b60606106bc7f0000000000000000000000000000000000000000000000000000000000000000610e98565b905090565b5f6106ce6102bb836109a4565b92915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610736573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075a919061146e565b61077757604051631d77d47760e21b815260040160405180910390fd5b6107815f19610d4e565b565b5f5f6103e860335461079591906114a1565b90505f6103e86107a3610de2565b6107ad91906114a1565b9050816107ba85836114c7565b6107c491906114de565b949350505050565b5f6106ce82610b53565b5f6106ce61039d836109a4565b5f54610100900460ff161580801561080157505f54600160ff909116105b8061081a5750303b15801561081a57505f5460ff166001145b61083f5760405162461bcd60e51b8152600401610836906114fd565b60405180910390fd5b5f805460ff191660011790558015610860575f805461ff0019166101001790555b61086a8484610caa565b61087382610ed5565b80156108b8575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60606040518060800160405280604d8152602001611594604d9139905090565b5f54610100900460ff16158080156108fc57505f54600160ff909116105b806109155750303b15801561091557505f5460ff166001145b6109315760405162461bcd60e51b8152600401610836906114fd565b5f805460ff191660011790558015610952575f805461ff0019166101001790555b61095b82610ed5565b8015610470575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa158015610a12573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ce919061154b565b60018054600290811603610a5d5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610aa6576040516348da714f60e01b815260040160405180910390fd5b610ab1848484611020565b60335480831115610ad557604051630b469df360e41b815260040160405180910390fd5b5f610ae26103e8836114a1565b90505f6103e8610af0610de2565b610afa91906114a1565b90505f82610b0887846114c7565b610b1291906114de565b9050610b1e86856114b4565b603355610b3e610b2e82846114b4565b6103e860335461068191906114a1565b610b49888883611053565b5050505050505050565b5f5f6103e8603354610b6591906114a1565b90505f6103e8610b73610de2565b610b7d91906114a1565b9050806107ba83866114c7565b5f6106ce82610783565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c149190611453565b6001600160a01b0316336001600160a01b031614610c455760405163794821ff60e01b815260040160405180910390fd5b60015480198219811614610c6c5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610d435760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b606454811115610dae5760405163052b07b760e21b815260040160405180910390fd5b606554610db9610de2565b1115610dd85760405163d86bae6760e01b815260040160405180910390fd5b6104708282611067565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e28573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106bc919061154b565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610e8084670de0b6b3a76400006114c7565b610e8a91906114de565b604051908152602001610998565b60605f610ea483611095565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f54610100900460ff16610f3f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610836565b603280546001600160a01b0319166001600160a01b038316179055610f635f610d4e565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff99190611562565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b0383811691161461104e57604051630312abdd60e61b815260040160405180910390fd5b505050565b61104e6001600160a01b03831684836110bc565b6032546001600160a01b0383811691161461047057604051630312abdd60e61b815260040160405180910390fd5b5f60ff8216601f8111156106ce57604051632cd44ac360e21b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261104e928692915f9161114b9185169084906111ca565b905080515f148061116b57508080602001905181019061116b919061146e565b61104e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610836565b60606107c484845f85855f5f866001600160a01b031685876040516111ef919061157d565b5f6040518083038185875af1925050503d805f8114611229576040519150601f19603f3d011682016040523d82523d5f602084013e61122e565b606091505b509150915061123f8783838761124a565b979650505050505050565b606083156112b85782515f036112b1576001600160a01b0385163b6112b15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610836565b50816107c4565b6107c483838151156112cd5781518083602001fd5b8060405162461bcd60e51b8152600401610836919061135f565b5f5f604083850312156112f8575f5ffd5b50508035926020909101359150565b5f60208284031215611317575f5ffd5b5035919050565b6001600160a01b0381168114611332575f5ffd5b50565b5f5f60408385031215611346575f5ffd5b82356113518161131e565b946020939093013593505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156113a4575f5ffd5b81356113af8161131e565b9392505050565b60ff81168114611332575f5ffd5b5f602082840312156113d4575f5ffd5b81356113af816113b6565b5f5f5f606084860312156113f1575f5ffd5b8335925060208401359150604084013561140a8161131e565b809150509250925092565b5f5f5f60608486031215611427575f5ffd5b83356114328161131e565b925060208401356114428161131e565b929592945050506040919091013590565b5f60208284031215611463575f5ffd5b81516113af8161131e565b5f6020828403121561147e575f5ffd5b815180151581146113af575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ce576106ce61148d565b818103818111156106ce576106ce61148d565b80820281158282048414176106ce576106ce61148d565b5f826114f857634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f6020828403121561155b575f5ffd5b5051919050565b5f60208284031215611572575f5ffd5b81516113af816113b6565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122042e31c9c79814df86ac31d2daed55a6e301d6261fc03bfa5ac82653214d664b764736f6c634300081b0033",
}
// StrategyBaseTVLLimitsABI is the input ABI used to generate the binding from.
@@ -44,7 +44,7 @@ var StrategyBaseTVLLimitsABI = StrategyBaseTVLLimitsMetaData.ABI
var StrategyBaseTVLLimitsBin = StrategyBaseTVLLimitsMetaData.Bin
// DeployStrategyBaseTVLLimits deploys a new Ethereum contract, binding an instance of StrategyBaseTVLLimits to it.
-func DeployStrategyBaseTVLLimits(auth *bind.TransactOpts, backend bind.ContractBackend, _strategyManager common.Address, _pauserRegistry common.Address) (common.Address, *types.Transaction, *StrategyBaseTVLLimits, error) {
+func DeployStrategyBaseTVLLimits(auth *bind.TransactOpts, backend bind.ContractBackend, _strategyManager common.Address, _pauserRegistry common.Address, _version string) (common.Address, *types.Transaction, *StrategyBaseTVLLimits, error) {
parsed, err := StrategyBaseTVLLimitsMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
@@ -53,7 +53,7 @@ func DeployStrategyBaseTVLLimits(auth *bind.TransactOpts, backend bind.ContractB
return common.Address{}, nil, nil, errors.New("GetABI returned nil")
}
- address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(StrategyBaseTVLLimitsBin), backend, _strategyManager, _pauserRegistry)
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(StrategyBaseTVLLimitsBin), backend, _strategyManager, _pauserRegistry, _version)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -699,6 +699,37 @@ func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCallerSession) UserUnderlying
return _StrategyBaseTVLLimits.Contract.UserUnderlyingView(&_StrategyBaseTVLLimits.CallOpts, user)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _StrategyBaseTVLLimits.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsSession) Version() (string, error) {
+ return _StrategyBaseTVLLimits.Contract.Version(&_StrategyBaseTVLLimits.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCallerSession) Version() (string, error) {
+ return _StrategyBaseTVLLimits.Contract.Version(&_StrategyBaseTVLLimits.CallOpts)
+}
+
// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
//
// Solidity: function deposit(address token, uint256 amount) returns(uint256 newShares)
diff --git a/pkg/bindings/StrategyFactory/binding.go b/pkg/bindings/StrategyFactory/binding.go
index aa6f42a465..e7e46b6cf0 100644
--- a/pkg/bindings/StrategyFactory/binding.go
+++ b/pkg/bindings/StrategyFactory/binding.go
@@ -31,8 +31,8 @@ var (
// StrategyFactoryMetaData contains all meta data concerning the StrategyFactory contract.
var StrategyFactoryMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blacklistTokens\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategyBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isBlacklisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyBeaconModified\",\"inputs\":[{\"name\":\"previousBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"},{\"name\":\"newBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategySetForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenBlacklisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"}],\"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\":\"AlreadyBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlacklistedToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyExists\",\"inputs\":[]}]",
- Bin: "0x60c060405234801561000f575f5ffd5b5060405161195e38038061195e83398101604081905261002e9161014e565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610186565b603354610100900460ff16156100e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60335460ff90811614610135576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014b575f5ffd5b50565b5f5f6040838503121561015f575f5ffd5b825161016a81610137565b602084015190925061017b81610137565b809150509250929050565b60805160a0516117866101d85f395f8181610142015281816105d501528181610869015281816109060152610c4701525f8181610215015281816102f0015281816106530152610b1401526117865ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c8063886f11951161009e578063f0062d9a1161006e578063f0062d9a1461026e578063f2fde38b14610280578063fabc1cbc14610293578063fe38b32d146102a6578063fe575a87146102b9575f5ffd5b8063886f1195146102105780638da5cb5b14610237578063b768ebc914610248578063c350a1b51461025b575f5ffd5b8063595c6a67116100e4578063595c6a67146101a95780635ac86ab7146101b15780635c975abb146101e45780636b9b6229146101f5578063715018a614610208575f5ffd5b8063136439dd1461011557806323103c411461012a57806339b70e381461013d578063581dfd6514610181575b5f5ffd5b610128610123366004610e44565b6102db565b005b610128610138366004610ea3565b6103b0565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461018f366004610ef6565b60016020525f90815260409020546001600160a01b031681565b61012861063e565b6101d46101bf366004610f18565b609954600160ff9092169190911b9081161490565b6040519015158152602001610178565b609954604051908152602001610178565b610164610203366004610ef6565b6106ed565b6101286108d6565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6066546001600160a01b0316610164565b610128610256366004610ea3565b6108e7565b610128610269366004610f38565b61096e565b5f54610164906001600160a01b031681565b61012861028e366004610ef6565b610a99565b6101286102a1366004610e44565b610b12565b6101286102b4366004610ea3565b610c28565b6101d46102c7366004610ef6565b60026020525f908152604090205460ff1681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561033d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103619190610f77565b61037e57604051631d77d47760e21b815260040160405180910390fd5b60995481811681146103a35760405163c61dca5d60e01b815260040160405180910390fd5b6103ac82610c7e565b5050565b6103b8610cbb565b5f8167ffffffffffffffff8111156103d2576103d2610f96565b6040519080825280602002602001820160405280156103fb578160200160208202803683370190505b5090505f805b838110156105b45760025f86868481811061041e5761041e610faa565b90506020020160208101906104339190610ef6565b6001600160a01b0316815260208101919091526040015f205460ff161561046d5760405163f53de75f60e01b815260040160405180910390fd5b600160025f87878581811061048457610484610faa565b90506020020160208101906104999190610ef6565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b38585838181106104f3576104f3610faa565b90506020020160208101906105089190610ef6565b6040516001600160a01b03909116815260200160405180910390a15f60015f87878581811061053957610539610faa565b905060200201602081019061054e9190610ef6565b6001600160a01b03908116825260208201929092526040015f205416905080156105ab578084848151811061058557610585610faa565b6001600160a01b0390921660209283029190910190910152826105a781610fbe565b9350505b50600101610401565b508082528015610638576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061060a908590600401610fe2565b5f604051808303815f87803b158015610621575f5ffd5b505af1158015610633573d5f5f3e3d5ffd5b505050505b50505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c49190610f77565b6106e157604051631d77d47760e21b815260040160405180910390fd5b6106eb5f19610c7e565b565b6099545f9081906001908116036107175760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526002602052604090205460ff16156107505760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b038381165f9081526001602052604090205416156107885760405163c45546f760e01b815260040160405180910390fd5b5f8054604080516001600160a01b0387811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663189acdbd60e31b17905291519190921691906107df90610e37565b6107ea92919061102d565b604051809103905ff080158015610803573d5f5f3e3d5ffd5b5090506108108482610d15565b6040805160018082528183019092525f916020808301908036833701905050905081815f8151811061084457610844610faa565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff2906108a0908490600401610fe2565b5f604051808303815f87803b1580156108b7575f5ffd5b505af11580156108c9573d5f5f3e3d5ffd5b5093979650505050505050565b6108de610cbb565b6106eb5f610d7f565b6108ef610cbb565b604051632ef047f960e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635de08ff29061093d9085908590600401611071565b5f604051808303815f87803b158015610954575f5ffd5b505af1158015610966573d5f5f3e3d5ffd5b505050505050565b603354610100900460ff161580801561098e5750603354600160ff909116105b806109a85750303b1580156109a8575060335460ff166001145b610a105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff191660011790558015610a33576033805461ff0019166101001790555b610a3c84610d7f565b610a4583610c7e565b610a4e82610dd0565b8015610638576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610aa1610cbb565b6001600160a01b038116610b065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a07565b610b0f81610d7f565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9291906110bd565b6001600160a01b0316336001600160a01b031614610bc35760405163794821ff60e01b815260040160405180910390fd5b60995480198219811614610bea5760405163c61dca5d60e01b815260040160405180910390fd5b609982905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b610c30610cbb565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061093d9085908590600401611071565b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6066546001600160a01b031633146106eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a07565b6001600160a01b038281165f8181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b610678806110d983390190565b5f60208284031215610e54575f5ffd5b5035919050565b5f5f83601f840112610e6b575f5ffd5b50813567ffffffffffffffff811115610e82575f5ffd5b6020830191508360208260051b8501011115610e9c575f5ffd5b9250929050565b5f5f60208385031215610eb4575f5ffd5b823567ffffffffffffffff811115610eca575f5ffd5b610ed685828601610e5b565b90969095509350505050565b6001600160a01b0381168114610b0f575f5ffd5b5f60208284031215610f06575f5ffd5b8135610f1181610ee2565b9392505050565b5f60208284031215610f28575f5ffd5b813560ff81168114610f11575f5ffd5b5f5f5f60608486031215610f4a575f5ffd5b8335610f5581610ee2565b9250602084013591506040840135610f6c81610ee2565b809150509250925092565b5f60208284031215610f87575f5ffd5b81518015158114610f11575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60018201610fdb57634e487b7160e01b5f52601160045260245ffd5b5060010190565b602080825282518282018190525f918401906040840190835b818110156110225783516001600160a01b0316835260209384019390920191600101610ffb565b509095945050505050565b60018060a01b0383168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602080825281018290525f8360408301825b858110156110b357823561109681610ee2565b6001600160a01b0316825260209283019290910190600101611083565b5095945050505050565b5f602082840312156110cd575f5ffd5b8151610f1181610ee256fe6080604052604051610678380380610678833981016040819052610022916103ed565b61002d82825f610034565b5050610513565b61003d836100f1565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a25f8251118061007c5750805b156100ec576100ea836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906104af565b83610273565b505b505050565b6001600160a01b0381163b61015b5760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101cd816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101be91906104af565b6001600160a01b03163b151590565b6102325760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610152565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029883836040518060600160405280602781526020016106516027913961029f565b9392505050565b60605f5f856001600160a01b0316856040516102bb91906104c8565b5f60405180830381855af49150503d805f81146102f3576040519150601f19603f3d011682016040523d82523d5f602084013e6102f8565b606091505b50909250905061030a86838387610314565b9695505050505050565b606083156103825782515f0361037b576001600160a01b0385163b61037b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b508161038c565b61038c8383610394565b949350505050565b8151156103a45781518083602001fd5b8060405162461bcd60e51b815260040161015291906104de565b80516001600160a01b03811681146103d4575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156103fe575f5ffd5b610407836103be565b60208401519092506001600160401b03811115610422575f5ffd5b8301601f81018513610432575f5ffd5b80516001600160401b0381111561044b5761044b6103d9565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610479576104796103d9565b604052818152828201602001871015610490575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b5f602082840312156104bf575f5ffd5b610298826103be565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b610131806105205f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b60b3565b565b5f60527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015608c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ae919060d0565b905090565b365f5f375f5f365f845af43d5f5f3e80801560cc573d5ff35b3d5ffd5b5f6020828403121560df575f5ffd5b81516001600160a01b038116811460f4575f5ffd5b939250505056fea2646970667358221220f37d2ffd80ec7d14cc9a0f17394e9d97446c1f630de382043b1ed4ccacf6a7d464736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204d3c33703abfc3abdc8b755aa836265d0b4b850a6fda4e8380b8558b8d975be164736f6c634300081b0033",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blacklistTokens\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategyBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isBlacklisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyBeaconModified\",\"inputs\":[{\"name\":\"previousBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"},{\"name\":\"newBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategySetForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenBlacklisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"}],\"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\":\"AlreadyBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlacklistedToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
+ Bin: "0x60e060405234801561000f575f5ffd5b50604051611bac380380611bac83398101604081905261002e916101b9565b80826001600160a01b038116610057576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261006c8161008d565b60a052506001600160a01b03831660c0526100856100d3565b5050506102ea565b5f5f829050601f815111156100c0578260405163305a27a960e01b81526004016100b7919061028f565b60405180910390fd5b80516100cb826102c4565b179392505050565b603354610100900460ff161561013b5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100b7565b60335460ff9081161461018c576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101a2575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101cb575f5ffd5b83516101d68161018e565b60208501519093506101e78161018e565b60408501519092506001600160401b03811115610202575f5ffd5b8401601f81018613610212575f5ffd5b80516001600160401b0381111561022b5761022b6101a5565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610259576102596101a5565b604052818152828201602001881015610270575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102e4575f198160200360031b1b821691505b50919050565b60805160a05160c0516118676103455f395f818161014d015281816105f5015281816108b9015281816109560152610c9701525f61066501525f818161023501528181610310015281816106a30152610b6401526118675ff3fe608060405234801561000f575f5ffd5b506004361061011c575f3560e01c8063715018a6116100a9578063f0062d9a1161006e578063f0062d9a1461028e578063f2fde38b146102a0578063fabc1cbc146102b3578063fe38b32d146102c6578063fe575a87146102d9575f5ffd5b8063715018a614610228578063886f1195146102305780638da5cb5b14610257578063b768ebc914610268578063c350a1b51461027b575f5ffd5b8063581dfd65116100ef578063581dfd65146101a1578063595c6a67146101c95780635ac86ab7146101d15780635c975abb146102045780636b9b622914610215575f5ffd5b8063136439dd1461012057806323103c411461013557806339b70e381461014857806354fd4d501461018c575b5f5ffd5b61013361012e366004610efe565b6102fb565b005b610133610143366004610f5d565b6103d0565b61016f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61019461065e565b6040516101839190610fca565b61016f6101af366004610ff7565b60016020525f90815260409020546001600160a01b031681565b61013361068e565b6101f46101df366004611012565b609954600160ff9092169190911b9081161490565b6040519015158152602001610183565b609954604051908152602001610183565b61016f610223366004610ff7565b61073d565b610133610926565b61016f7f000000000000000000000000000000000000000000000000000000000000000081565b6066546001600160a01b031661016f565b610133610276366004610f5d565b610937565b610133610289366004611032565b6109be565b5f5461016f906001600160a01b031681565b6101336102ae366004610ff7565b610ae9565b6101336102c1366004610efe565b610b62565b6101336102d4366004610f5d565b610c78565b6101f46102e7366004610ff7565b60026020525f908152604090205460ff1681565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561035d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103819190611071565b61039e57604051631d77d47760e21b815260040160405180910390fd5b60995481811681146103c35760405163c61dca5d60e01b815260040160405180910390fd5b6103cc82610cce565b5050565b6103d8610d0b565b5f8167ffffffffffffffff8111156103f2576103f2611090565b60405190808252806020026020018201604052801561041b578160200160208202803683370190505b5090505f805b838110156105d45760025f86868481811061043e5761043e6110a4565b90506020020160208101906104539190610ff7565b6001600160a01b0316815260208101919091526040015f205460ff161561048d5760405163f53de75f60e01b815260040160405180910390fd5b600160025f8787858181106104a4576104a46110a4565b90506020020160208101906104b99190610ff7565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b3858583818110610513576105136110a4565b90506020020160208101906105289190610ff7565b6040516001600160a01b03909116815260200160405180910390a15f60015f878785818110610559576105596110a4565b905060200201602081019061056e9190610ff7565b6001600160a01b03908116825260208201929092526040015f205416905080156105cb57808484815181106105a5576105a56110a4565b6001600160a01b0390921660209283029190910190910152826105c7816110b8565b9350505b50600101610421565b508082528015610658576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061062a9085906004016110dc565b5f604051808303815f87803b158015610641575f5ffd5b505af1158015610653573d5f5f3e3d5ffd5b505050505b50505050565b60606106897f0000000000000000000000000000000000000000000000000000000000000000610d65565b905090565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156106f0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107149190611071565b61073157604051631d77d47760e21b815260040160405180910390fd5b61073b5f19610cce565b565b6099545f9081906001908116036107675760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526002602052604090205460ff16156107a05760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b038381165f9081526001602052604090205416156107d85760405163c45546f760e01b815260040160405180910390fd5b5f8054604080516001600160a01b0387811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663189acdbd60e31b179052915191909216919061082f90610ef1565b61083a929190611127565b604051809103905ff080158015610853573d5f5f3e3d5ffd5b5090506108608482610da2565b6040805160018082528183019092525f916020808301908036833701905050905081815f81518110610894576108946110a4565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff2906108f09084906004016110dc565b5f604051808303815f87803b158015610907575f5ffd5b505af1158015610919573d5f5f3e3d5ffd5b5093979650505050505050565b61092e610d0b565b61073b5f610e0c565b61093f610d0b565b604051632ef047f960e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635de08ff29061098d9085908590600401611152565b5f604051808303815f87803b1580156109a4575f5ffd5b505af11580156109b6573d5f5f3e3d5ffd5b505050505050565b603354610100900460ff16158080156109de5750603354600160ff909116105b806109f85750303b1580156109f8575060335460ff166001145b610a605760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff191660011790558015610a83576033805461ff0019166101001790555b610a8c84610e0c565b610a9583610cce565b610a9e82610e5d565b8015610658576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610af1610d0b565b6001600160a01b038116610b565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a57565b610b5f81610e0c565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bbe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be2919061119e565b6001600160a01b0316336001600160a01b031614610c135760405163794821ff60e01b815260040160405180910390fd5b60995480198219811614610c3a5760405163c61dca5d60e01b815260040160405180910390fd5b609982905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b610c80610d0b565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061098d9085908590600401611152565b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6066546001600160a01b0316331461073b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a57565b60605f610d7183610ec4565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b038281165f8181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f60ff8216601f811115610eeb57604051632cd44ac360e21b815260040160405180910390fd5b92915050565b610678806111ba83390190565b5f60208284031215610f0e575f5ffd5b5035919050565b5f5f83601f840112610f25575f5ffd5b50813567ffffffffffffffff811115610f3c575f5ffd5b6020830191508360208260051b8501011115610f56575f5ffd5b9250929050565b5f5f60208385031215610f6e575f5ffd5b823567ffffffffffffffff811115610f84575f5ffd5b610f9085828601610f15565b90969095509350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610fdc6020830184610f9c565b9392505050565b6001600160a01b0381168114610b5f575f5ffd5b5f60208284031215611007575f5ffd5b8135610fdc81610fe3565b5f60208284031215611022575f5ffd5b813560ff81168114610fdc575f5ffd5b5f5f5f60608486031215611044575f5ffd5b833561104f81610fe3565b925060208401359150604084013561106681610fe3565b809150509250925092565b5f60208284031215611081575f5ffd5b81518015158114610fdc575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f600182016110d557634e487b7160e01b5f52601160045260245ffd5b5060010190565b602080825282518282018190525f918401906040840190835b8181101561111c5783516001600160a01b03168352602093840193909201916001016110f5565b509095945050505050565b6001600160a01b03831681526040602082018190525f9061114a90830184610f9c565b949350505050565b602080825281018290525f8360408301825b8581101561119457823561117781610fe3565b6001600160a01b0316825260209283019290910190600101611164565b5095945050505050565b5f602082840312156111ae575f5ffd5b8151610fdc81610fe356fe6080604052604051610678380380610678833981016040819052610022916103ed565b61002d82825f610034565b5050610513565b61003d836100f1565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a25f8251118061007c5750805b156100ec576100ea836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906104af565b83610273565b505b505050565b6001600160a01b0381163b61015b5760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101cd816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101be91906104af565b6001600160a01b03163b151590565b6102325760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610152565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029883836040518060600160405280602781526020016106516027913961029f565b9392505050565b60605f5f856001600160a01b0316856040516102bb91906104c8565b5f60405180830381855af49150503d805f81146102f3576040519150601f19603f3d011682016040523d82523d5f602084013e6102f8565b606091505b50909250905061030a86838387610314565b9695505050505050565b606083156103825782515f0361037b576001600160a01b0385163b61037b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b508161038c565b61038c8383610394565b949350505050565b8151156103a45781518083602001fd5b8060405162461bcd60e51b815260040161015291906104de565b80516001600160a01b03811681146103d4575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156103fe575f5ffd5b610407836103be565b60208401519092506001600160401b03811115610422575f5ffd5b8301601f81018513610432575f5ffd5b80516001600160401b0381111561044b5761044b6103d9565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610479576104796103d9565b604052818152828201602001871015610490575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b5f602082840312156104bf575f5ffd5b610298826103be565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b610131806105205f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b60b3565b565b5f60527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015608c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ae919060d0565b905090565b365f5f375f5f365f845af43d5f5f3e80801560cc573d5ff35b3d5ffd5b5f6020828403121560df575f5ffd5b81516001600160a01b038116811460f4575f5ffd5b939250505056fea26469706673582212205e179e1700322d816f025eafa6283d01eb81392a9f5f438a46fb77683652459464736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d07320121ad9f9952d67962957b3cb2cb5a1fa87f8d6bc8bfdaad0d52e36131464736f6c634300081b0033",
}
// StrategyFactoryABI is the input ABI used to generate the binding from.
@@ -44,7 +44,7 @@ var StrategyFactoryABI = StrategyFactoryMetaData.ABI
var StrategyFactoryBin = StrategyFactoryMetaData.Bin
// DeployStrategyFactory deploys a new Ethereum contract, binding an instance of StrategyFactory to it.
-func DeployStrategyFactory(auth *bind.TransactOpts, backend bind.ContractBackend, _strategyManager common.Address, _pauserRegistry common.Address) (common.Address, *types.Transaction, *StrategyFactory, error) {
+func DeployStrategyFactory(auth *bind.TransactOpts, backend bind.ContractBackend, _strategyManager common.Address, _pauserRegistry common.Address, _version string) (common.Address, *types.Transaction, *StrategyFactory, error) {
parsed, err := StrategyFactoryMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
@@ -53,7 +53,7 @@ func DeployStrategyFactory(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(StrategyFactoryBin), backend, _strategyManager, _pauserRegistry)
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(StrategyFactoryBin), backend, _strategyManager, _pauserRegistry, _version)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -450,6 +450,37 @@ func (_StrategyFactory *StrategyFactoryCallerSession) StrategyManager() (common.
return _StrategyFactory.Contract.StrategyManager(&_StrategyFactory.CallOpts)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyFactory *StrategyFactoryCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _StrategyFactory.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyFactory *StrategyFactorySession) Version() (string, error) {
+ return _StrategyFactory.Contract.Version(&_StrategyFactory.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyFactory *StrategyFactoryCallerSession) Version() (string, error) {
+ return _StrategyFactory.Contract.Version(&_StrategyFactory.CallOpts)
+}
+
// BlacklistTokens is a paid mutator transaction binding the contract method 0x23103c41.
//
// Solidity: function blacklistTokens(address[] tokens) returns()
diff --git a/pkg/bindings/StrategyFactoryStorage/binding.go b/pkg/bindings/StrategyFactoryStorage/binding.go
index c967b62fd8..6383a87ffd 100644
--- a/pkg/bindings/StrategyFactoryStorage/binding.go
+++ b/pkg/bindings/StrategyFactoryStorage/binding.go
@@ -31,7 +31,7 @@ var (
// StrategyFactoryStorageMetaData contains all meta data concerning the StrategyFactoryStorage contract.
var StrategyFactoryStorageMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isBlacklisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"StrategyBeaconModified\",\"inputs\":[{\"name\":\"previousBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"},{\"name\":\"newBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategySetForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenBlacklisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlacklistedToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyExists\",\"inputs\":[]}]",
+ ABI: "[{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isBlacklisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"StrategyBeaconModified\",\"inputs\":[{\"name\":\"previousBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"},{\"name\":\"newBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategySetForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenBlacklisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlacklistedToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyExists\",\"inputs\":[]}]",
}
// StrategyFactoryStorageABI is the input ABI used to generate the binding from.
@@ -273,6 +273,37 @@ func (_StrategyFactoryStorage *StrategyFactoryStorageCallerSession) StrategyBeac
return _StrategyFactoryStorage.Contract.StrategyBeacon(&_StrategyFactoryStorage.CallOpts)
}
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyFactoryStorage *StrategyFactoryStorageCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _StrategyFactoryStorage.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyFactoryStorage *StrategyFactoryStorageSession) Version() (string, error) {
+ return _StrategyFactoryStorage.Contract.Version(&_StrategyFactoryStorage.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyFactoryStorage *StrategyFactoryStorageCallerSession) Version() (string, error) {
+ return _StrategyFactoryStorage.Contract.Version(&_StrategyFactoryStorage.CallOpts)
+}
+
// DeployNewStrategy is a paid mutator transaction binding the contract method 0x6b9b6229.
//
// Solidity: function deployNewStrategy(address token) returns(address newStrategy)
diff --git a/pkg/bindings/StrategyManager/binding.go b/pkg/bindings/StrategyManager/binding.go
index 0f82c23b68..94531b46dd 100644
--- a/pkg/bindings/StrategyManager/binding.go
+++ b/pkg/bindings/StrategyManager/binding.go
@@ -31,8 +31,8 @@ var (
// StrategyManagerMetaData contains all meta data concerning the StrategyManager contract.
var StrategyManagerMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"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\":\"burnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"increaseBurnableShares\",\"inputs\":[{\"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\":\"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\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"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\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"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\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"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\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]",
- Bin: "0x610100604052348015610010575f5ffd5b5060405161286038038061286083398101604081905261002f916101ed565b81816001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0524660c052610108604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b60e05261011361011a565b5050610225565b5f54610100900460ff16156101855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101d4575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ea575f5ffd5b50565b5f5f604083850312156101fe575f5ffd5b8251610209816101d6565b602084015190925061021a816101d6565b809150509250929050565b60805160a05160c05160e0516125d06102905f395f6112ef01525f61122f01525f81816104c50152818161076201528181610bfb01528181610f99015281816110b401526116d301525f81816103720152818161057101528181610a06015261131301526125d05ff3fe608060405234801561000f575f5ffd5b50600436106101fd575f3560e01c80638da5cb5b11610114578063de44acb6116100a9578063f2fde38b11610079578063f2fde38b146104fa578063f3b4a0001461050d578063f698da2514610517578063fabc1cbc1461051f578063fe243a1714610532575f5ffd5b8063de44acb61461048d578063debe1eab146104ad578063df5cf723146104c0578063e7a050aa146104e7575f5ffd5b8063b5d8b5b8116100e4578063b5d8b5b81461042c578063c4623ea11461043f578063c665670214610467578063cbc2bd621461047a575f5ffd5b80638da5cb5b146103d457806394f649dd146103e5578063967fc0d2146104065780639ac01d6114610419575f5ffd5b80635ac86ab711610195578063715018a611610165578063715018a614610333578063724af4231461033b5780637ecebe001461034e578063886f11951461036d5780638b8aac3c146103ac575f5ffd5b80635ac86ab7146102c35780635c975abb146102f65780635de08ff2146102fe578063663c1de414610311575f5ffd5b806332e89ace116101d057806332e89ace1461026e57806348825e94146102815780634b6d5d6e146102a8578063595c6a67146102bb575f5ffd5b8063136439dd146102015780631794bb3c146102165780631b3cbdc1146102295780632eae418c1461025b575b5f5ffd5b61021461020f36600461207e565b61055c565b005b6102146102243660046120a9565b610631565b6102486102373660046120e7565b60d46020525f908152604090205481565b6040519081526020015b60405180910390f35b610214610269366004612102565b610757565b61024861027c366004612164565b61080b565b6102487f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b6102146102b63660046120e7565b6108af565b6102146109f1565b6102e66102d136600461225f565b609854600160ff9092169190911b9081161490565b6040519015158152602001610252565b609854610248565b61021461030c36600461227f565b610aa0565b6102e661031f3660046120e7565b60d16020525f908152604090205460ff1681565b610214610bdf565b6102146103493660046120a9565b610bf0565b61024861035c3660046120e7565b60ca6020525f908152604090205481565b6103947f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610252565b6102486103ba3660046120e7565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b0316610394565b6103f86103f33660046120e7565b610c44565b604051610252929190612333565b60cb54610394906001600160a01b031681565b61024861042736600461238b565b610dbc565b61021461043a36600461227f565b610e4d565b61045261044d366004612102565b610f8c565b60408051928352602083019190915201610252565b6102146104753660046120e7565b610ff1565b6103946104883660046123ec565b611002565b6104a061049b3660046120e7565b611036565b6040516102529190612416565b6102146104bb3660046123ec565b6110a9565b6103947f000000000000000000000000000000000000000000000000000000000000000081565b6102486104f53660046120a9565b611164565b6102146105083660046120e7565b6111b6565b610394620e16e481565b61024861122c565b61021461052d36600461207e565b611311565b610248610540366004612428565b60cd60209081525f928352604080842090915290825290205481565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156105be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e2919061245f565b6105ff57604051631d77d47760e21b815260040160405180910390fd5b60985481811681146106245760405163c61dca5d60e01b815260040160405180910390fd5b61062d82611427565b5050565b5f54610100900460ff161580801561064f57505f54600160ff909116105b806106685750303b15801561066857505f5460ff166001145b6106d05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156106f1575f805461ff0019166101001790555b6106fa82611427565b61070384611464565b61070c836114b5565b8015610751575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107a05760405163f739589b60e01b815260040160405180910390fd5b604051636ce5768960e11b81526001600160a01b03858116600483015283811660248301526044820183905284169063d9caed12906064015f604051808303815f87803b1580156107ef575f5ffd5b505af1158015610801573d5f5f3e3d5ffd5b5050505050505050565b6098545f9081906001908116036108355760405163840a48d560e01b815260040160405180910390fd5b61083d61151e565b6001600160a01b0385165f90815260ca602052604090205461086e86610867818c8c8c878c610dbc565b8688611577565b6001600160a01b0386165f90815260ca60205260409020600182019055610897868a8a8a6115c9565b9250506108a46001606555565b509695505050505050565b6108b761151e565b6001600160a01b0381165f81815260d4602090815260408083208054939055805193845290830182905290917fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a1816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa15801561095d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610981919061247e565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018490526064015f604051808303815f87803b1580156109cd575f5ffd5b505af11580156109df573d5f5f3e3d5ffd5b50505050506109ee6001606555565b50565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a53573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a77919061245f565b610a9457604051631d77d47760e21b815260040160405180910390fd5b610a9e5f19611427565b565b60cb546001600160a01b03163314610acb576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610aeb57610aeb612499565b9050602002016020810190610b0091906120e7565b6001600160a01b0316815260208101919091526040015f205460ff16610bd757600160d15f868685818110610b3757610b37612499565b9050602002016020810190610b4c91906120e7565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610ba657610ba6612499565b9050602002016020810190610bbb91906120e7565b6040516001600160a01b03909116815260200160405180910390a15b600101610ace565b610be7611737565b610a9e5f611464565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c395760405163f739589b60e01b815260040160405180910390fd5b610751838383611791565b6001600160a01b0381165f90815260ce60205260408120546060918291908167ffffffffffffffff811115610c7b57610c7b612150565b604051908082528060200260200182016040528015610ca4578160200160208202803683370190505b5090505f5b82811015610d32576001600160a01b0386165f90815260cd6020908152604080832060ce9092528220805491929184908110610ce757610ce7612499565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610d1f57610d1f612499565b6020908102919091010152600101610ca9565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f208181805480602002602001604051908101604052809291908181526020018280548015610daa57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610d8c575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f90610e42906101000160405160208183030381529060405280519060200120611855565b979650505050505050565b60cb546001600160a01b03163314610e78576040516320ba3ff960e21b815260040160405180910390fd5b805f5b818110156107515760d15f858584818110610e9857610e98612499565b9050602002016020810190610ead91906120e7565b6001600160a01b0316815260208101919091526040015f205460ff1615610f84575f60d15f868685818110610ee457610ee4612499565b9050602002016020810190610ef991906120e7565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610f5357610f53612499565b9050602002016020810190610f6891906120e7565b6040516001600160a01b03909116815260200160405180910390a15b600101610e7b565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fd75760405163f739589b60e01b815260040160405180910390fd5b610fe38685878661189b565b915091505b94509492505050565b610ff9611737565b6109ee816114b5565b60ce602052815f5260405f20818154811061101b575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce602090815260409182902080548351818402810184019094528084526060939283018282801561109d57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161107f575b50505050509050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110f25760405163f739589b60e01b815260040160405180910390fd5b6001600160a01b0382165f90815260d46020526040812080548392906111199084906124c1565b9091555050604080516001600160a01b0384168152602081018390527fca3e02a4ab7ad3c47a8e36e5a624c30170791726ab720f1babfef21046d953ff910160405180910390a15050565b6098545f90819060019081160361118e5760405163840a48d560e01b815260040160405180910390fd5b61119661151e565b6111a2338686866115c9565b91506111ae6001606555565b509392505050565b6111be611737565b6001600160a01b0381166112235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c7565b6109ee81611464565b5f7f000000000000000000000000000000000000000000000000000000000000000046146112ec5750604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611391919061247e565b6001600160a01b0316336001600160a01b0316146113c25760405163794821ff60e01b815260040160405180910390fd5b609854801982198116146113e95760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b6002606554036115705760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b6002606555565b4281101561159857604051630819bdcd60e01b815260040160405180910390fd5b6115ac6001600160a01b0385168484611a13565b61075157604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff1661160357604051632efd965160e11b815260040160405180910390fd5b6116186001600160a01b038516338786611a71565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af1158015611664573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061168891906124da565b91505f5f6116988887898761189b565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015611716575f5ffd5b505af1158015611728573d5f5f3e3d5ffd5b50505050505050949350505050565b6033546001600160a01b03163314610a9e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b5f815f036117b2576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038085165f90815260cd6020908152604080832093871683529290522054808311156117f857604051634b18b19360e01b815260040160405180910390fd5b61180283826124f1565b6001600160a01b038087165f90815260cd6020908152604080832093891683529290529081208290559091508190036118495761183f8585611acb565b600191505061184e565b5f9150505b9392505050565b5f61185e61122c565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f806001600160a01b0386166118c4576040516316f2ccc960e01b815260040160405180910390fd5b825f036118e4576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038087165f90815260cd602090815260408083209388168352929052908120549081900361198a576001600160a01b0387165f90815260ce60209081526040909120541061194c576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038781165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b61199484826124c1565b6001600160a01b038881165f81815260cd602090815260408083208b861680855290835292819020959095558451928352928a169282019290925291820152606081018590527f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969060800160405180910390a196929550919350505050565b5f5f5f611a208585611c49565b90925090505f816004811115611a3857611a38612504565b148015611a565750856001600160a01b0316826001600160a01b0316145b80611a675750611a67868686611c8b565b9695505050505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610751908590611d72565b6001600160a01b0382165f90815260ce6020526040812054905b81811015611bdd576001600160a01b038481165f90815260ce6020526040902080549185169183908110611b1b57611b1b612499565b5f918252602090912001546001600160a01b031603611bd5576001600160a01b0384165f90815260ce602052604090208054611b59906001906124f1565b81548110611b6957611b69612499565b5f9182526020808320909101546001600160a01b03878116845260ce9092526040909220805491909216919083908110611ba557611ba5612499565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550611bdd565b600101611ae5565b818103611bfd57604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce60205260409020805480611c2357611c23612518565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b5f5f8251604103611c7d576020830151604084015160608501515f1a611c7187828585611e4a565b94509450505050611c84565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401611cb392919061255a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611cf19190612572565b5f60405180830381855afa9150503d805f8114611d29576040519150601f19603f3d011682016040523d82523d5f602084013e611d2e565b606091505b5091509150818015611d4257506020815110155b8015611a6757508051630b135d3f60e11b90611d6790830160209081019084016124da565b149695505050505050565b5f611dc6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611f049092919063ffffffff16565b905080515f1480611de6575080806020019051810190611de6919061245f565b611e455760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106c7565b505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611e7f57505f90506003610fe8565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611ed0573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ef8575f60019250925050610fe8565b965f9650945050505050565b6060611f1284845f85611f1a565b949350505050565b606082471015611f7b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106c7565b5f5f866001600160a01b03168587604051611f969190612572565b5f6040518083038185875af1925050503d805f8114611fd0576040519150601f19603f3d011682016040523d82523d5f602084013e611fd5565b606091505b5091509150610e42878383876060831561204f5782515f03612048576001600160a01b0385163b6120485760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106c7565b5081611f12565b611f1283838151156120645781518083602001fd5b8060405162461bcd60e51b81526004016106c79190612588565b5f6020828403121561208e575f5ffd5b5035919050565b6001600160a01b03811681146109ee575f5ffd5b5f5f5f606084860312156120bb575f5ffd5b83356120c681612095565b925060208401356120d681612095565b929592945050506040919091013590565b5f602082840312156120f7575f5ffd5b813561184e81612095565b5f5f5f5f60808587031215612115575f5ffd5b843561212081612095565b9350602085013561213081612095565b9250604085013561214081612095565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f60c08789031215612179575f5ffd5b863561218481612095565b9550602087013561219481612095565b94506040870135935060608701356121ab81612095565b92506080870135915060a087013567ffffffffffffffff8111156121cd575f5ffd5b8701601f810189136121dd575f5ffd5b803567ffffffffffffffff8111156121f7576121f7612150565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561222657612226612150565b6040528181528282016020018b101561223d575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b5f6020828403121561226f575f5ffd5b813560ff8116811461184e575f5ffd5b5f5f60208385031215612290575f5ffd5b823567ffffffffffffffff8111156122a6575f5ffd5b8301601f810185136122b6575f5ffd5b803567ffffffffffffffff8111156122cc575f5ffd5b8560208260051b84010111156122e0575f5ffd5b6020919091019590945092505050565b5f8151808452602084019350602083015f5b828110156123295781516001600160a01b0316865260209586019590910190600101612302565b5093949350505050565b604081525f61234560408301856122f0565b82810360208401528084518083526020830191506020860192505f5b8181101561237f578351835260209384019390920191600101612361565b50909695505050505050565b5f5f5f5f5f5f60c087890312156123a0575f5ffd5b86356123ab81612095565b955060208701356123bb81612095565b945060408701356123cb81612095565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f604083850312156123fd575f5ffd5b823561240881612095565b946020939093013593505050565b602081525f61184e60208301846122f0565b5f5f60408385031215612439575f5ffd5b823561244481612095565b9150602083013561245481612095565b809150509250929050565b5f6020828403121561246f575f5ffd5b8151801515811461184e575f5ffd5b5f6020828403121561248e575f5ffd5b815161184e81612095565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156124d4576124d46124ad565b92915050565b5f602082840312156124ea575f5ffd5b5051919050565b818103818111156124d4576124d46124ad565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f611f12604083018461252c565b5f82518060208501845e5f920191825250919050565b602081525f61184e602083018461252c56fea2646970667358221220e6c8f87f676443985d75c469c68bfdb167c9e8f11afa84cb6476ed80f5e7836664736f6c634300081b0033",
+ 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\":\"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\":\"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\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"increaseBurnableShares\",\"inputs\":[{\"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\":\"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\":\"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\":\"renounceOwnership\",\"inputs\":[],\"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\":\"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\":\"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\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"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\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
+ Bin: "0x60e060405234801561000f575f5ffd5b50604051612ef9380380612ef983398101604081905261002e916101b3565b808084846001600160a01b038116610059576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0526100748161008a565b60c0525061008290506100d0565b5050506102e4565b5f5f829050601f815111156100bd578260405163305a27a960e01b81526004016100b49190610289565b60405180910390fd5b80516100c8826102be565b179392505050565b5f54610100900460ff16156101375760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100b4565b5f5460ff90811614610186575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461019c575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101c5575f5ffd5b83516101d081610188565b60208501519093506101e181610188565b60408501519092506001600160401b038111156101fc575f5ffd5b8401601f8101861361020c575f5ffd5b80516001600160401b038111156102255761022561019f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102535761025361019f565b60405281815282820160200188101561026a575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102de575f198160200360031b1b821691505b50919050565b60805160a05160c051612bac61034d5f395f8181610bb90152611c8101525f81816104e70152818161079701528181610b4b01528181610e010152818161128d015261189d01525f81816103bc015281816105a601528181610bf701526114c90152612bac5ff3fe608060405234801561000f575f5ffd5b5060043610610213575f3560e01c80638b8aac3c1161011f578063debe1eab116100a9578063f3b4a00011610079578063f3b4a0001461052f578063f698da2514610539578063fabc1cbc14610541578063fd98042314610554578063fe243a1714610567575f5ffd5b8063debe1eab146104cf578063df5cf723146104e2578063e7a050aa14610509578063f2fde38b1461051c575f5ffd5b80639ac01d61116100ef5780639ac01d6114610463578063b5d8b5b814610476578063c665670214610489578063cbc2bd621461049c578063de44acb6146104af575f5ffd5b80638b8aac3c146103f65780638da5cb5b1461041e57806394f649dd1461042f578063967fc0d214610450575f5ffd5b8063595c6a67116101a0578063663c1de411610170578063663c1de41461035b578063715018a61461037d578063724af423146103855780637ecebe0014610398578063886f1195146103b7575f5ffd5b8063595c6a67146103055780635ac86ab71461030d5780635c975abb146103405780635de08ff214610348575f5ffd5b806336a8c500116101e657806336a8c5001461027857806348825e941461028e5780634b6d5d6e146102b557806350ff7225146102c857806354fd4d50146102f0575f5ffd5b8063136439dd146102175780631794bb3c1461022c5780632eae418c1461023f57806332e89ace14610252575b5f5ffd5b61022a6102253660046125e1565b610591565b005b61022a61023a36600461260c565b610666565b61022a61024d36600461264a565b61078c565b6102656102603660046126ac565b610844565b6040519081526020015b60405180910390f35b6102806108e8565b60405161026f9291906127e1565b6102657f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61022a6102c3366004612837565b610a05565b6102db6102d636600461260c565b610b3e565b6040805192835260208301919091520161026f565b6102f8610bb2565b60405161026f9190612880565b61022a610be2565b61033061031b366004612892565b609854600160ff9092169190911b9081161490565b604051901515815260200161026f565b609854610265565b61022a6103563660046128b2565b610c91565b610330610369366004612837565b60d16020525f908152604090205460ff1681565b61022a610de4565b61026561039336600461260c565b610df5565b6102656103a6366004612837565b60ca6020525f908152604090205481565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161026f565b610265610404366004612837565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b03166103de565b61044261043d366004612837565b610e68565b60405161026f92919061295c565b60cb546103de906001600160a01b031681565b610265610471366004612989565b610fe0565b61022a6104843660046128b2565b611071565b61022a610497366004612837565b6111b8565b6103de6104aa3660046129ea565b6111db565b6104c26104bd366004612837565b61120f565b60405161026f9190612a14565b61022a6104dd3660046129ea565b611282565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b61026561051736600461260c565b611346565b61022a61052a366004612837565b611398565b6103de620e16e481565b61026561140e565b61022a61054f3660046125e1565b6114c7565b610265610562366004612837565b6115dd565b610265610575366004612a26565b60cd60209081525f928352604080842090915290825290205481565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156105f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106179190612a5d565b61063457604051631d77d47760e21b815260040160405180910390fd5b60985481811681146106595760405163c61dca5d60e01b815260040160405180910390fd5b610662826115f2565b5050565b5f54610100900460ff161580801561068457505f54600160ff909116105b8061069d5750303b15801561069d57505f5460ff166001145b6107055760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015610726575f805461ff0019166101001790555b61072f826115f2565b6107388461162f565b61074183611680565b8015610786575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107d55760405163f739589b60e01b815260040160405180910390fd5b6107dd6116e9565b604051636ce5768960e11b81526001600160a01b0384169063d9caed129061080d90879086908690600401612a7c565b5f604051808303815f87803b158015610824575f5ffd5b505af1158015610836573d5f5f3e3d5ffd5b505050506107866001606555565b6098545f90819060019081160361086e5760405163840a48d560e01b815260040160405180910390fd5b6108766116e9565b6001600160a01b0385165f90815260ca60205260409020546108a7866108a0818c8c8c878c610fe0565b8688611742565b6001600160a01b0386165f90815260ca602052604090206001820190556108d0868a8a8a611794565b9250506108dd6001606555565b509695505050505050565b6060805f6108f660d4611901565b90505f8167ffffffffffffffff81111561091257610912612698565b60405190808252806020026020018201604052801561093b578160200160208202803683370190505b5090505f8267ffffffffffffffff81111561095857610958612698565b604051908082528060200260200182016040528015610981578160200160208202803683370190505b5090505f5b838110156109fa575f5f61099b60d484611911565b91509150818584815181106109b2576109b2612aa0565b60200260200101906001600160a01b031690816001600160a01b031681525050808484815181106109e5576109e5612aa0565b60209081029190910101525050600101610986565b509094909350915050565b610a0d6116e9565b5f610a1960d48361192e565b915050610a2760d483611945565b50604080516001600160a01b0384168152602081018390527fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a18015610b3057816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610abf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ae39190612ab4565b846040518463ffffffff1660e01b8152600401610b0293929190612a7c565b5f604051808303815f87803b158015610b19575f5ffd5b505af1158015610b2b573d5f5f3e3d5ffd5b505050505b50610b3b6001606555565b50565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b895760405163f739589b60e01b815260040160405180910390fd5b610b916116e9565b610b9c858585611959565b91509150610baa6001606555565b935093915050565b6060610bdd7f0000000000000000000000000000000000000000000000000000000000000000611ac1565b905090565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610c44573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c689190612a5d565b610c8557604051631d77d47760e21b815260040160405180910390fd5b610c8f5f196115f2565b565b60cb546001600160a01b03163314610cbc576040516320ba3ff960e21b815260040160405180910390fd5b610cc46116e9565b805f5b81811015610dd85760d15f858584818110610ce457610ce4612aa0565b9050602002016020810190610cf99190612837565b6001600160a01b0316815260208101919091526040015f205460ff16610dd057600160d15f868685818110610d3057610d30612aa0565b9050602002016020810190610d459190612837565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610d9f57610d9f612aa0565b9050602002016020810190610db49190612837565b6040516001600160a01b03909116815260200160405180910390a15b600101610cc7565b50506106626001606555565b610dec611afe565b610c8f5f61162f565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e3f5760405163f739589b60e01b815260040160405180910390fd5b610e476116e9565b5f610e53858585611b58565b92505050610e616001606555565b9392505050565b6001600160a01b0381165f90815260ce60205260408120546060918291908167ffffffffffffffff811115610e9f57610e9f612698565b604051908082528060200260200182016040528015610ec8578160200160208202803683370190505b5090505f5b82811015610f56576001600160a01b0386165f90815260cd6020908152604080832060ce9092528220805491929184908110610f0b57610f0b612aa0565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610f4357610f43612aa0565b6020908102919091010152600101610ecd565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f208181805480602002602001604051908101604052809291908181526020018280548015610fce57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610fb0575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f90611066906101000160405160208183030381529060405280519060200120611c1e565b979650505050505050565b60cb546001600160a01b0316331461109c576040516320ba3ff960e21b815260040160405180910390fd5b6110a46116e9565b805f5b81811015610dd85760d15f8585848181106110c4576110c4612aa0565b90506020020160208101906110d99190612837565b6001600160a01b0316815260208101919091526040015f205460ff16156111b0575f60d15f86868581811061111057611110612aa0565b90506020020160208101906111259190612837565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba03084848381811061117f5761117f612aa0565b90506020020160208101906111949190612837565b6040516001600160a01b03909116815260200160405180910390a15b6001016110a7565b6111c0611afe565b6111c86116e9565b6111d181611680565b610b3b6001606555565b60ce602052815f5260405f2081815481106111f4575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce602090815260409182902080548351818402810184019094528084526060939283018282801561127657602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611258575b50505050509050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112cb5760405163f739589b60e01b815260040160405180910390fd5b6112d36116e9565b5f6112df60d48461192e565b91506112f8905060d4846112f38585612ae3565b611c64565b50604080516001600160a01b0385168152602081018490527fca3e02a4ab7ad3c47a8e36e5a624c30170791726ab720f1babfef21046d953ff910160405180910390a1506106626001606555565b6098545f9081906001908116036113705760405163840a48d560e01b815260040160405180910390fd5b6113786116e9565b61138433868686611794565b91506113906001606555565b509392505050565b6113a0611afe565b6001600160a01b0381166114055760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106fc565b610b3b8161162f565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea61147b611c79565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611523573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115479190612ab4565b6001600160a01b0316336001600160a01b0316146115785760405163794821ff60e01b815260040160405180910390fd5b6098548019821981161461159f5760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f5f6115ea60d48461192e565b949350505050565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b60026065540361173b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106fc565b6002606555565b4281101561176357604051630819bdcd60e01b815260040160405180910390fd5b6117776001600160a01b0385168484611d15565b61078657604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff166117ce57604051632efd965160e11b815260040160405180910390fd5b6117e36001600160a01b038516338786611d73565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af115801561182f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118539190612af6565b91505f5f611862888886611959565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b1580156118e0575f5ffd5b505af11580156118f2573d5f5f3e3d5ffd5b50505050505050949350505050565b5f61190b82611dcb565b92915050565b5f80808061191f8686611dd5565b909450925050505b9250929050565b5f80808061191f866001600160a01b038716611dfe565b5f610e61836001600160a01b038416611e36565b5f806001600160a01b038516611982576040516316f2ccc960e01b815260040160405180910390fd5b825f036119a2576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038086165f90815260cd6020908152604080832093881683529290529081205490819003611a48576001600160a01b0386165f90815260ce602090815260409091205410611a0a576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038681165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b611a528482612ae3565b6001600160a01b038088165f90815260cd60209081526040808320938a16835292905281902091909155517f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6290611aae90889088908890612a7c565b60405180910390a1959294509192505050565b60605f611acd83611e52565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6033546001600160a01b03163314610c8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106fc565b5f5f825f03611b7a576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038086165f90815260cd602090815260408083209388168352929052205480841115611bc057604051634b18b19360e01b815260040160405180910390fd5b611bca8482612b0d565b6001600160a01b038088165f90815260cd60209081526040808320938a168352929052908120829055909150819003611c1257611c078686611e79565b600192509050610baa565b5f969095509350505050565b5f611c2761140e565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f6115ea846001600160a01b03851684611ff7565b60605f611ca57f0000000000000000000000000000000000000000000000000000000000000000611ac1565b9050805f81518110611cb957611cb9612aa0565b602001015160f81c60f81b81600181518110611cd757611cd7612aa0565b016020908101516040516001600160f81b03199384169281019290925291909116602182015260220160405160208183030381529060405291505090565b5f5f5f611d228585612013565b90925090505f816004811115611d3a57611d3a612b20565b148015611d585750856001600160a01b0316826001600160a01b0316145b80611d695750611d69868686612052565b9695505050505050565b610786846323b872dd60e01b858585604051602401611d9493929190612a7c565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612139565b5f61190b82612211565b5f8080611de2858561221a565b5f81815260029690960160205260409095205494959350505050565b5f818152600283016020526040812054819080611e2b57611e1f8585612225565b92505f91506119279050565b600192509050611927565b5f8181526002830160205260408120819055610e618383612230565b5f60ff8216601f81111561190b57604051632cd44ac360e21b815260040160405180910390fd5b6001600160a01b0382165f90815260ce6020526040812054905b81811015611f8b576001600160a01b038481165f90815260ce6020526040902080549185169183908110611ec957611ec9612aa0565b5f918252602090912001546001600160a01b031603611f83576001600160a01b0384165f90815260ce602052604090208054611f0790600190612b0d565b81548110611f1757611f17612aa0565b5f9182526020808320909101546001600160a01b03878116845260ce9092526040909220805491909216919083908110611f5357611f53612aa0565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550611f8b565b600101611e93565b818103611fab57604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce60205260409020805480611fd157611fd1612b34565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b5f82815260028401602052604081208290556115ea848461223b565b5f5f8251604103612047576020830151604084015160608501515f1a61203b87828585612246565b94509450505050611927565b505f90506002611927565b5f5f5f856001600160a01b0316631626ba7e60e01b868660405160240161207a929190612b48565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516120b89190612b60565b5f60405180830381855afa9150503d805f81146120f0576040519150601f19603f3d011682016040523d82523d5f602084013e6120f5565b606091505b509150915081801561210957506020815110155b8015611d6957508051630b135d3f60e11b9061212e9083016020908101908401612af6565b149695505050505050565b5f61218d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123039092919063ffffffff16565b905080515f14806121ad5750808060200190518101906121ad9190612a5d565b61220c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106fc565b505050565b5f61190b825490565b5f610e618383612311565b5f610e618383612337565b5f610e61838361234e565b5f610e618383612431565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561227b57505f905060036122fa565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156122cc573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122f4575f600192509250506122fa565b91505f90505b94509492505050565b60606115ea84845f8561247d565b5f825f01828154811061232657612326612aa0565b905f5260205f200154905092915050565b5f8181526001830160205260408120541515610e61565b5f8181526001830160205260408120548015612428575f612370600183612b0d565b85549091505f9061238390600190612b0d565b90508181146123e2575f865f0182815481106123a1576123a1612aa0565b905f5260205f200154905080875f0184815481106123c1576123c1612aa0565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806123f3576123f3612b34565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061190b565b5f91505061190b565b5f81815260018301602052604081205461247657508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561190b565b505f61190b565b6060824710156124de5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106fc565b5f5f866001600160a01b031685876040516124f99190612b60565b5f6040518083038185875af1925050503d805f8114612533576040519150601f19603f3d011682016040523d82523d5f602084013e612538565b606091505b509150915061106687838387606083156125b25782515f036125ab576001600160a01b0385163b6125ab5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106fc565b50816115ea565b6115ea83838151156125c75781518083602001fd5b8060405162461bcd60e51b81526004016106fc9190612880565b5f602082840312156125f1575f5ffd5b5035919050565b6001600160a01b0381168114610b3b575f5ffd5b5f5f5f6060848603121561261e575f5ffd5b8335612629816125f8565b92506020840135612639816125f8565b929592945050506040919091013590565b5f5f5f5f6080858703121561265d575f5ffd5b8435612668816125f8565b93506020850135612678816125f8565b92506040850135612688816125f8565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f60c087890312156126c1575f5ffd5b86356126cc816125f8565b955060208701356126dc816125f8565b94506040870135935060608701356126f3816125f8565b92506080870135915060a087013567ffffffffffffffff811115612715575f5ffd5b8701601f81018913612725575f5ffd5b803567ffffffffffffffff81111561273f5761273f612698565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561276e5761276e612698565b6040528181528282016020018b1015612785575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b5f8151808452602084019350602083015f5b828110156127d75781518652602095860195909101906001016127b9565b5093949350505050565b604080825283519082018190525f9060208501906060840190835b818110156128235783516001600160a01b03168352602093840193909201916001016127fc565b50508381036020850152611d6981866127a7565b5f60208284031215612847575f5ffd5b8135610e61816125f8565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610e616020830184612852565b5f602082840312156128a2575f5ffd5b813560ff81168114610e61575f5ffd5b5f5f602083850312156128c3575f5ffd5b823567ffffffffffffffff8111156128d9575f5ffd5b8301601f810185136128e9575f5ffd5b803567ffffffffffffffff8111156128ff575f5ffd5b8560208260051b8401011115612913575f5ffd5b6020919091019590945092505050565b5f8151808452602084019350602083015f5b828110156127d75781516001600160a01b0316865260209586019590910190600101612935565b604081525f61296e6040830185612923565b828103602084015261298081856127a7565b95945050505050565b5f5f5f5f5f5f60c0878903121561299e575f5ffd5b86356129a9816125f8565b955060208701356129b9816125f8565b945060408701356129c9816125f8565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f604083850312156129fb575f5ffd5b8235612a06816125f8565b946020939093013593505050565b602081525f610e616020830184612923565b5f5f60408385031215612a37575f5ffd5b8235612a42816125f8565b91506020830135612a52816125f8565b809150509250929050565b5f60208284031215612a6d575f5ffd5b81518015158114610e61575f5ffd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612ac4575f5ffd5b8151610e61816125f8565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561190b5761190b612acf565b5f60208284031215612b06575f5ffd5b5051919050565b8181038181111561190b5761190b612acf565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f6115ea6040830184612852565b5f82518060208501845e5f92019182525091905056fea264697066735822122003a34637d86af683ccd50d40decbaad473ae7ff87817b15b72e3bbf9b7f67c7e64736f6c634300081b0033",
}
// StrategyManagerABI is the input ABI used to generate the binding from.
@@ -44,7 +44,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, _pauserRegistry common.Address) (common.Address, *types.Transaction, *StrategyManager, error) {
+func DeployStrategyManager(auth *bind.TransactOpts, backend bind.ContractBackend, _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
@@ -53,7 +53,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, _pauserRegistry)
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(StrategyManagerBin), backend, _delegation, _pauserRegistry, _version)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -264,37 +264,6 @@ func (_StrategyManager *StrategyManagerCallerSession) DEPOSITTYPEHASH() ([32]byt
return _StrategyManager.Contract.DEPOSITTYPEHASH(&_StrategyManager.CallOpts)
}
-// BurnableShares is a free data retrieval call binding the contract method 0x1b3cbdc1.
-//
-// Solidity: function burnableShares(address strategy) view returns(uint256)
-func (_StrategyManager *StrategyManagerCaller) BurnableShares(opts *bind.CallOpts, strategy common.Address) (*big.Int, error) {
- var out []interface{}
- err := _StrategyManager.contract.Call(opts, &out, "burnableShares", strategy)
-
- if err != nil {
- return *new(*big.Int), err
- }
-
- out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
- return out0, err
-
-}
-
-// BurnableShares is a free data retrieval call binding the contract method 0x1b3cbdc1.
-//
-// Solidity: function burnableShares(address strategy) view returns(uint256)
-func (_StrategyManager *StrategyManagerSession) BurnableShares(strategy common.Address) (*big.Int, error) {
- return _StrategyManager.Contract.BurnableShares(&_StrategyManager.CallOpts, strategy)
-}
-
-// BurnableShares is a free data retrieval call binding the contract method 0x1b3cbdc1.
-//
-// Solidity: function burnableShares(address strategy) view returns(uint256)
-func (_StrategyManager *StrategyManagerCallerSession) BurnableShares(strategy common.Address) (*big.Int, error) {
- return _StrategyManager.Contract.BurnableShares(&_StrategyManager.CallOpts, strategy)
-}
-
// 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)
@@ -388,6 +357,37 @@ func (_StrategyManager *StrategyManagerCallerSession) DomainSeparator() ([32]byt
return _StrategyManager.Contract.DomainSeparator(&_StrategyManager.CallOpts)
}
+// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423.
+//
+// Solidity: function getBurnableShares(address strategy) view returns(uint256)
+func (_StrategyManager *StrategyManagerCaller) GetBurnableShares(opts *bind.CallOpts, strategy common.Address) (*big.Int, error) {
+ var out []interface{}
+ err := _StrategyManager.contract.Call(opts, &out, "getBurnableShares", strategy)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423.
+//
+// Solidity: function getBurnableShares(address strategy) view returns(uint256)
+func (_StrategyManager *StrategyManagerSession) GetBurnableShares(strategy common.Address) (*big.Int, error) {
+ return _StrategyManager.Contract.GetBurnableShares(&_StrategyManager.CallOpts, strategy)
+}
+
+// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423.
+//
+// Solidity: function getBurnableShares(address strategy) view returns(uint256)
+func (_StrategyManager *StrategyManagerCallerSession) GetBurnableShares(strategy common.Address) (*big.Int, error) {
+ return _StrategyManager.Contract.GetBurnableShares(&_StrategyManager.CallOpts, strategy)
+}
+
// GetDeposits is a free data retrieval call binding the contract method 0x94f649dd.
//
// Solidity: function getDeposits(address staker) view returns(address[], uint256[])
@@ -451,6 +451,38 @@ func (_StrategyManager *StrategyManagerCallerSession) GetStakerStrategyList(stak
return _StrategyManager.Contract.GetStakerStrategyList(&_StrategyManager.CallOpts, staker)
}
+// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500.
+//
+// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[])
+func (_StrategyManager *StrategyManagerCaller) GetStrategiesWithBurnableShares(opts *bind.CallOpts) ([]common.Address, []*big.Int, error) {
+ var out []interface{}
+ err := _StrategyManager.contract.Call(opts, &out, "getStrategiesWithBurnableShares")
+
+ if err != nil {
+ return *new([]common.Address), *new([]*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)
+ out1 := *abi.ConvertType(out[1], new([]*big.Int)).(*[]*big.Int)
+
+ return out0, out1, err
+
+}
+
+// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500.
+//
+// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[])
+func (_StrategyManager *StrategyManagerSession) GetStrategiesWithBurnableShares() ([]common.Address, []*big.Int, error) {
+ return _StrategyManager.Contract.GetStrategiesWithBurnableShares(&_StrategyManager.CallOpts)
+}
+
+// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500.
+//
+// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[])
+func (_StrategyManager *StrategyManagerCallerSession) GetStrategiesWithBurnableShares() ([]common.Address, []*big.Int, error) {
+ return _StrategyManager.Contract.GetStrategiesWithBurnableShares(&_StrategyManager.CallOpts)
+}
+
// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
//
// Solidity: function nonces(address signer) view returns(uint256 nonce)
@@ -761,25 +793,56 @@ func (_StrategyManager *StrategyManagerCallerSession) StrategyWhitelister() (com
return _StrategyManager.Contract.StrategyWhitelister(&_StrategyManager.CallOpts)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyManager *StrategyManagerCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _StrategyManager.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyManager *StrategyManagerSession) Version() (string, error) {
+ return _StrategyManager.Contract.Version(&_StrategyManager.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyManager *StrategyManagerCallerSession) Version() (string, error) {
+ return _StrategyManager.Contract.Version(&_StrategyManager.CallOpts)
+}
+
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_StrategyManager *StrategyManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _StrategyManager.contract.Transact(opts, "addShares", staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_StrategyManager *StrategyManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _StrategyManager.contract.Transact(opts, "addShares", staker, strategy, shares)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_StrategyManager *StrategyManagerSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _StrategyManager.Contract.AddShares(&_StrategyManager.TransactOpts, staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_StrategyManager *StrategyManagerSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _StrategyManager.Contract.AddShares(&_StrategyManager.TransactOpts, staker, strategy, shares)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_StrategyManager *StrategyManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _StrategyManager.Contract.AddShares(&_StrategyManager.TransactOpts, staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_StrategyManager *StrategyManagerTransactorSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _StrategyManager.Contract.AddShares(&_StrategyManager.TransactOpts, staker, strategy, shares)
}
// AddStrategiesToDepositWhitelist is a paid mutator transaction binding the contract method 0x5de08ff2.
@@ -952,21 +1015,21 @@ func (_StrategyManager *StrategyManagerTransactorSession) PauseAll() (*types.Tra
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_StrategyManager *StrategyManagerTransactor) RemoveDepositShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _StrategyManager.contract.Transact(opts, "removeDepositShares", staker, strategy, depositSharesToRemove)
}
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_StrategyManager *StrategyManagerSession) RemoveDepositShares(staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _StrategyManager.Contract.RemoveDepositShares(&_StrategyManager.TransactOpts, staker, strategy, depositSharesToRemove)
}
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_StrategyManager *StrategyManagerTransactorSession) RemoveDepositShares(staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _StrategyManager.Contract.RemoveDepositShares(&_StrategyManager.TransactOpts, staker, strategy, depositSharesToRemove)
}
@@ -1437,15 +1500,14 @@ func (it *StrategyManagerDepositIterator) Close() error {
// StrategyManagerDeposit represents a Deposit event raised by the StrategyManager contract.
type StrategyManagerDeposit struct {
Staker common.Address
- Token common.Address
Strategy common.Address
Shares *big.Int
Raw types.Log // Blockchain specific contextual infos
}
-// FilterDeposit is a free log retrieval operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96.
+// FilterDeposit is a free log retrieval operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
//
-// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares)
+// Solidity: event Deposit(address staker, address strategy, uint256 shares)
func (_StrategyManager *StrategyManagerFilterer) FilterDeposit(opts *bind.FilterOpts) (*StrategyManagerDepositIterator, error) {
logs, sub, err := _StrategyManager.contract.FilterLogs(opts, "Deposit")
@@ -1455,9 +1517,9 @@ func (_StrategyManager *StrategyManagerFilterer) FilterDeposit(opts *bind.Filter
return &StrategyManagerDepositIterator{contract: _StrategyManager.contract, event: "Deposit", logs: logs, sub: sub}, nil
}
-// WatchDeposit is a free log subscription operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96.
+// WatchDeposit is a free log subscription operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
//
-// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares)
+// Solidity: event Deposit(address staker, address strategy, uint256 shares)
func (_StrategyManager *StrategyManagerFilterer) WatchDeposit(opts *bind.WatchOpts, sink chan<- *StrategyManagerDeposit) (event.Subscription, error) {
logs, sub, err := _StrategyManager.contract.WatchLogs(opts, "Deposit")
@@ -1492,9 +1554,9 @@ func (_StrategyManager *StrategyManagerFilterer) WatchDeposit(opts *bind.WatchOp
}), nil
}
-// ParseDeposit is a log parse operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96.
+// ParseDeposit is a log parse operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
//
-// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares)
+// Solidity: event Deposit(address staker, address strategy, uint256 shares)
func (_StrategyManager *StrategyManagerFilterer) ParseDeposit(log types.Log) (*StrategyManagerDeposit, error) {
event := new(StrategyManagerDeposit)
if err := _StrategyManager.contract.UnpackLog(event, "Deposit", log); err != nil {
diff --git a/pkg/bindings/StrategyManagerStorage/binding.go b/pkg/bindings/StrategyManagerStorage/binding.go
index b7d1f40902..30a5d21e71 100644
--- a/pkg/bindings/StrategyManagerStorage/binding.go
+++ b/pkg/bindings/StrategyManagerStorage/binding.go
@@ -31,7 +31,7 @@ var (
// 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\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"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\":\"burnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"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\":\"increaseBurnableShares\",\"inputs\":[{\"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\":[],\"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\":\"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\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"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\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":\"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\":\"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\":\"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\":\"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\":\"increaseBurnableShares\",\"inputs\":[{\"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\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesIncreased\",\"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\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]",
}
// StrategyManagerStorageABI is the input ABI used to generate the binding from.
@@ -242,37 +242,6 @@ func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) DEPOSITTYPEH
return _StrategyManagerStorage.Contract.DEPOSITTYPEHASH(&_StrategyManagerStorage.CallOpts)
}
-// BurnableShares is a free data retrieval call binding the contract method 0x1b3cbdc1.
-//
-// Solidity: function burnableShares(address strategy) view returns(uint256)
-func (_StrategyManagerStorage *StrategyManagerStorageCaller) BurnableShares(opts *bind.CallOpts, strategy common.Address) (*big.Int, error) {
- var out []interface{}
- err := _StrategyManagerStorage.contract.Call(opts, &out, "burnableShares", strategy)
-
- if err != nil {
- return *new(*big.Int), err
- }
-
- out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
- return out0, err
-
-}
-
-// BurnableShares is a free data retrieval call binding the contract method 0x1b3cbdc1.
-//
-// Solidity: function burnableShares(address strategy) view returns(uint256)
-func (_StrategyManagerStorage *StrategyManagerStorageSession) BurnableShares(strategy common.Address) (*big.Int, error) {
- return _StrategyManagerStorage.Contract.BurnableShares(&_StrategyManagerStorage.CallOpts, strategy)
-}
-
-// BurnableShares is a free data retrieval call binding the contract method 0x1b3cbdc1.
-//
-// Solidity: function burnableShares(address strategy) view returns(uint256)
-func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) BurnableShares(strategy common.Address) (*big.Int, error) {
- return _StrategyManagerStorage.Contract.BurnableShares(&_StrategyManagerStorage.CallOpts, strategy)
-}
-
// 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)
@@ -335,6 +304,37 @@ func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) Delegation()
return _StrategyManagerStorage.Contract.Delegation(&_StrategyManagerStorage.CallOpts)
}
+// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423.
+//
+// Solidity: function getBurnableShares(address strategy) view returns(uint256)
+func (_StrategyManagerStorage *StrategyManagerStorageCaller) GetBurnableShares(opts *bind.CallOpts, strategy common.Address) (*big.Int, error) {
+ var out []interface{}
+ err := _StrategyManagerStorage.contract.Call(opts, &out, "getBurnableShares", strategy)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423.
+//
+// Solidity: function getBurnableShares(address strategy) view returns(uint256)
+func (_StrategyManagerStorage *StrategyManagerStorageSession) GetBurnableShares(strategy common.Address) (*big.Int, error) {
+ return _StrategyManagerStorage.Contract.GetBurnableShares(&_StrategyManagerStorage.CallOpts, strategy)
+}
+
+// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423.
+//
+// Solidity: function getBurnableShares(address strategy) view returns(uint256)
+func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) GetBurnableShares(strategy common.Address) (*big.Int, error) {
+ return _StrategyManagerStorage.Contract.GetBurnableShares(&_StrategyManagerStorage.CallOpts, strategy)
+}
+
// GetDeposits is a free data retrieval call binding the contract method 0x94f649dd.
//
// Solidity: function getDeposits(address staker) view returns(address[], uint256[])
@@ -398,6 +398,38 @@ func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) GetStakerStr
return _StrategyManagerStorage.Contract.GetStakerStrategyList(&_StrategyManagerStorage.CallOpts, staker)
}
+// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500.
+//
+// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[])
+func (_StrategyManagerStorage *StrategyManagerStorageCaller) GetStrategiesWithBurnableShares(opts *bind.CallOpts) ([]common.Address, []*big.Int, error) {
+ var out []interface{}
+ err := _StrategyManagerStorage.contract.Call(opts, &out, "getStrategiesWithBurnableShares")
+
+ if err != nil {
+ return *new([]common.Address), *new([]*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)
+ out1 := *abi.ConvertType(out[1], new([]*big.Int)).(*[]*big.Int)
+
+ return out0, out1, err
+
+}
+
+// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500.
+//
+// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[])
+func (_StrategyManagerStorage *StrategyManagerStorageSession) GetStrategiesWithBurnableShares() ([]common.Address, []*big.Int, error) {
+ return _StrategyManagerStorage.Contract.GetStrategiesWithBurnableShares(&_StrategyManagerStorage.CallOpts)
+}
+
+// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500.
+//
+// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[])
+func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) GetStrategiesWithBurnableShares() ([]common.Address, []*big.Int, error) {
+ return _StrategyManagerStorage.Contract.GetStrategiesWithBurnableShares(&_StrategyManagerStorage.CallOpts)
+}
+
// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
//
// Solidity: function nonces(address signer) view returns(uint256 nonce)
@@ -584,25 +616,56 @@ func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) StrategyWhit
return _StrategyManagerStorage.Contract.StrategyWhitelister(&_StrategyManagerStorage.CallOpts)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyManagerStorage *StrategyManagerStorageCaller) Version(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _StrategyManagerStorage.contract.Call(opts, &out, "version")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyManagerStorage *StrategyManagerStorageSession) Version() (string, error) {
+ return _StrategyManagerStorage.Contract.Version(&_StrategyManagerStorage.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) Version() (string, error) {
+ return _StrategyManagerStorage.Contract.Version(&_StrategyManagerStorage.CallOpts)
+}
+
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_StrategyManagerStorage *StrategyManagerStorageTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _StrategyManagerStorage.contract.Transact(opts, "addShares", staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_StrategyManagerStorage *StrategyManagerStorageTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _StrategyManagerStorage.contract.Transact(opts, "addShares", staker, strategy, shares)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_StrategyManagerStorage *StrategyManagerStorageSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _StrategyManagerStorage.Contract.AddShares(&_StrategyManagerStorage.TransactOpts, staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_StrategyManagerStorage *StrategyManagerStorageSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _StrategyManagerStorage.Contract.AddShares(&_StrategyManagerStorage.TransactOpts, staker, strategy, shares)
}
-// AddShares is a paid mutator transaction binding the contract method 0xc4623ea1.
+// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
//
-// Solidity: function addShares(address staker, address strategy, address token, uint256 shares) returns(uint256, uint256)
-func (_StrategyManagerStorage *StrategyManagerStorageTransactorSession) AddShares(staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error) {
- return _StrategyManagerStorage.Contract.AddShares(&_StrategyManagerStorage.TransactOpts, staker, strategy, token, shares)
+// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
+func (_StrategyManagerStorage *StrategyManagerStorageTransactorSession) AddShares(staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _StrategyManagerStorage.Contract.AddShares(&_StrategyManagerStorage.TransactOpts, staker, strategy, shares)
}
// AddStrategiesToDepositWhitelist is a paid mutator transaction binding the contract method 0x5de08ff2.
@@ -733,21 +796,21 @@ func (_StrategyManagerStorage *StrategyManagerStorageTransactorSession) Initiali
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_StrategyManagerStorage *StrategyManagerStorageTransactor) RemoveDepositShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _StrategyManagerStorage.contract.Transact(opts, "removeDepositShares", staker, strategy, depositSharesToRemove)
}
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_StrategyManagerStorage *StrategyManagerStorageSession) RemoveDepositShares(staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _StrategyManagerStorage.Contract.RemoveDepositShares(&_StrategyManagerStorage.TransactOpts, staker, strategy, depositSharesToRemove)
}
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
//
-// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns()
+// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_StrategyManagerStorage *StrategyManagerStorageTransactorSession) RemoveDepositShares(staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error) {
return _StrategyManagerStorage.Contract.RemoveDepositShares(&_StrategyManagerStorage.TransactOpts, staker, strategy, depositSharesToRemove)
}
@@ -1155,15 +1218,14 @@ func (it *StrategyManagerStorageDepositIterator) Close() error {
// StrategyManagerStorageDeposit represents a Deposit event raised by the StrategyManagerStorage contract.
type StrategyManagerStorageDeposit struct {
Staker common.Address
- Token common.Address
Strategy common.Address
Shares *big.Int
Raw types.Log // Blockchain specific contextual infos
}
-// FilterDeposit is a free log retrieval operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96.
+// FilterDeposit is a free log retrieval operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
//
-// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares)
+// Solidity: event Deposit(address staker, address strategy, uint256 shares)
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) FilterDeposit(opts *bind.FilterOpts) (*StrategyManagerStorageDepositIterator, error) {
logs, sub, err := _StrategyManagerStorage.contract.FilterLogs(opts, "Deposit")
@@ -1173,9 +1235,9 @@ func (_StrategyManagerStorage *StrategyManagerStorageFilterer) FilterDeposit(opt
return &StrategyManagerStorageDepositIterator{contract: _StrategyManagerStorage.contract, event: "Deposit", logs: logs, sub: sub}, nil
}
-// WatchDeposit is a free log subscription operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96.
+// WatchDeposit is a free log subscription operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
//
-// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares)
+// Solidity: event Deposit(address staker, address strategy, uint256 shares)
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) WatchDeposit(opts *bind.WatchOpts, sink chan<- *StrategyManagerStorageDeposit) (event.Subscription, error) {
logs, sub, err := _StrategyManagerStorage.contract.WatchLogs(opts, "Deposit")
@@ -1210,9 +1272,9 @@ func (_StrategyManagerStorage *StrategyManagerStorageFilterer) WatchDeposit(opts
}), nil
}
-// ParseDeposit is a log parse operation binding the contract event 0x7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96.
+// ParseDeposit is a log parse operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
//
-// Solidity: event Deposit(address staker, address token, address strategy, uint256 shares)
+// Solidity: event Deposit(address staker, address strategy, uint256 shares)
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) ParseDeposit(log types.Log) (*StrategyManagerStorageDeposit, error) {
event := new(StrategyManagerStorageDeposit)
if err := _StrategyManagerStorage.contract.UnpackLog(event, "Deposit", log); err != nil {
diff --git a/script/configs/devnet/deploy_from_scratch.anvil.config.json b/script/configs/devnet/deploy_from_scratch.anvil.config.json
index 96df127e1f..6d8b5fef76 100644
--- a/script/configs/devnet/deploy_from_scratch.anvil.config.json
+++ b/script/configs/devnet/deploy_from_scratch.anvil.config.json
@@ -51,5 +51,6 @@
"OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000,
"OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000
},
- "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa"
+ "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa",
+ "semver": "v1.0.3"
}
\ No newline at end of file
diff --git a/script/configs/devnet/deploy_from_scratch.holesky.config.json b/script/configs/devnet/deploy_from_scratch.holesky.config.json
index 3dc1f204d5..054a432868 100644
--- a/script/configs/devnet/deploy_from_scratch.holesky.config.json
+++ b/script/configs/devnet/deploy_from_scratch.holesky.config.json
@@ -51,5 +51,6 @@
"OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000,
"OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000
},
- "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa"
-}
\ No newline at end of file
+ "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa",
+ "semver": "v0.0.0"
+}
diff --git a/script/configs/devnet/deploy_from_scratch.holesky.slashing.config.json b/script/configs/devnet/deploy_from_scratch.holesky.slashing.config.json
index bcd808f715..99d3c54cbe 100644
--- a/script/configs/devnet/deploy_from_scratch.holesky.slashing.config.json
+++ b/script/configs/devnet/deploy_from_scratch.holesky.slashing.config.json
@@ -43,5 +43,6 @@
"DEALLOCATION_DELAY": 86400,
"ALLOCATION_CONFIGURATION_DELAY": 600
},
- "ethPOSDepositAddress": "0x4242424242424242424242424242424242424242"
+ "ethPOSDepositAddress": "0x4242424242424242424242424242424242424242",
+ "semver": "v0.0.0"
}
\ No newline at end of file
diff --git a/script/configs/local/deploy_from_scratch.anvil.config.json b/script/configs/local/deploy_from_scratch.anvil.config.json
index f8b15599d4..3b516c4547 100644
--- a/script/configs/local/deploy_from_scratch.anvil.config.json
+++ b/script/configs/local/deploy_from_scratch.anvil.config.json
@@ -57,5 +57,6 @@
"DEALLOCATION_DELAY": 900,
"ALLOCATION_CONFIGURATION_DELAY": 1200
},
- "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa"
+ "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa",
+ "semver": "v0.0.0"
}
\ No newline at end of file
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 313bd1827a..af310692d5 100644
--- a/script/configs/local/deploy_from_scratch.slashing.anvil.config.json
+++ b/script/configs/local/deploy_from_scratch.slashing.anvil.config.json
@@ -57,5 +57,6 @@
"OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000,
"OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000
},
- "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa"
+ "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa",
+ "semver": "v0.0.0"
}
\ No newline at end of file
diff --git a/script/configs/mainnet/mainnet-addresses.config.json b/script/configs/mainnet/mainnet-addresses.config.json
index f47b5d9497..c33d7e8380 100644
--- a/script/configs/mainnet/mainnet-addresses.config.json
+++ b/script/configs/mainnet/mainnet-addresses.config.json
@@ -75,6 +75,7 @@
"executorMultisig": "0x369e6F597e22EaB55fFb173C6d9cD234BD699111",
"operationsMultisig": "0xBE1685C81aA44FF9FB319dD389addd9374383e90",
"pauserMultisig": "0x5050389572f2d220ad927CcbeA0D406831012390",
- "timelock": "0xA6Db1A8C5a981d1536266D2a393c5F8dDb210EAF"
+ "timelock": "0xA6Db1A8C5a981d1536266D2a393c5F8dDb210EAF",
+ "semver": "v0.5.4"
}
}
\ 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 5a90e4fcb2..1f7c5b3753 100644
--- a/script/deploy/devnet/deploy_from_scratch.s.sol
+++ b/script/deploy/devnet/deploy_from_scratch.s.sol
@@ -76,6 +76,8 @@ contract DeployFromScratch is Script, Test {
// strategies deployed
StrategyBaseTVLLimits[] public deployedStrategyArray;
+ string SEMVER;
+
// IMMUTABLES TO SET
uint64 GOERLI_GENESIS_TIME = 1616508000;
@@ -121,6 +123,8 @@ contract DeployFromScratch is Script, Test {
string memory config_data = vm.readFile(deployConfigPath);
// bytes memory parsedData = vm.parseJson(config_data);
+ SEMVER = stdJson.readString(config_data, ".semver");
+
STRATEGY_MANAGER_INIT_PAUSED_STATUS = stdJson.readUint(config_data, ".strategyManager.init_paused_status");
DELEGATION_INIT_PAUSED_STATUS = stdJson.readUint(config_data, ".delegation.init_paused_status");
DELEGATION_WITHDRAWAL_DELAY_BLOCKS = stdJson.readUint(config_data, ".delegation.init_withdrawal_delay_blocks");
@@ -227,37 +231,58 @@ contract DeployFromScratch is Script, Test {
eigenPodImplementation = new EigenPod(
ethPOSDeposit,
eigenPodManager,
- GOERLI_GENESIS_TIME
+ GOERLI_GENESIS_TIME,
+ SEMVER
);
eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation));
// Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs
- delegationImplementation = new DelegationManager(strategyManager, eigenPodManager, allocationManager, eigenLayerPauserReg, permissionController, MIN_WITHDRAWAL_DELAY);
- strategyManagerImplementation = new StrategyManager(delegation, eigenLayerPauserReg);
- avsDirectoryImplementation = new AVSDirectory(delegation, eigenLayerPauserReg);
+ delegationImplementation = new DelegationManager(
+ strategyManager,
+ eigenPodManager,
+ allocationManager,
+ eigenLayerPauserReg,
+ permissionController,
+ MIN_WITHDRAWAL_DELAY,
+ SEMVER
+ );
+
+ strategyManagerImplementation = new StrategyManager(delegation, eigenLayerPauserReg, SEMVER);
+ avsDirectoryImplementation = new AVSDirectory(delegation, eigenLayerPauserReg, SEMVER);
eigenPodManagerImplementation = new EigenPodManager(
ethPOSDeposit,
eigenPodBeacon,
delegation,
- eigenLayerPauserReg
+ eigenLayerPauserReg,
+ SEMVER
);
rewardsCoordinatorImplementation = new RewardsCoordinator(
- delegation,
- strategyManager,
- allocationManager,
- eigenLayerPauserReg,
- permissionController,
- REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS,
- REWARDS_COORDINATOR_MAX_REWARDS_DURATION,
- REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH,
- REWARDS_COORDINATOR_MAX_FUTURE_LENGTH,
- REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP
+ IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams(
+ delegation,
+ strategyManager,
+ allocationManager,
+ eigenLayerPauserReg,
+ permissionController,
+ REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS,
+ REWARDS_COORDINATOR_MAX_REWARDS_DURATION,
+ REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH,
+ REWARDS_COORDINATOR_MAX_FUTURE_LENGTH,
+ REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP,
+ SEMVER
+ )
+ );
+ allocationManagerImplementation = new AllocationManager(
+ delegation,
+ eigenLayerPauserReg,
+ permissionController,
+ DEALLOCATION_DELAY,
+ ALLOCATION_CONFIGURATION_DELAY,
+ SEMVER
);
- allocationManagerImplementation = new AllocationManager(delegation, eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, ALLOCATION_CONFIGURATION_DELAY);
- permissionControllerImplementation = new PermissionController();
- strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg);
+ permissionControllerImplementation = new PermissionController(SEMVER);
+ strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg, SEMVER);
// Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them.
{
@@ -325,7 +350,7 @@ contract DeployFromScratch is Script, Test {
// Deploy strategyFactory & base
// Create base strategy implementation
- baseStrategyImplementation = new StrategyBase(strategyManager, eigenLayerPauserReg);
+ baseStrategyImplementation = new StrategyBase(strategyManager, eigenLayerPauserReg, SEMVER);
// Create a proxy beacon for base strategy implementation
strategyBeacon = new UpgradeableBeacon(address(baseStrategyImplementation));
diff --git a/script/deploy/local/Deploy_From_Scratch.s.sol b/script/deploy/local/Deploy_From_Scratch.s.sol
index 8987c680e4..6201cd55a4 100644
--- a/script/deploy/local/Deploy_From_Scratch.s.sol
+++ b/script/deploy/local/Deploy_From_Scratch.s.sol
@@ -79,6 +79,8 @@ contract DeployFromScratch is Script, Test {
// strategies deployed
StrategyBaseTVLLimits[] public deployedStrategyArray;
+ string SEMVER;
+
// IMMUTABLES TO SET
uint64 GOERLI_GENESIS_TIME = 1616508000;
@@ -124,6 +126,8 @@ contract DeployFromScratch is Script, Test {
string memory config_data = vm.readFile(deployConfigPath);
// bytes memory parsedData = vm.parseJson(config_data);
+ SEMVER = stdJson.readString(config_data, ".semver");
+
STRATEGY_MANAGER_INIT_PAUSED_STATUS = stdJson.readUint(config_data, ".strategyManager.init_paused_status");
DELEGATION_INIT_PAUSED_STATUS = stdJson.readUint(config_data, ".delegation.init_paused_status");
DELEGATION_WITHDRAWAL_DELAY_BLOCKS = stdJson.readUint(config_data, ".delegation.init_withdrawal_delay_blocks");
@@ -240,35 +244,54 @@ contract DeployFromScratch is Script, Test {
} else {
ethPOSDeposit = IETHPOSDeposit(stdJson.readAddress(config_data, ".ethPOSDepositAddress"));
}
- eigenPodImplementation = new EigenPod(ethPOSDeposit, eigenPodManager, GOERLI_GENESIS_TIME);
+ eigenPodImplementation = new EigenPod(ethPOSDeposit, eigenPodManager, GOERLI_GENESIS_TIME, SEMVER);
eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation));
// Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs
- delegationImplementation = new DelegationManager(strategyManager, eigenPodManager, allocationManager, eigenLayerPauserReg, permissionController, MIN_WITHDRAWAL_DELAY);
- strategyManagerImplementation = new StrategyManager(delegation, eigenLayerPauserReg);
- avsDirectoryImplementation = new AVSDirectory(delegation, eigenLayerPauserReg);
+ delegationImplementation = new DelegationManager(
+ strategyManager,
+ eigenPodManager,
+ allocationManager,
+ eigenLayerPauserReg,
+ permissionController,
+ MIN_WITHDRAWAL_DELAY,
+ SEMVER
+ );
+ strategyManagerImplementation = new StrategyManager(delegation, eigenLayerPauserReg, SEMVER);
+ avsDirectoryImplementation = new AVSDirectory(delegation, eigenLayerPauserReg, SEMVER);
eigenPodManagerImplementation = new EigenPodManager(
ethPOSDeposit,
eigenPodBeacon,
delegation,
- eigenLayerPauserReg
+ eigenLayerPauserReg,
+ SEMVER
);
rewardsCoordinatorImplementation = new RewardsCoordinator(
- delegation,
- strategyManager,
- allocationManager,
- eigenLayerPauserReg,
- permissionController,
- REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS,
- REWARDS_COORDINATOR_MAX_REWARDS_DURATION,
- REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH,
- REWARDS_COORDINATOR_MAX_FUTURE_LENGTH,
- REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP
+ IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams(
+ delegation,
+ strategyManager,
+ allocationManager,
+ eigenLayerPauserReg,
+ permissionController,
+ REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS,
+ REWARDS_COORDINATOR_MAX_REWARDS_DURATION,
+ REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH,
+ REWARDS_COORDINATOR_MAX_FUTURE_LENGTH,
+ REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP,
+ SEMVER
+ )
+ );
+ allocationManagerImplementation = new AllocationManager(
+ delegation,
+ eigenLayerPauserReg,
+ permissionController,
+ DEALLOCATION_DELAY,
+ ALLOCATION_CONFIGURATION_DELAY,
+ SEMVER
);
- allocationManagerImplementation = new AllocationManager(delegation, eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, ALLOCATION_CONFIGURATION_DELAY);
- permissionControllerImplementation = new PermissionController();
+ permissionControllerImplementation = new PermissionController(SEMVER);
// Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them.
{
@@ -340,7 +363,7 @@ contract DeployFromScratch is Script, Test {
);
// deploy StrategyBaseTVLLimits contract implementation
- baseStrategyImplementation = new StrategyBaseTVLLimits(strategyManager, eigenLayerPauserReg);
+ baseStrategyImplementation = new StrategyBaseTVLLimits(strategyManager, eigenLayerPauserReg, SEMVER);
// create upgradeable proxies that each point to the implementation and initialize them
for (uint256 i = 0; i < strategyConfigs.length; ++i) {
if (strategyConfigs[i].tokenAddress == address(0)) {
diff --git a/script/deploy/local/deploy_from_scratch.slashing.s.sol b/script/deploy/local/deploy_from_scratch.slashing.s.sol
index 38ba01b7de..bf07af1d0a 100644
--- a/script/deploy/local/deploy_from_scratch.slashing.s.sol
+++ b/script/deploy/local/deploy_from_scratch.slashing.s.sol
@@ -73,6 +73,8 @@ contract DeployFromScratch is Script, Test {
address operationsMultisig;
address pauserMultisig;
+ string SEMVER;
+
// the ETH2 deposit contract -- if not on mainnet, we deploy a mock as stand-in
IETHPOSDeposit public ethPOSDeposit;
@@ -124,6 +126,8 @@ contract DeployFromScratch is Script, Test {
string memory config_data = vm.readFile(deployConfigPath);
// bytes memory parsedData = vm.parseJson(config_data);
+ SEMVER = stdJson.readString(config_data, ".semver");
+
MIN_WITHDRAWAL_DELAY = uint32(stdJson.readUint(config_data, ".delegation.withdrawal_delay_blocks"));
STRATEGY_MANAGER_INIT_PAUSED_STATUS = stdJson.readUint(config_data, ".strategyManager.init_paused_status");
DELEGATION_INIT_PAUSED_STATUS = stdJson.readUint(config_data, ".delegation.init_paused_status");
@@ -234,36 +238,56 @@ contract DeployFromScratch is Script, Test {
eigenPodImplementation = new EigenPod(
ethPOSDeposit,
eigenPodManager,
- GOERLI_GENESIS_TIME
+ GOERLI_GENESIS_TIME,
+ SEMVER
);
eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation));
// Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs
- delegationImplementation = new DelegationManager(strategyManager, eigenPodManager, allocationManager, eigenLayerPauserReg, permissionController, MIN_WITHDRAWAL_DELAY);
- strategyManagerImplementation = new StrategyManager(delegation, eigenLayerPauserReg);
- avsDirectoryImplementation = new AVSDirectory(delegation, eigenLayerPauserReg);
+ delegationImplementation = new DelegationManager(
+ strategyManager,
+ eigenPodManager,
+ allocationManager,
+ eigenLayerPauserReg,
+ permissionController,
+ MIN_WITHDRAWAL_DELAY,
+ SEMVER
+ );
+ strategyManagerImplementation = new StrategyManager(delegation, eigenLayerPauserReg, SEMVER);
+ avsDirectoryImplementation = new AVSDirectory(delegation, eigenLayerPauserReg, SEMVER);
eigenPodManagerImplementation = new EigenPodManager(
ethPOSDeposit,
eigenPodBeacon,
delegation,
- eigenLayerPauserReg
+ eigenLayerPauserReg,
+ SEMVER
);
rewardsCoordinatorImplementation = new RewardsCoordinator(
- delegation,
- strategyManager,
- allocationManager,
- eigenLayerPauserReg,
- permissionController,
- REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS,
- REWARDS_COORDINATOR_MAX_REWARDS_DURATION,
- REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH,
- REWARDS_COORDINATOR_MAX_FUTURE_LENGTH,
- REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP
+ IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams(
+ delegation,
+ strategyManager,
+ allocationManager,
+ eigenLayerPauserReg,
+ permissionController,
+ REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS,
+ REWARDS_COORDINATOR_MAX_REWARDS_DURATION,
+ REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH,
+ REWARDS_COORDINATOR_MAX_FUTURE_LENGTH,
+ REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP,
+ SEMVER
+ )
+ );
+ allocationManagerImplementation = new AllocationManager(
+ delegation,
+ eigenLayerPauserReg,
+ permissionController,
+ DEALLOCATION_DELAY,
+ ALLOCATION_CONFIGURATION_DELAY,
+ SEMVER
);
- allocationManagerImplementation = new AllocationManager(delegation, eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, ALLOCATION_CONFIGURATION_DELAY);
- permissionControllerImplementation = new PermissionController();
+ permissionControllerImplementation = new PermissionController(SEMVER);
// Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them.
{
@@ -335,7 +359,7 @@ contract DeployFromScratch is Script, Test {
);
// deploy StrategyBaseTVLLimits contract implementation
- baseStrategyImplementation = new StrategyBaseTVLLimits(strategyManager, eigenLayerPauserReg);
+ baseStrategyImplementation = new StrategyBaseTVLLimits(strategyManager, eigenLayerPauserReg, SEMVER);
// create upgradeable proxies that each point to the implementation and initialize them
for (uint256 i = 0; i < strategyConfigs.length; ++i) {
if (strategyConfigs[i].tokenAddress == address(0)) {
diff --git a/script/output/devnet/M2_from_scratch_deployment_data.json b/script/output/devnet/M2_from_scratch_deployment_data.json
index fa53f216a3..8d0a5950ca 100644
--- a/script/output/devnet/M2_from_scratch_deployment_data.json
+++ b/script/output/devnet/M2_from_scratch_deployment_data.json
@@ -1,33 +1,48 @@
{
- "addresses": {
- "avsDirectory": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707",
- "avsDirectoryImplementation": "0x9A676e781A523b5d0C0e43731313A708CB607508",
- "baseStrategyImplementation": "0x7a2088a1bFc9d81c55368AE168C2C02570cB814F",
- "delayedWithdrawalRouter": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6",
- "delayedWithdrawalRouterImplementation": "0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE",
- "delegation": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9",
- "delegationImplementation": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0",
- "eigenLayerPauserReg": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512",
- "eigenLayerProxyAdmin": "0x5FbDB2315678afecb367f032d93F642f64180aa3",
- "eigenPodBeacon": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e",
- "eigenPodImplementation": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788",
- "eigenPodManager": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853",
- "eigenPodManagerImplementation": "0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1",
- "emptyContract": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0",
- "rewardsCoordinator": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318",
- "rewardsCoordinatorImplementation": "0x68B1D87F95878fE05B998F19b66F4baba5De1aed",
- "slasher": "0x0165878A594ca255338adfa4d48449f69242Eb8F",
- "slasherImplementation": "0x0B306BF915C4d645ff596e518fAf3F9669b97016",
- "strategies": "",
- "strategyManager": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9",
- "strategyManagerImplementation": "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82"
+ "addresses": {
+ "allocationManager": "0xD718d5A27a29FF1cD22403426084bA0d479869a0",
+ "allocationManagerImplementation": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D",
+ "avsDirectory": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4",
+ "avsDirectoryImplementation": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb",
+ "baseStrategyImplementation": "0x29C66C9208f106f34754814f488FA80b6d566790",
+ "delegationManager": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3",
+ "delegationManagerImplementation": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1",
+ "eigenLayerPauserReg": "0x90193C961A926261B756D1E5bb255e67ff9498A1",
+ "eigenLayerProxyAdmin": "0x34A1D3fff3958843C43aD80F30b94c510645C316",
+ "eigenPodBeacon": "0xd21060559c9beb54fC07aFd6151aDf6cFCDDCAeB",
+ "eigenPodImplementation": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6",
+ "eigenPodManager": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1",
+ "eigenPodManagerImplementation": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
+ "emptyContract": "0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496",
+ "numStrategiesDeployed": 0,
+ "permissionController": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351",
+ "permissionControllerImplementation": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F",
+ "rewardsCoordinator": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809",
+ "rewardsCoordinatorImplementation": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6",
+ "strategies": {
+ "WETH": "0xC92B57772d68b7445F19ef9f08226f4C8C74E499"
},
- "chainInfo": {
- "chainId": 31337,
- "deploymentBlock": 0
- },
- "parameters": {
- "executorMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
- "operationsMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
+ "strategyManager": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
+ "strategyManagerImplementation": "0x978e3286EB805934215a88694d80b09aDed68D90",
+ "token": {
+ "tokenProxyAdmin": "0x0000000000000000000000000000000000000000",
+ "EIGEN": "0x0000000000000000000000000000000000000000",
+ "bEIGEN": "0x0000000000000000000000000000000000000000",
+ "EIGENImpl": "0x0000000000000000000000000000000000000000",
+ "bEIGENImpl": "0x0000000000000000000000000000000000000000",
+ "eigenStrategy": "0x0000000000000000000000000000000000000000",
+ "eigenStrategyImpl": "0x0000000000000000000000000000000000000000"
}
- }
\ No newline at end of file
+ },
+ "chainInfo": {
+ "chainId": 31337,
+ "deploymentBlock": 1
+ },
+ "parameters": {
+ "communityMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "executorMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "operationsMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "pauserMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "timelock": "0x0000000000000000000000000000000000000000"
+ }
+}
\ No newline at end of file
diff --git a/script/releases/v1.1.0-slashing/1-eoa.s.sol b/script/releases/v1.1.0-slashing/1-eoa.s.sol
deleted file mode 100644
index 0ff2aad91e..0000000000
--- a/script/releases/v1.1.0-slashing/1-eoa.s.sol
+++ /dev/null
@@ -1,152 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
-import "../Env.sol";
-
-import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
-import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
-import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
-import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
-
-contract Deploy is EOADeployer {
- using Env for *;
-
- function _runAsEOA() internal override {
- vm.startBroadcast();
-
- // Deploy RC
- deployImpl({
- name: type(RewardsCoordinator).name,
- deployedTo: address(
- new RewardsCoordinator({
- _delegationManager: Env.proxy.delegationManager(),
- _strategyManager: Env.proxy.strategyManager(),
- _allocationManager: Env.proxy.allocationManager(),
- _pauserRegistry: Env.impl.pauserRegistry(),
- _permissionController: Env.proxy.permissionController(),
- _CALCULATION_INTERVAL_SECONDS: Env
- .CALCULATION_INTERVAL_SECONDS(),
- _MAX_REWARDS_DURATION: Env.MAX_REWARDS_DURATION(),
- _MAX_RETROACTIVE_LENGTH: Env.MAX_RETROACTIVE_LENGTH(),
- _MAX_FUTURE_LENGTH: Env.MAX_FUTURE_LENGTH(),
- _GENESIS_REWARDS_TIMESTAMP: Env.GENESIS_REWARDS_TIMESTAMP()
- })
- )
- });
-
- vm.stopBroadcast();
- }
-
- function testDeploy() public virtual {
- _runAsEOA();
- _validateNewImplAddresses(false);
- _validateImplConstructors();
- _validateImplsInitialized();
- }
-
- /// @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.
- function _validateNewImplAddresses(bool areMatching) internal view {
- function(address, address, string memory)
- internal
- pure assertion = areMatching ? _assertMatch : _assertNotMatch;
-
- assertion(
- _getProxyImpl(address(Env.proxy.rewardsCoordinator())),
- address(Env.impl.rewardsCoordinator()),
- "rewardsCoordinator impl failed"
- );
- }
-
- /// @dev Validate the immutables set in the new implementation constructors
- function _validateImplConstructors() internal view {
- RewardsCoordinator rewards = Env.impl.rewardsCoordinator();
- assertTrue(
- rewards.delegationManager() == Env.proxy.delegationManager(),
- "rc.dm invalid"
- );
- assertTrue(
- rewards.strategyManager() == Env.proxy.strategyManager(),
- "rc.sm invalid"
- );
- assertTrue(
- rewards.allocationManager() == Env.proxy.allocationManager(),
- "rc.alm invalid"
- );
- assertTrue(
- rewards.pauserRegistry() == Env.impl.pauserRegistry(),
- "rc.pR invalid"
- );
- assertTrue(
- rewards.permissionController() == Env.proxy.permissionController(),
- "rc.pc invalid"
- );
- assertTrue(
- rewards.CALCULATION_INTERVAL_SECONDS() ==
- Env.CALCULATION_INTERVAL_SECONDS(),
- "rc.calcInterval invalid"
- );
- assertTrue(
- rewards.MAX_REWARDS_DURATION() == Env.MAX_REWARDS_DURATION(),
- "rc.rewardsDuration invalid"
- );
- assertTrue(
- rewards.MAX_RETROACTIVE_LENGTH() == Env.MAX_RETROACTIVE_LENGTH(),
- "rc.retroLength invalid"
- );
- assertTrue(
- rewards.MAX_FUTURE_LENGTH() == Env.MAX_FUTURE_LENGTH(),
- "rc.futureLength invalid"
- );
- assertTrue(
- rewards.GENESIS_REWARDS_TIMESTAMP() ==
- Env.GENESIS_REWARDS_TIMESTAMP(),
- "rc.genesis invalid"
- );
- }
-
- /// @dev Call initialize on all deployed implementations to ensure initializers are disabled
- function _validateImplsInitialized() internal {
- bytes memory errInit = "Initializable: contract is already initialized";
-
- RewardsCoordinator rewards = Env.impl.rewardsCoordinator();
- vm.expectRevert(errInit);
- rewards.initialize(address(0), 0, address(0), 0, 0);
- }
-
- /// @dev Query and return `proxyAdmin.getProxyImplementation(proxy)`
- function _getProxyImpl(address proxy) internal view returns (address) {
- return
- ProxyAdmin(Env.proxyAdmin()).getProxyImplementation(
- ITransparentUpgradeableProxy(proxy)
- );
- }
-
- /// @dev Query and return `proxyAdmin.getProxyAdmin(proxy)`
- function _getProxyAdmin(address proxy) internal view returns (address) {
- return
- ProxyAdmin(Env.proxyAdmin()).getProxyAdmin(
- ITransparentUpgradeableProxy(proxy)
- );
- }
-
- function _assertMatch(
- address a,
- address b,
- string memory err
- ) private pure {
- assertEq(a, b, err);
- }
-
- function _assertNotMatch(
- address a,
- address b,
- string memory err
- ) private pure {
- assertNotEq(a, b, err);
- }
-}
diff --git a/script/releases/v1.1.0-slashing/2-multisig.s.sol b/script/releases/v1.1.0-slashing/2-multisig.s.sol
deleted file mode 100644
index 7e01875f4c..0000000000
--- a/script/releases/v1.1.0-slashing/2-multisig.s.sol
+++ /dev/null
@@ -1,83 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import {Deploy} from "./1-eoa.s.sol";
-import "../Env.sol";
-
-import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
-import "zeus-templates/utils/Encode.sol";
-
-import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol";
-
-contract Queue is MultisigBuilder, Deploy {
- using Env for *;
- using Encode for *;
-
- function _runAsMultisig()
- internal
- virtual
- override
- prank(Env.opsMultisig())
- {
- bytes memory calldata_to_executor = _getCalldataToExecutor();
-
- TimelockController timelock = Env.timelockController();
- timelock.schedule({
- target: Env.executorMultisig(),
- value: 0,
- data: calldata_to_executor,
- predecessor: 0,
- salt: 0,
- delay: timelock.getMinDelay()
- });
- }
-
- /// @dev Get the calldata to be sent from the timelock to the executor
- function _getCalldataToExecutor() internal returns (bytes memory) {
- MultisigCall[] storage executorCalls = Encode
- .newMultisigCalls()
- .append({
- to: Env.proxyAdmin(),
- data: Encode.proxyAdmin.upgrade({
- proxy: address(Env.proxy.rewardsCoordinator()),
- impl: address(Env.impl.rewardsCoordinator())
- })
- });
-
- return
- Encode.gnosisSafe.execTransaction({
- from: address(Env.timelockController()),
- to: address(Env.multiSendCallOnly()),
- op: Encode.Operation.DelegateCall,
- data: Encode.multiSend(executorCalls)
- });
- }
-
- function testScript() public virtual {
- 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
- });
-
- // Check that the upgrade does not exist in the timelock
- assertFalse(
- timelock.isOperationPending(txHash),
- "Transaction should NOT be queued."
- );
-
- execute();
-
- // Check that the upgrade has been added to the timelock
- assertTrue(
- timelock.isOperationPending(txHash),
- "Transaction should be queued."
- );
- }
-}
diff --git a/script/releases/v1.1.0-slashing/3-execute.s.sol b/script/releases/v1.1.0-slashing/3-execute.s.sol
deleted file mode 100644
index 2a250a2403..0000000000
--- a/script/releases/v1.1.0-slashing/3-execute.s.sol
+++ /dev/null
@@ -1,128 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import "../Env.sol";
-import {Queue} from "./2-multisig.s.sol";
-
-import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
-import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
-
-contract Execute is Queue {
- using Env for *;
-
- function _runAsMultisig()
- internal
- override(Queue)
- prank(Env.protocolCouncilMultisig())
- {
- bytes memory calldata_to_executor = _getCalldataToExecutor();
-
- TimelockController timelock = Env.timelockController();
- timelock.execute({
- target: Env.executorMultisig(),
- value: 0,
- payload: calldata_to_executor,
- predecessor: 0,
- salt: 0
- });
- }
-
- function testScript() public virtual override(Queue) {
- // 0. Deploy Impls
- 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. Queue Upgrade
- Queue._runAsMultisig();
- _unsafeResetHasPranked(); // reset hasPranked so we can use it again
-
- // 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(true);
- _validateProxyConstructors();
- _validateProxyInitialized();
- }
-
- function _validateProxyConstructors() internal view {
- RewardsCoordinator rewards = Env.proxy.rewardsCoordinator();
- assertTrue(
- rewards.delegationManager() == Env.proxy.delegationManager(),
- "rc.dm invalid"
- );
- assertTrue(
- rewards.strategyManager() == Env.proxy.strategyManager(),
- "rc.sm invalid"
- );
- assertTrue(
- rewards.allocationManager() == Env.proxy.allocationManager(),
- "rc.alm invalid"
- );
- assertTrue(
- rewards.pauserRegistry() == Env.impl.pauserRegistry(),
- "rc.pR invalid"
- );
- assertTrue(
- rewards.permissionController() == Env.proxy.permissionController(),
- "rc.pc invalid"
- );
- assertTrue(
- rewards.CALCULATION_INTERVAL_SECONDS() ==
- Env.CALCULATION_INTERVAL_SECONDS(),
- "rc.calcInterval invalid"
- );
- assertTrue(
- rewards.MAX_REWARDS_DURATION() == Env.MAX_REWARDS_DURATION(),
- "rc.rewardsDuration invalid"
- );
- assertTrue(
- rewards.MAX_RETROACTIVE_LENGTH() == Env.MAX_RETROACTIVE_LENGTH(),
- "rc.retroLength invalid"
- );
- assertTrue(
- rewards.MAX_FUTURE_LENGTH() == Env.MAX_FUTURE_LENGTH(),
- "rc.futureLength invalid"
- );
- assertTrue(
- rewards.GENESIS_REWARDS_TIMESTAMP() ==
- Env.GENESIS_REWARDS_TIMESTAMP(),
- "rc.genesis invalid"
- );
- }
-
- /// @dev Call initialize on all deployed implementations to ensure initializers are disabled
- function _validateProxyInitialized() internal {
- bytes memory errInit = "Initializable: contract is already initialized";
-
- RewardsCoordinator rewards = Env.proxy.rewardsCoordinator();
- vm.expectRevert(errInit);
- rewards.initialize(address(0), 0, address(0), 0, 0);
- }
-}
diff --git a/script/releases/v1.1.0-slashing/upgrade.json b/script/releases/v1.1.0-slashing/upgrade.json
deleted file mode 100644
index 3e544cff48..0000000000
--- a/script/releases/v1.1.0-slashing/upgrade.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "slashing-rewards-v2.1",
- "from": "1.0.3",
- "to": "1.1.0",
- "phases": [
- {
- "type": "eoa",
- "filename": "1-eoa.s.sol"
- },
- {
- "type": "multisig",
- "filename": "2-multisig.s.sol"
- },
- {
- "type": "multisig",
- "filename": "3-execute.s.sol"
- }
- ]
-}
\ No newline at end of file
diff --git a/script/releases/v1.1.1-slashing/1-eoa.s.sol b/script/releases/v1.1.1-slashing/1-eoa.s.sol
deleted file mode 100644
index 41d538c376..0000000000
--- a/script/releases/v1.1.1-slashing/1-eoa.s.sol
+++ /dev/null
@@ -1,104 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
-import "../Env.sol";
-
-import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
-import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
-import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
-import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
-
-contract Deploy is EOADeployer {
- using Env for *;
-
- function _runAsEOA() internal override {
- vm.startBroadcast();
-
- // Deploy Allocation Manager
- deployImpl({
- name: type(AllocationManager).name,
- deployedTo: address(
- new AllocationManager({
- _delegation: Env.proxy.delegationManager(),
- _pauserRegistry: Env.impl.pauserRegistry(),
- _permissionController: Env.proxy.permissionController(),
- _DEALLOCATION_DELAY: Env.MIN_WITHDRAWAL_DELAY(),
- _ALLOCATION_CONFIGURATION_DELAY: Env.ALLOCATION_CONFIGURATION_DELAY()
- })
- )
- });
-
- vm.stopBroadcast();
- }
-
- function testDeploy() public virtual {
- _runAsEOA();
- _validateNewImplAddresses(false);
- _validateImplConstructors();
- _validateImplsInitialized();
- }
-
- /// @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.
- function _validateNewImplAddresses(
- bool areMatching
- ) internal view {
- function(address, address, string memory)
- internal
- pure assertion = areMatching ? _assertMatch : _assertNotMatch;
-
- assertion(
- _getProxyImpl(address(Env.proxy.allocationManager())),
- address(Env.impl.allocationManager()),
- "allocationManager impl failed"
- );
- }
-
- /// @dev Validate the immutables set in the new implementation constructors
- function _validateImplConstructors() internal view {
- AllocationManager allocationManager = Env.impl.allocationManager();
- assertTrue(allocationManager.delegation() == Env.proxy.delegationManager(), "dm invalid");
- assertTrue(allocationManager.pauserRegistry() == Env.impl.pauserRegistry(), "pR invalid");
- assertTrue(allocationManager.permissionController() == Env.proxy.permissionController(), "pc invalid");
- assertTrue(allocationManager.DEALLOCATION_DELAY() == Env.MIN_WITHDRAWAL_DELAY(), "deallocationDelay invalid");
- assertTrue(
- allocationManager.ALLOCATION_CONFIGURATION_DELAY() == Env.ALLOCATION_CONFIGURATION_DELAY(),
- "allocationConfigurationDelay invalid"
- );
- }
-
- /// @dev Call initialize on all deployed implementations to ensure initializers are disabled
- function _validateImplsInitialized() internal {
- bytes memory errInit = "Initializable: contract is already initialized";
-
- AllocationManager allocationManager = Env.impl.allocationManager();
- vm.expectRevert(errInit);
- allocationManager.initialize(address(0), 0);
- }
-
- /// @dev Query and return `proxyAdmin.getProxyImplementation(proxy)`
- function _getProxyImpl(
- address proxy
- ) internal view returns (address) {
- return ProxyAdmin(Env.proxyAdmin()).getProxyImplementation(ITransparentUpgradeableProxy(proxy));
- }
-
- /// @dev Query and return `proxyAdmin.getProxyAdmin(proxy)`
- function _getProxyAdmin(
- address proxy
- ) internal view returns (address) {
- return ProxyAdmin(Env.proxyAdmin()).getProxyAdmin(ITransparentUpgradeableProxy(proxy));
- }
-
- function _assertMatch(address a, address b, string memory err) private pure {
- assertEq(a, b, err);
- }
-
- function _assertNotMatch(address a, address b, string memory err) private pure {
- assertNotEq(a, b, err);
- }
-}
diff --git a/script/releases/v1.1.1-slashing/2-multisig.s.sol b/script/releases/v1.1.1-slashing/2-multisig.s.sol
deleted file mode 100644
index ab39003e83..0000000000
--- a/script/releases/v1.1.1-slashing/2-multisig.s.sol
+++ /dev/null
@@ -1,69 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import {Deploy} from "./1-eoa.s.sol";
-import "../Env.sol";
-
-import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
-import "zeus-templates/utils/Encode.sol";
-
-import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol";
-
-contract Queue is MultisigBuilder, Deploy {
- using Env for *;
- using Encode for *;
-
- function _runAsMultisig() internal virtual override prank(Env.opsMultisig()) {
- bytes memory calldata_to_executor = _getCalldataToExecutor();
-
- TimelockController timelock = Env.timelockController();
- timelock.schedule({
- target: Env.executorMultisig(),
- value: 0,
- data: calldata_to_executor,
- predecessor: 0,
- salt: 0,
- delay: timelock.getMinDelay()
- });
- }
-
- /// @dev Get the calldata to be sent from the timelock to the executor
- function _getCalldataToExecutor() internal returns (bytes memory) {
- MultisigCall[] storage executorCalls = Encode.newMultisigCalls().append({
- to: Env.proxyAdmin(),
- data: Encode.proxyAdmin.upgrade({
- proxy: address(Env.proxy.allocationManager()),
- impl: address(Env.impl.allocationManager())
- })
- });
-
- return Encode.gnosisSafe.execTransaction({
- from: address(Env.timelockController()),
- to: address(Env.multiSendCallOnly()),
- op: Encode.Operation.DelegateCall,
- data: Encode.multiSend(executorCalls)
- });
- }
-
- function testScript() public virtual {
- 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
- });
-
- // Check that the upgrade does not exist in the timelock
- assertFalse(timelock.isOperationPending(txHash), "Transaction should NOT be queued.");
-
- execute();
-
- // Check that the upgrade has been added to the timelock
- assertTrue(timelock.isOperationPending(txHash), "Transaction should be queued.");
- }
-}
diff --git a/script/releases/v1.1.1-slashing/3-execute.s.sol b/script/releases/v1.1.1-slashing/3-execute.s.sol
deleted file mode 100644
index 7b1f87f5ef..0000000000
--- a/script/releases/v1.1.1-slashing/3-execute.s.sol
+++ /dev/null
@@ -1,82 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import "../Env.sol";
-import {Queue} from "./2-multisig.s.sol";
-
-import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
-import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
-
-contract Execute is Queue {
- using Env for *;
-
- function _runAsMultisig() internal override(Queue) prank(Env.protocolCouncilMultisig()) {
- bytes memory calldata_to_executor = _getCalldataToExecutor();
-
- TimelockController timelock = Env.timelockController();
- timelock.execute({
- target: Env.executorMultisig(),
- value: 0,
- payload: calldata_to_executor,
- predecessor: 0,
- salt: 0
- });
- }
-
- function testScript() public virtual override(Queue) {
- // 0. Deploy Impls
- 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. Queue Upgrade
- Queue._runAsMultisig();
- _unsafeResetHasPranked(); // reset hasPranked so we can use it again
-
- // 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(true);
- _validateProxyConstructors();
- _validateProxyInitialized();
- }
-
- function _validateProxyConstructors() internal view {
- AllocationManager allocationManager = Env.proxy.allocationManager();
- assertTrue(allocationManager.delegation() == Env.proxy.delegationManager(), "alm.dm 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.deallocationDelay invalid"
- );
- assertTrue(
- allocationManager.ALLOCATION_CONFIGURATION_DELAY() == Env.ALLOCATION_CONFIGURATION_DELAY(),
- "alm.allocationConfigurationDelay invalid"
- );
- }
-
- /// @dev Call initialize on all deployed proxies to ensure initializers are disabled
- function _validateProxyInitialized() internal {
- bytes memory errInit = "Initializable: contract is already initialized";
-
- AllocationManager allocationManager = Env.proxy.allocationManager();
- vm.expectRevert(errInit);
- allocationManager.initialize(address(0), 0);
- }
-}
diff --git a/script/releases/v1.1.1-slashing/upgrade.json b/script/releases/v1.1.1-slashing/upgrade.json
deleted file mode 100644
index 64703c7d0d..0000000000
--- a/script/releases/v1.1.1-slashing/upgrade.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "slashing-registrar-hotfix",
- "from": "1.1.0",
- "to": "1.1.1",
- "phases": [
- {
- "type": "eoa",
- "filename": "1-eoa.s.sol"
- },
- {
- "type": "multisig",
- "filename": "2-multisig.s.sol"
- },
- {
- "type": "multisig",
- "filename": "3-execute.s.sol"
- }
- ]
-}
\ No newline at end of file
diff --git a/script/tasks/register_operator_to_operatorSet.s.sol b/script/tasks/register_operator_to_operatorSet.s.sol
index 182b2a17f9..2976ac9d98 100644
--- a/script/tasks/register_operator_to_operatorSet.s.sol
+++ b/script/tasks/register_operator_to_operatorSet.s.sol
@@ -72,8 +72,7 @@ contract RegisterOperatorToOperatorSets is Script, Test {
// Register the Operator to the AVS
avsDirectory.registerOperatorToAVS(
- operator,
- ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), bytes32(uint256(0) + 1), expiry)
+ operator, ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), bytes32(uint256(0) + 1), expiry)
);
// Deploy and set registrar.
diff --git a/script/utils/ExistingDeploymentParser.sol b/script/utils/ExistingDeploymentParser.sol
index 53f6789044..112f887d72 100644
--- a/script/utils/ExistingDeploymentParser.sol
+++ b/script/utils/ExistingDeploymentParser.sol
@@ -50,6 +50,7 @@ contract ExistingDeploymentParser is Script, Logger {
/// EigenLayer Contract Parameters
/// -----------------------------------------------------------------------
+ string public SEMVER;
/// @dev AllocationManager
uint256 ALLOCATION_MANAGER_INIT_PAUSED_STATUS;
uint32 DEALLOCATION_DELAY;
@@ -185,7 +186,7 @@ contract ExistingDeploymentParser is Script, Logger {
/// @notice use for parsing already deployed EigenLayer contracts
function _parseDeployedContracts(
string memory existingDeploymentInfoPath
- ) internal virtual {
+ ) internal noTracing virtual {
// read and log the chainID
uint256 currentChainId = block.chainid;
console.log("You are parsing on ChainID", currentChainId);
@@ -193,6 +194,8 @@ contract ExistingDeploymentParser is Script, Logger {
// READ JSON CONFIG DATA
string memory json = cheats.readFile(existingDeploymentInfoPath);
+ SEMVER = stdJson.readString(json, ".parameters.semver");
+
// check that the chainID matches the one in the config
uint256 configChainId = json.readUint(".chainInfo.chainId");
assertEq(configChainId, currentChainId, "You are on the wrong chain for this config");
@@ -211,7 +214,7 @@ contract ExistingDeploymentParser is Script, Logger {
eigenLayerPauserReg = PauserRegistry(json.readAddress(".addresses.eigenLayerPauserReg"));
// FIXME: hotfix - remove later...
- permissionControllerImplementation = new PermissionController();
+ permissionControllerImplementation = new PermissionController(SEMVER);
permissionController = PermissionController(
address(new TransparentUpgradeableProxy(address(permissionControllerImplementation), address(eigenLayerProxyAdmin), ""))
);
@@ -221,7 +224,8 @@ contract ExistingDeploymentParser is Script, Logger {
eigenLayerPauserReg,
permissionController,
DEALLOCATION_DELAY,
- ALLOCATION_CONFIGURATION_DELAY
+ ALLOCATION_CONFIGURATION_DELAY,
+ SEMVER
);
allocationManager = AllocationManager(
address(new TransparentUpgradeableProxy(address(allocationManagerImplementation), address(eigenLayerProxyAdmin), ""))
@@ -663,7 +667,7 @@ contract ExistingDeploymentParser is Script, Logger {
/// @notice used for parsing parameters used in the integration test upgrade
function _parseParamsForIntegrationUpgrade(
string memory initialDeploymentParamsPath
- ) internal virtual {
+ ) internal noTracing virtual {
// read and log the chainID
uint256 currentChainId = block.chainid;
console.log("You are parsing on ChainID", currentChainId);
diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol
index d689eb18f0..6f76e421e3 100644
--- a/src/contracts/core/AVSDirectory.sol
+++ b/src/contracts/core/AVSDirectory.sol
@@ -5,7 +5,7 @@ import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol";
-import "../mixins/SignatureUtils.sol";
+import "../mixins/SignatureUtilsMixin.sol";
import "../permissions/Pausable.sol";
import "./AVSDirectoryStorage.sol";
@@ -15,7 +15,7 @@ contract AVSDirectory is
Pausable,
AVSDirectoryStorage,
ReentrancyGuardUpgradeable,
- SignatureUtils
+ SignatureUtilsMixin
{
/**
*
@@ -29,8 +29,9 @@ contract AVSDirectory is
*/
constructor(
IDelegationManager _delegation,
- IPauserRegistry _pauserRegistry
- ) AVSDirectoryStorage(_delegation) Pausable(_pauserRegistry) {
+ IPauserRegistry _pauserRegistry,
+ string memory _version
+ ) AVSDirectoryStorage(_delegation) Pausable(_pauserRegistry) SignatureUtilsMixin(_version) {
_disableInitializers();
}
@@ -70,7 +71,7 @@ contract AVSDirectory is
/// @inheritdoc IAVSDirectory
function registerOperatorToAVS(
address operator,
- ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature
+ ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature
) external override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) {
// Assert that the `operator` is not actively registered to the AVS.
require(
diff --git a/src/contracts/core/AllocationManager.sol b/src/contracts/core/AllocationManager.sol
index 232af3030a..4e24f49d38 100644
--- a/src/contracts/core/AllocationManager.sol
+++ b/src/contracts/core/AllocationManager.sol
@@ -6,6 +6,7 @@ import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol";
import "../mixins/PermissionControllerMixin.sol";
+import "../mixins/SemVerMixin.sol";
import "../permissions/Pausable.sol";
import "../libraries/SlashingLib.sol";
import "../libraries/OperatorSetLib.sol";
@@ -17,10 +18,12 @@ contract AllocationManager is
Pausable,
AllocationManagerStorage,
ReentrancyGuardUpgradeable,
- PermissionControllerMixin
+ PermissionControllerMixin,
+ SemVerMixin
{
using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;
using EnumerableSet for *;
+ using SafeCast for *;
using Snapshots for Snapshots.DefaultWadHistory;
using OperatorSetLib for OperatorSet;
@@ -40,11 +43,13 @@ contract AllocationManager is
IPauserRegistry _pauserRegistry,
IPermissionController _permissionController,
uint32 _DEALLOCATION_DELAY,
- uint32 _ALLOCATION_CONFIGURATION_DELAY
+ uint32 _ALLOCATION_CONFIGURATION_DELAY,
+ string memory _version
)
AllocationManagerStorage(_delegation, _DEALLOCATION_DELAY, _ALLOCATION_CONFIGURATION_DELAY)
Pausable(_pauserRegistry)
PermissionControllerMixin(_permissionController)
+ SemVerMixin(_version)
{
_disableInitializers();
}
@@ -62,10 +67,9 @@ contract AllocationManager is
) external onlyWhenNotPaused(PAUSED_OPERATOR_SLASHING) checkCanCall(avs) {
// Check that the operator set exists and the operator is registered to it
OperatorSet memory operatorSet = OperatorSet(avs, params.operatorSetId);
- bool isOperatorSlashable = _isOperatorSlashable(params.operator, operatorSet);
require(params.strategies.length == params.wadsToSlash.length, InputArrayLengthMismatch());
require(_operatorSets[operatorSet.avs].contains(operatorSet.id), InvalidOperatorSet());
- require(isOperatorSlashable, OperatorNotSlashable());
+ require(isOperatorSlashable(params.operator, operatorSet), OperatorNotSlashable());
uint256[] memory wadSlashed = new uint256[](params.strategies.length);
@@ -172,7 +176,7 @@ contract AllocationManager is
OperatorSet memory operatorSet = params[i].operatorSet;
require(_operatorSets[operatorSet.avs].contains(operatorSet.id), InvalidOperatorSet());
- bool isOperatorSlashable = _isOperatorSlashable(operator, operatorSet);
+ bool _isOperatorSlashable = isOperatorSlashable(operator, operatorSet);
for (uint256 j = 0; j < params[i].strategies.length; j++) {
IStrategy strategy = params[i].strategies[j];
@@ -184,11 +188,11 @@ contract AllocationManager is
(StrategyInfo memory info, Allocation memory allocation) =
_getUpdatedAllocation(operator, operatorSet.key(), strategy);
- require(allocation.pendingDiff == 0, ModificationAlreadyPending());
+ require(allocation.effectBlock == 0, ModificationAlreadyPending());
// 2. Check whether the operator's allocation is slashable. If not, we allow instant
// deallocation.
- bool isSlashable = _isAllocationSlashable(operatorSet, strategy, allocation, isOperatorSlashable);
+ bool isSlashable = _isAllocationSlashable(operatorSet, strategy, allocation, _isOperatorSlashable);
// 3. Calculate the change in magnitude
allocation.pendingDiff = _calcDelta(allocation.currentMagnitude, params[i].newMagnitudes[j]);
@@ -227,7 +231,7 @@ contract AllocationManager is
// 6. Emit an event for the updated allocation
emit AllocationUpdated(
operator,
- OperatorSetLib.decode(operatorSet.key()),
+ operatorSet,
strategy,
_addInt128(allocation.currentMagnitude, allocation.pendingDiff),
allocation.effectBlock
@@ -261,7 +265,7 @@ contract AllocationManager is
// Check the operator set exists and the operator is not currently registered to it
OperatorSet memory operatorSet = OperatorSet(params.avs, params.operatorSetIds[i]);
require(_operatorSets[operatorSet.avs].contains(operatorSet.id), InvalidOperatorSet());
- require(!_isOperatorSlashable(operator, operatorSet), AlreadyMemberOfSet());
+ require(!isOperatorSlashable(operator, operatorSet), AlreadyMemberOfSet());
// Add operator to operator set
registeredSets[operator].add(operatorSet.key());
@@ -326,11 +330,18 @@ contract AllocationManager is
/// @inheritdoc IAllocationManager
function updateAVSMetadataURI(address avs, string calldata metadataURI) external checkCanCall(avs) {
+ if (!_avsRegisteredMetadata[avs]) {
+ _avsRegisteredMetadata[avs] = true;
+ }
+
emit AVSMetadataURIUpdated(avs, metadataURI);
}
/// @inheritdoc IAllocationManager
function createOperatorSets(address avs, CreateSetParams[] calldata params) external checkCanCall(avs) {
+ // Check that the AVS exists and has registered metadata
+ require(_avsRegisteredMetadata[avs], NonexistentAVSMetadata());
+
for (uint256 i = 0; i < params.length; i++) {
OperatorSet memory operatorSet = OperatorSet(avs, params[i].operatorSetId);
@@ -440,28 +451,19 @@ contract AllocationManager is
emit AllocationDelaySet(operator, delay, info.effectBlock);
}
- /// @notice returns whether the operator is slashable in the given operator set
- function _isOperatorSlashable(address operator, OperatorSet memory operatorSet) internal view returns (bool) {
- RegistrationStatus memory status = registrationStatus[operator][operatorSet.key()];
-
- // slashableUntil returns the last block the operator is slashable in so we check for
- // less than or equal to
- return status.registered || block.number <= status.slashableUntil;
- }
-
/// @notice returns whether the operator's allocation is slashable in the given operator set
function _isAllocationSlashable(
OperatorSet memory operatorSet,
IStrategy strategy,
Allocation memory allocation,
- bool isOperatorSlashable
+ bool _isOperatorSlashable
) internal view returns (bool) {
/// forgefmt: disable-next-item
return
// If the operator set does not use this strategy, any allocation from it is not slashable
_operatorSetStrategies[operatorSet.key()].contains(address(strategy)) &&
// If the operator is not slashable by the operatorSet, any allocation is not slashable
- isOperatorSlashable &&
+ _isOperatorSlashable &&
// If there is nothing allocated, the allocation is not slashable
allocation.currentMagnitude != 0;
}
@@ -542,6 +544,53 @@ contract AllocationManager is
}
}
+ /**
+ * @dev Returns the minimum allocated stake at the future block.
+ * @param operatorSet The operator set to get the minimum allocated stake for.
+ * @param operators The operators to get the minimum allocated stake for.
+ * @param strategies The strategies to get the minimum allocated stake for.
+ * @param futureBlock The future block to get the minimum allocated stake for.
+ */
+ function _getMinimumAllocatedStake(
+ OperatorSet memory operatorSet,
+ address[] memory operators,
+ IStrategy[] memory strategies,
+ uint32 futureBlock
+ ) internal view returns (uint256[][] memory allocatedStake) {
+ allocatedStake = new uint256[][](operators.length);
+ uint256[][] memory delegatedStake = delegation.getOperatorsShares(operators, strategies);
+
+ for (uint256 i = 0; i < operators.length; i++) {
+ address operator = operators[i];
+
+ allocatedStake[i] = new uint256[](strategies.length);
+
+ for (uint256 j = 0; j < strategies.length; j++) {
+ IStrategy strategy = strategies[j];
+
+ // Fetch the max magnitude and allocation for the operator/strategy.
+ // Prevent division by 0 if needed. This mirrors the "FullySlashed" checks
+ // in the DelegationManager
+ uint64 maxMagnitude = _maxMagnitudeHistory[operator][strategy].latest();
+ if (maxMagnitude == 0) {
+ continue;
+ }
+
+ Allocation memory alloc = getAllocation(operator, operatorSet, strategy);
+
+ // If the pending change takes effect before `futureBlock`, include it in `currentMagnitude`
+ // However, ONLY include the pending change if it is a deallocation, since this method
+ // is supposed to return the minimum slashable stake between now and `futureBlock`
+ if (alloc.effectBlock <= futureBlock && alloc.pendingDiff < 0) {
+ alloc.currentMagnitude = _addInt128(alloc.currentMagnitude, alloc.pendingDiff);
+ }
+
+ uint256 slashableProportion = uint256(alloc.currentMagnitude).divWad(maxMagnitude);
+ allocatedStake[i][j] = delegatedStake[i][j].mulWad(slashableProportion);
+ }
+ }
+ }
+
function _updateMaxMagnitude(address operator, IStrategy strategy, uint64 newMaxMagnitude) internal {
_maxMagnitudeHistory[operator][strategy].push({key: uint32(block.number), value: newMaxMagnitude});
emit MaxMagnitudeUpdated(operator, strategy, newMaxMagnitude);
@@ -551,8 +600,9 @@ contract AllocationManager is
return int128(uint128(newMagnitude)) - int128(uint128(currentMagnitude));
}
+ /// @dev Use safe casting when downcasting to uint64
function _addInt128(uint64 a, int128 b) internal pure returns (uint64) {
- return uint64(uint128(int128(uint128(a)) + b));
+ return uint256(int256(int128(uint128(a)) + b)).toUint64();
}
/**
@@ -643,13 +693,30 @@ contract AllocationManager is
return (operatorSets, _allocations);
}
+ /// @inheritdoc IAllocationManager
+ function getEncumberedMagnitude(address operator, IStrategy strategy) external view returns (uint64) {
+ (uint64 curEncumberedMagnitude,) = _getFreeAndUsedMagnitude(operator, strategy);
+ return curEncumberedMagnitude;
+ }
+
/// @inheritdoc IAllocationManager
function getAllocatableMagnitude(address operator, IStrategy strategy) external view returns (uint64) {
+ (, uint64 curAllocatableMagnitude) = _getFreeAndUsedMagnitude(operator, strategy);
+ return curAllocatableMagnitude;
+ }
+
+ /// @dev For an operator, returns up-to-date amounts for current encumbered and available
+ /// magnitude. Note that these two values will always add up to the operator's max magnitude
+ /// for the strategy
+ function _getFreeAndUsedMagnitude(
+ address operator,
+ IStrategy strategy
+ ) internal view returns (uint64 curEncumberedMagnitude, uint64 curAllocatableMagnitude) {
// This method needs to simulate clearing any pending deallocations.
// This roughly mimics the calculations done in `_clearDeallocationQueue` and
// `_getUpdatedAllocation`, while operating on a `curEncumberedMagnitude`
// rather than continually reading/updating state.
- uint64 curEncumberedMagnitude = encumberedMagnitude[operator][strategy];
+ curEncumberedMagnitude = encumberedMagnitude[operator][strategy];
uint256 length = deallocationQueue[operator][strategy].length();
for (uint256 i = 0; i < length; ++i) {
@@ -670,7 +737,8 @@ contract AllocationManager is
// The difference between the operator's max magnitude and its encumbered magnitude
// is the magnitude that can be allocated.
- return _maxMagnitudeHistory[operator][strategy].latest() - curEncumberedMagnitude;
+ curAllocatableMagnitude = _maxMagnitudeHistory[operator][strategy].latest() - curEncumberedMagnitude;
+ return (curEncumberedMagnitude, curAllocatableMagnitude);
}
/// @inheritdoc IAllocationManager
@@ -806,36 +874,35 @@ contract AllocationManager is
IStrategy[] memory strategies,
uint32 futureBlock
) external view returns (uint256[][] memory slashableStake) {
- slashableStake = new uint256[][](operators.length);
- uint256[][] memory delegatedStake = delegation.getOperatorsShares(operators, strategies);
+ slashableStake = _getMinimumAllocatedStake(operatorSet, operators, strategies, futureBlock);
for (uint256 i = 0; i < operators.length; i++) {
- address operator = operators[i];
- slashableStake[i] = new uint256[](strategies.length);
-
- for (uint256 j = 0; j < strategies.length; j++) {
- IStrategy strategy = strategies[j];
-
- // Fetch the max magnitude and allocation for the operator/strategy.
- // Prevent division by 0 if needed. This mirrors the "FullySlashed" checks
- // in the DelegationManager
- uint64 maxMagnitude = _maxMagnitudeHistory[operator][strategy].latest();
- if (maxMagnitude == 0) {
- continue;
+ // If the operator is not slashable by the opSet, all strategies should have a slashable stake of 0
+ if (!isOperatorSlashable(operators[i], operatorSet)) {
+ for (uint256 j = 0; j < strategies.length; j++) {
+ slashableStake[i][j] = 0;
}
+ }
+ }
+ }
- Allocation memory alloc = getAllocation(operator, operatorSet, strategy);
+ /// @inheritdoc IAllocationManager
+ function getAllocatedStake(
+ OperatorSet memory operatorSet,
+ address[] memory operators,
+ IStrategy[] memory strategies
+ ) public view returns (uint256[][] memory) {
+ /// This helper function returns the minimum allocated stake by taking into account deallocations at some `futureBlock`.
+ /// We use the block.number, as the `futureBlock`, meaning that no **future** deallocations are considered.
+ return _getMinimumAllocatedStake(operatorSet, operators, strategies, uint32(block.number));
+ }
- // If the pending change takes effect before `futureBlock`, include it in `currentMagnitude`
- // However, ONLY include the pending change if it is a deallocation, since this method
- // is supposed to return the minimum slashable stake between now and `futureBlock`
- if (alloc.effectBlock <= futureBlock && alloc.pendingDiff < 0) {
- alloc.currentMagnitude = _addInt128(alloc.currentMagnitude, alloc.pendingDiff);
- }
+ /// @inheritdoc IAllocationManager
+ function isOperatorSlashable(address operator, OperatorSet memory operatorSet) public view returns (bool) {
+ RegistrationStatus memory status = registrationStatus[operator][operatorSet.key()];
- uint256 slashableProportion = uint256(alloc.currentMagnitude).divWad(maxMagnitude);
- slashableStake[i][j] = delegatedStake[i][j].mulWad(slashableProportion);
- }
- }
+ // slashableUntil returns the last block the operator is slashable in so we check for
+ // less than or equal to
+ return status.registered || block.number <= status.slashableUntil;
}
}
diff --git a/src/contracts/core/AllocationManagerStorage.sol b/src/contracts/core/AllocationManagerStorage.sol
index caab8f4195..24bbb8f3e7 100644
--- a/src/contracts/core/AllocationManagerStorage.sol
+++ b/src/contracts/core/AllocationManagerStorage.sol
@@ -83,14 +83,16 @@ abstract contract AllocationManagerStorage is IAllocationManager {
_maxMagnitudeHistory;
/// @dev For a strategy, contains the amount of magnitude an operator has allocated to operator sets
- /// @dev This value should be read with caution, as deallocations that are completable but not
- /// popped off the queue are still included in the encumbered magnitude
- mapping(address operator => mapping(IStrategy strategy => uint64)) public encumberedMagnitude;
+ mapping(address operator => mapping(IStrategy strategy => uint64)) internal encumberedMagnitude;
/// @dev For a strategy, keeps an ordered queue of operator sets that have pending deallocations
/// These must be completed in order to free up magnitude for future allocation
mapping(address operator => mapping(IStrategy strategy => DoubleEndedQueue.Bytes32Deque)) internal deallocationQueue;
+ /// @dev Lists the AVSs who has registered metadata and claimed itself as an AVS
+ /// @notice bool is not used and is always true if the avs has registered metadata
+ mapping(address avs => bool) internal _avsRegisteredMetadata;
+
// Construction
constructor(IDelegationManager _delegation, uint32 _DEALLOCATION_DELAY, uint32 _ALLOCATION_CONFIGURATION_DELAY) {
@@ -104,5 +106,5 @@ abstract contract AllocationManagerStorage is IAllocationManager {
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
- uint256[37] private __gap;
+ uint256[36] private __gap;
}
diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol
index ecb6e0327b..d75c59e674 100644
--- a/src/contracts/core/DelegationManager.sol
+++ b/src/contracts/core/DelegationManager.sol
@@ -5,7 +5,7 @@ import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol";
-import "../mixins/SignatureUtils.sol";
+import "../mixins/SignatureUtilsMixin.sol";
import "../mixins/PermissionControllerMixin.sol";
import "../permissions/Pausable.sol";
import "../libraries/SlashingLib.sol";
@@ -28,8 +28,8 @@ contract DelegationManager is
Pausable,
DelegationManagerStorage,
ReentrancyGuardUpgradeable,
- SignatureUtils,
- PermissionControllerMixin
+ PermissionControllerMixin,
+ SignatureUtilsMixin
{
using SlashingLib for *;
using Snapshots for Snapshots.DefaultZeroHistory;
@@ -69,11 +69,13 @@ contract DelegationManager is
IAllocationManager _allocationManager,
IPauserRegistry _pauserRegistry,
IPermissionController _permissionController,
- uint32 _MIN_WITHDRAWAL_DELAY
+ uint32 _MIN_WITHDRAWAL_DELAY,
+ string memory _version
)
DelegationManagerStorage(_strategyManager, _eigenPodManager, _allocationManager, _MIN_WITHDRAWAL_DELAY)
Pausable(_pauserRegistry)
PermissionControllerMixin(_permissionController)
+ SignatureUtilsMixin(_version)
{
_disableInitializers();
}
@@ -94,7 +96,7 @@ contract DelegationManager is
address initDelegationApprover,
uint32 allocationDelay,
string calldata metadataURI
- ) external {
+ ) external nonReentrant {
require(!isDelegated(msg.sender), ActivelyDelegated());
allocationManager.setAllocationDelay(msg.sender, allocationDelay);
@@ -108,7 +110,10 @@ contract DelegationManager is
}
/// @inheritdoc IDelegationManager
- function modifyOperatorDetails(address operator, address newDelegationApprover) external checkCanCall(operator) {
+ function modifyOperatorDetails(
+ address operator,
+ address newDelegationApprover
+ ) external checkCanCall(operator) nonReentrant {
require(isOperator(operator), OperatorNotRegistered());
_setDelegationApprover(operator, newDelegationApprover);
}
@@ -124,7 +129,7 @@ contract DelegationManager is
address operator,
SignatureWithExpiry memory approverSignatureAndExpiry,
bytes32 approverSalt
- ) public {
+ ) public nonReentrant {
require(!isDelegated(msg.sender), ActivelyDelegated());
require(isOperator(operator), OperatorNotRegistered());
@@ -143,7 +148,7 @@ contract DelegationManager is
/// @inheritdoc IDelegationManager
function undelegate(
address staker
- ) public returns (bytes32[] memory withdrawalRoots) {
+ ) public nonReentrant returns (bytes32[] memory withdrawalRoots) {
// Check that the `staker` can undelegate
require(isDelegated(staker), NotActivelyDelegated());
require(!isOperator(staker), OperatorsCannotUndelegate());
@@ -174,7 +179,7 @@ contract DelegationManager is
/// @inheritdoc IDelegationManager
function queueWithdrawals(
QueuedWithdrawalParams[] calldata params
- ) external onlyWhenNotPaused(PAUSED_ENTER_WITHDRAWAL_QUEUE) returns (bytes32[] memory) {
+ ) external onlyWhenNotPaused(PAUSED_ENTER_WITHDRAWAL_QUEUE) nonReentrant returns (bytes32[] memory) {
bytes32[] memory withdrawalRoots = new bytes32[](params.length);
address operator = delegatedTo[msg.sender];
@@ -226,7 +231,7 @@ contract DelegationManager is
IStrategy strategy,
uint256 prevDepositShares,
uint256 addedShares
- ) external onlyStrategyManagerOrEigenPodManager {
+ ) external onlyStrategyManagerOrEigenPodManager nonReentrant {
/// Note: Unlike `decreaseDelegatedShares`, we don't return early if the staker has no operator.
/// This is because `_increaseDelegation` updates the staker's deposit scaling factor, which we
/// need to do even if not delegated.
@@ -250,7 +255,7 @@ contract DelegationManager is
address staker,
uint256 curDepositShares,
uint64 beaconChainSlashingFactorDecrease
- ) external onlyEigenPodManager {
+ ) external onlyEigenPodManager nonReentrant {
if (!isDelegated(staker)) {
return;
}
@@ -280,7 +285,7 @@ contract DelegationManager is
IStrategy strategy,
uint64 prevMaxMagnitude,
uint64 newMaxMagnitude
- ) external onlyAllocationManager {
+ ) external onlyAllocationManager nonReentrant {
/// forgefmt: disable-next-item
uint256 operatorSharesSlashed = SlashingLib.calcSlashedAmount({
operatorShares: operatorShares[operator][strategy],
@@ -307,6 +312,9 @@ contract DelegationManager is
sharesToDecrease: operatorSharesSlashed
});
+ // Emit event for operator shares being slashed
+ emit OperatorSharesSlashed(operator, strategy, totalDepositSharesToBurn);
+
IShareManager shareManager = _getShareManager(strategy);
// NOTE: for beaconChainETHStrategy, increased burnable shares currently have no mechanism for burning
shareManager.increaseBurnableShares(strategy, totalDepositSharesToBurn);
@@ -340,24 +348,37 @@ contract DelegationManager is
* 1) new delegations are not paused (PAUSED_NEW_DELEGATION)
*/
function _delegate(address staker, address operator) internal onlyWhenNotPaused(PAUSED_NEW_DELEGATION) {
- // record the delegation relation between the staker and operator, and emit an event
+ // When a staker is not delegated to an operator, their deposit shares are equal to their
+ // withdrawable shares -- except for the beaconChainETH strategy, which is handled below
+ (IStrategy[] memory strategies, uint256[] memory withdrawableShares) = getDepositedShares(staker);
+
+ // Retrieve the amount of slashing experienced by the operator in each strategy so far.
+ // When delegating, we "forgive" the staker for this slashing by adjusting their
+ // deposit scaling factor.
+ uint256[] memory operatorSlashingFactors = _getSlashingFactors(address(0), operator, strategies);
+
+ // Delegate to the operator
delegatedTo[staker] = operator;
emit StakerDelegated(staker, operator);
- // read staker's deposited shares and strategies to add to operator's shares
- // and also update the staker depositScalingFactor for each strategy
- (IStrategy[] memory strategies, uint256[] memory depositedShares) = getDepositedShares(staker);
- uint256[] memory slashingFactors = _getSlashingFactors(staker, operator, strategies);
-
for (uint256 i = 0; i < strategies.length; ++i) {
+ // Special case for beacon chain slashing - ensure the staker's beacon chain slashing is
+ // reflected in the number of shares they delegate.
+ if (strategies[i] == beaconChainETHStrategy) {
+ uint64 stakerBeaconChainSlashing = eigenPodManager.beaconChainSlashingFactor(staker);
+
+ DepositScalingFactor memory dsf = _depositScalingFactor[staker][strategies[i]];
+ withdrawableShares[i] = dsf.calcWithdrawable(withdrawableShares[i], stakerBeaconChainSlashing);
+ }
+
// forgefmt: disable-next-item
_increaseDelegation({
operator: operator,
staker: staker,
strategy: strategies[i],
prevDepositShares: uint256(0),
- addedShares: depositedShares[i],
- slashingFactor: slashingFactors[i]
+ addedShares: withdrawableShares[i],
+ slashingFactor: operatorSlashingFactors[i]
});
}
}
@@ -478,7 +499,11 @@ contract DelegationManager is
}
// Remove deposit shares from EigenPodManager/StrategyManager
- shareManager.removeDepositShares(staker, strategies[i], depositSharesToWithdraw[i]);
+ uint256 sharesAfter = shareManager.removeDepositShares(staker, strategies[i], depositSharesToWithdraw[i]);
+
+ if (sharesAfter == 0) {
+ _depositScalingFactor[staker][strategies[i]].reset();
+ }
}
// Create queue entry and increment withdrawal nonce
@@ -498,7 +523,7 @@ contract DelegationManager is
bytes32 withdrawalRoot = calculateWithdrawalRoot(withdrawal);
pendingWithdrawals[withdrawalRoot] = true;
- queuedWithdrawals[withdrawalRoot] = withdrawal;
+ _queuedWithdrawals[withdrawalRoot] = withdrawal;
_stakerQueuedWithdrawalRoots[staker].add(withdrawalRoot);
emit SlashingWithdrawalQueued(withdrawalRoot, withdrawal, withdrawableShares);
@@ -544,7 +569,7 @@ contract DelegationManager is
// Remove the withdrawal from the queue. Note that for legacy withdrawals, the removals
// from `_stakerQueuedWithdrawalRoots` and `queuedWithdrawals` will no-op.
_stakerQueuedWithdrawalRoots[withdrawal.staker].remove(withdrawalRoot);
- delete queuedWithdrawals[withdrawalRoot];
+ delete _queuedWithdrawals[withdrawalRoot];
delete pendingWithdrawals[withdrawalRoot];
emit SlashingWithdrawalCompleted(withdrawalRoot);
@@ -562,6 +587,11 @@ contract DelegationManager is
slashingFactor: prevSlashingFactors[i]
});
+ //Do nothing if 0 shares to withdraw
+ if (sharesToWithdraw == 0) {
+ continue;
+ }
+
if (receiveAsTokens) {
// Withdraws `shares` in `strategy` to `withdrawer`. If the shares are virtual beaconChainETH shares,
// then a call is ultimately forwarded to the `staker`s EigenPod; otherwise a call is ultimately forwarded
@@ -577,7 +607,6 @@ contract DelegationManager is
(uint256 prevDepositShares, uint256 addedShares) = shareManager.addShares({
staker: withdrawal.staker,
strategy: withdrawal.strategies[i],
- token: tokens[i],
shares: sharesToWithdraw
});
@@ -674,7 +703,10 @@ contract DelegationManager is
});
}
- /// @dev Calculate the amount of slashing to apply to the staker's shares
+ /// @dev Calculate the amount of slashing to apply to the staker's shares.
+ /// @dev Be mindful of rounding in `mulWad()`, it's possible for the slashing factor to round down to 0
+ /// even when both operatorMaxMagnitude and beaconChainSlashingFactor are non-zero. This is only possible
+ /// in an edge case where the operator has a very low maxMagnitude.
function _getSlashingFactor(
address staker,
IStrategy strategy,
@@ -760,11 +792,43 @@ contract DelegationManager is
/// @dev Add to the cumulative withdrawn scaled shares from an operator for a given strategy
function _addQueuedSlashableShares(address operator, IStrategy strategy, uint256 scaledShares) internal {
- if (strategy != beaconChainETHStrategy) {
- uint256 currCumulativeScaledShares = _cumulativeScaledSharesHistory[operator][strategy].latest();
- _cumulativeScaledSharesHistory[operator][strategy].push({
- key: uint32(block.number),
- value: currCumulativeScaledShares + scaledShares
+ uint256 currCumulativeScaledShares = _cumulativeScaledSharesHistory[operator][strategy].latest();
+ _cumulativeScaledSharesHistory[operator][strategy].push({
+ key: uint32(block.number),
+ value: currCumulativeScaledShares + scaledShares
+ });
+ }
+
+ /// @dev Get the shares from a queued withdrawal.
+ function _getSharesByWithdrawalRoot(
+ bytes32 withdrawalRoot
+ ) internal view returns (Withdrawal memory withdrawal, uint256[] memory shares) {
+ withdrawal = _queuedWithdrawals[withdrawalRoot];
+ shares = new uint256[](withdrawal.strategies.length);
+
+ uint32 slashableUntil = withdrawal.startBlock + MIN_WITHDRAWAL_DELAY_BLOCKS;
+
+ // If the slashableUntil block is in the past, read the slashing factors at that block.
+ // Otherwise, read the current slashing factors. Note that if the slashableUntil block is the current block
+ // or in the future, then the slashing factors are still subject to change before the withdrawal is completable,
+ // which may result in fewer shares being withdrawn.
+ uint256[] memory slashingFactors = slashableUntil < uint32(block.number)
+ ? _getSlashingFactorsAtBlock({
+ staker: withdrawal.staker,
+ operator: withdrawal.delegatedTo,
+ strategies: withdrawal.strategies,
+ blockNumber: slashableUntil
+ })
+ : _getSlashingFactors({
+ staker: withdrawal.staker,
+ operator: withdrawal.delegatedTo,
+ strategies: withdrawal.strategies
+ });
+
+ for (uint256 j; j < withdrawal.strategies.length; ++j) {
+ shares[j] = SlashingLib.scaleForCompleteWithdrawal({
+ scaledShares: withdrawal.scaledShares[j],
+ slashingFactor: slashingFactors[j]
});
}
}
@@ -900,11 +964,17 @@ contract DelegationManager is
return (strategies, shares);
}
+ function queuedWithdrawals(
+ bytes32 withdrawalRoot
+ ) external view returns (Withdrawal memory withdrawal) {
+ return _queuedWithdrawals[withdrawalRoot];
+ }
+
/// @inheritdoc IDelegationManager
function getQueuedWithdrawal(
bytes32 withdrawalRoot
- ) external view returns (Withdrawal memory) {
- return queuedWithdrawals[withdrawalRoot];
+ ) external view returns (Withdrawal memory withdrawal, uint256[] memory shares) {
+ (withdrawal, shares) = _getSharesByWithdrawalRoot(withdrawalRoot);
}
/// @inheritdoc IDelegationManager
@@ -917,37 +987,8 @@ contract DelegationManager is
withdrawals = new Withdrawal[](totalQueued);
shares = new uint256[][](totalQueued);
- address operator = delegatedTo[staker];
-
for (uint256 i; i < totalQueued; ++i) {
- withdrawals[i] = queuedWithdrawals[withdrawalRoots[i]];
- shares[i] = new uint256[](withdrawals[i].strategies.length);
-
- uint32 slashableUntil = withdrawals[i].startBlock + MIN_WITHDRAWAL_DELAY_BLOCKS;
-
- uint256[] memory slashingFactors;
- // If slashableUntil block is in the past, read the slashing factors at that block
- // Otherwise read the current slashing factors. Note that if the slashableUntil block is the current block
- // or in the future then the slashing factors are still subject to change before the withdrawal is completable
- // and the shares withdrawn to be less
- if (slashableUntil < uint32(block.number)) {
- slashingFactors = _getSlashingFactorsAtBlock({
- staker: staker,
- operator: operator,
- strategies: withdrawals[i].strategies,
- blockNumber: slashableUntil
- });
- } else {
- slashingFactors =
- _getSlashingFactors({staker: staker, operator: operator, strategies: withdrawals[i].strategies});
- }
-
- for (uint256 j; j < withdrawals[i].strategies.length; ++j) {
- shares[i][j] = SlashingLib.scaleForCompleteWithdrawal({
- scaledShares: withdrawals[i].scaledShares[j],
- slashingFactor: slashingFactors[j]
- });
- }
+ (withdrawals[i], shares[i]) = _getSharesByWithdrawalRoot(withdrawalRoots[i]);
}
}
diff --git a/src/contracts/core/DelegationManagerStorage.sol b/src/contracts/core/DelegationManagerStorage.sol
index 6da2ed4c88..8e38b4c8d1 100644
--- a/src/contracts/core/DelegationManagerStorage.sol
+++ b/src/contracts/core/DelegationManagerStorage.sol
@@ -111,7 +111,7 @@ abstract contract DelegationManagerStorage is IDelegationManager {
/// @notice Returns the details of a queued withdrawal given by `withdrawalRoot`.
/// @dev This variable only reflects withdrawals that were made after the slashing release.
- mapping(bytes32 withdrawalRoot => Withdrawal withdrawal) internal queuedWithdrawals;
+ mapping(bytes32 withdrawalRoot => Withdrawal withdrawal) internal _queuedWithdrawals;
/// @notice Contains history of the total cumulative staker withdrawals for an operator and a given strategy.
/// Used to calculate burned StrategyManager shares when an operator is slashed.
diff --git a/src/contracts/core/RewardsCoordinator.sol b/src/contracts/core/RewardsCoordinator.sol
index 2ebddfce36..82e985769b 100644
--- a/src/contracts/core/RewardsCoordinator.sol
+++ b/src/contracts/core/RewardsCoordinator.sol
@@ -10,6 +10,7 @@ import "../libraries/Merkle.sol";
import "../permissions/Pausable.sol";
import "./RewardsCoordinatorStorage.sol";
import "../mixins/PermissionControllerMixin.sol";
+import "../mixins/SemVerMixin.sol";
/**
* @title RewardsCoordinator
@@ -26,7 +27,8 @@ contract RewardsCoordinator is
Pausable,
ReentrancyGuardUpgradeable,
RewardsCoordinatorStorage,
- PermissionControllerMixin
+ PermissionControllerMixin,
+ SemVerMixin
{
using SafeERC20 for IERC20;
using OperatorSetLib for OperatorSet;
@@ -43,29 +45,21 @@ contract RewardsCoordinator is
/// @dev Sets the immutable variables for the contract
constructor(
- IDelegationManager _delegationManager,
- IStrategyManager _strategyManager,
- IAllocationManager _allocationManager,
- IPauserRegistry _pauserRegistry,
- IPermissionController _permissionController,
- uint32 _CALCULATION_INTERVAL_SECONDS,
- uint32 _MAX_REWARDS_DURATION,
- uint32 _MAX_RETROACTIVE_LENGTH,
- uint32 _MAX_FUTURE_LENGTH,
- uint32 _GENESIS_REWARDS_TIMESTAMP
+ RewardsCoordinatorConstructorParams memory params
)
RewardsCoordinatorStorage(
- _delegationManager,
- _strategyManager,
- _allocationManager,
- _CALCULATION_INTERVAL_SECONDS,
- _MAX_REWARDS_DURATION,
- _MAX_RETROACTIVE_LENGTH,
- _MAX_FUTURE_LENGTH,
- _GENESIS_REWARDS_TIMESTAMP
+ params.delegationManager,
+ params.strategyManager,
+ params.allocationManager,
+ params.CALCULATION_INTERVAL_SECONDS,
+ params.MAX_REWARDS_DURATION,
+ params.MAX_RETROACTIVE_LENGTH,
+ params.MAX_FUTURE_LENGTH,
+ params.GENESIS_REWARDS_TIMESTAMP
)
- Pausable(_pauserRegistry)
- PermissionControllerMixin(_permissionController)
+ Pausable(params.pauserRegistry)
+ PermissionControllerMixin(params.permissionController)
+ SemVerMixin(params.version)
{
_disableInitializers();
}
diff --git a/src/contracts/core/RewardsCoordinatorStorage.sol b/src/contracts/core/RewardsCoordinatorStorage.sol
index e1896a808d..abe63de018 100644
--- a/src/contracts/core/RewardsCoordinatorStorage.sol
+++ b/src/contracts/core/RewardsCoordinatorStorage.sol
@@ -2,9 +2,6 @@
pragma solidity ^0.8.27;
import "../interfaces/IRewardsCoordinator.sol";
-import "../interfaces/IDelegationManager.sol";
-import "../interfaces/IStrategyManager.sol";
-import "../interfaces/IAllocationManager.sol";
/**
* @title Storage variables for the `RewardsCoordinator` contract.
diff --git a/src/contracts/core/StrategyManager.sol b/src/contracts/core/StrategyManager.sol
index 09c347f22e..a446962d95 100644
--- a/src/contracts/core/StrategyManager.sol
+++ b/src/contracts/core/StrategyManager.sol
@@ -6,7 +6,7 @@ import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
-import "../mixins/SignatureUtils.sol";
+import "../mixins/SignatureUtilsMixin.sol";
import "../interfaces/IEigenPodManager.sol";
import "../permissions/Pausable.sol";
import "./StrategyManagerStorage.sol";
@@ -26,7 +26,7 @@ contract StrategyManager is
ReentrancyGuardUpgradeable,
Pausable,
StrategyManagerStorage,
- SignatureUtils
+ SignatureUtilsMixin
{
using SlashingLib for *;
using SafeERC20 for IERC20;
@@ -53,8 +53,9 @@ contract StrategyManager is
*/
constructor(
IDelegationManager _delegation,
- IPauserRegistry _pauserRegistry
- ) StrategyManagerStorage(_delegation) Pausable(_pauserRegistry) {
+ IPauserRegistry _pauserRegistry,
+ string memory _version
+ ) StrategyManagerStorage(_delegation) Pausable(_pauserRegistry) SignatureUtilsMixin(_version) {
_disableInitializers();
}
@@ -116,18 +117,18 @@ contract StrategyManager is
address staker,
IStrategy strategy,
uint256 depositSharesToRemove
- ) external onlyDelegationManager {
- _removeDepositShares(staker, strategy, depositSharesToRemove);
+ ) external onlyDelegationManager nonReentrant returns (uint256) {
+ (, uint256 sharesAfter) = _removeDepositShares(staker, strategy, depositSharesToRemove);
+ return sharesAfter;
}
/// @inheritdoc IShareManager
function addShares(
address staker,
IStrategy strategy,
- IERC20 token,
uint256 shares
- ) external onlyDelegationManager returns (uint256, uint256) {
- return _addShares(staker, token, strategy, shares);
+ ) external onlyDelegationManager nonReentrant returns (uint256, uint256) {
+ return _addShares(staker, strategy, shares);
}
/// @inheritdoc IShareManager
@@ -136,13 +137,17 @@ contract StrategyManager is
IStrategy strategy,
IERC20 token,
uint256 shares
- ) external onlyDelegationManager {
+ ) external onlyDelegationManager nonReentrant {
strategy.withdraw(staker, token, shares);
}
/// @inheritdoc IShareManager
- function increaseBurnableShares(IStrategy strategy, uint256 addedSharesToBurn) external onlyDelegationManager {
- burnableShares[strategy] += addedSharesToBurn;
+ function increaseBurnableShares(
+ IStrategy strategy,
+ uint256 addedSharesToBurn
+ ) external onlyDelegationManager nonReentrant {
+ (, uint256 currentShares) = EnumerableMap.tryGet(burnableShares, address(strategy));
+ EnumerableMap.set(burnableShares, address(strategy), currentShares + addedSharesToBurn);
emit BurnableSharesIncreased(strategy, addedSharesToBurn);
}
@@ -150,24 +155,28 @@ contract StrategyManager is
function burnShares(
IStrategy strategy
) external nonReentrant {
- uint256 sharesToBurn = burnableShares[strategy];
- burnableShares[strategy] = 0;
+ (, uint256 sharesToBurn) = EnumerableMap.tryGet(burnableShares, address(strategy));
+ EnumerableMap.remove(burnableShares, address(strategy));
emit BurnableSharesDecreased(strategy, sharesToBurn);
- // burning shares is functionally the same as withdrawing but with different destination address
- strategy.withdraw(DEFAULT_BURN_ADDRESS, strategy.underlyingToken(), sharesToBurn);
+
+ // Burning acts like withdrawing, except that the destination is to the burn address.
+ // If we have no shares to burn, we don't need to call the strategy.
+ if (sharesToBurn != 0) {
+ strategy.withdraw(DEFAULT_BURN_ADDRESS, strategy.underlyingToken(), sharesToBurn);
+ }
}
/// @inheritdoc IStrategyManager
function setStrategyWhitelister(
address newStrategyWhitelister
- ) external onlyOwner {
+ ) external onlyOwner nonReentrant {
_setStrategyWhitelister(newStrategyWhitelister);
}
/// @inheritdoc IStrategyManager
function addStrategiesToDepositWhitelist(
IStrategy[] calldata strategiesToWhitelist
- ) external onlyStrategyWhitelister {
+ ) external onlyStrategyWhitelister nonReentrant {
uint256 strategiesToWhitelistLength = strategiesToWhitelist.length;
for (uint256 i = 0; i < strategiesToWhitelistLength; ++i) {
// change storage and emit event only if strategy is not already in whitelist
@@ -181,7 +190,7 @@ contract StrategyManager is
/// @inheritdoc IStrategyManager
function removeStrategiesFromDepositWhitelist(
IStrategy[] calldata strategiesToRemoveFromWhitelist
- ) external onlyStrategyWhitelister {
+ ) external onlyStrategyWhitelister nonReentrant {
uint256 strategiesToRemoveFromWhitelistLength = strategiesToRemoveFromWhitelist.length;
for (uint256 i = 0; i < strategiesToRemoveFromWhitelistLength; ++i) {
// change storage and emit event only if strategy is already in whitelist
@@ -197,19 +206,13 @@ contract StrategyManager is
/**
* @notice This function adds `shares` for a given `strategy` to the `staker` and runs through the necessary update logic.
* @param staker The address to add shares to
- * @param token The token that is being deposited (used for indexing)
* @param strategy The Strategy in which the `staker` is receiving shares
* @param shares The amount of shares to grant to the `staker`
* @dev In particular, this function calls `delegation.increaseDelegatedShares(staker, strategy, shares)` to ensure that all
* delegated shares are tracked, increases the stored share amount in `stakerDepositShares[staker][strategy]`, and adds `strategy`
* to the `staker`'s list of strategies, if it is not in the list already.
*/
- function _addShares(
- address staker,
- IERC20 token,
- IStrategy strategy,
- uint256 shares
- ) internal returns (uint256, uint256) {
+ function _addShares(address staker, IStrategy strategy, uint256 shares) internal returns (uint256, uint256) {
// sanity checks on inputs
require(staker != address(0), StakerAddressZero());
require(shares != 0, SharesAmountZero());
@@ -225,7 +228,7 @@ contract StrategyManager is
// add the returned depositedShares to their existing shares for this strategy
stakerDepositShares[staker][strategy] = prevDepositShares + shares;
- emit Deposit(staker, token, strategy, shares);
+ emit Deposit(staker, strategy, shares);
return (prevDepositShares, shares);
}
@@ -251,7 +254,7 @@ contract StrategyManager is
shares = strategy.deposit(token, amount);
// add the returned shares to the staker's existing shares for this strategy
- (uint256 prevDepositShares, uint256 addedShares) = _addShares(staker, token, strategy, shares);
+ (uint256 prevDepositShares, uint256 addedShares) = _addShares(staker, strategy, shares);
// Increase shares delegated to operator
delegation.increaseDelegatedShares({
@@ -271,12 +274,13 @@ contract StrategyManager is
* @param depositSharesToRemove The amount of deposit shares to decrement
* @dev If the amount of shares represents all of the staker`s shares in said strategy,
* then the strategy is removed from stakerStrategyList[staker] and 'true' is returned. Otherwise 'false' is returned.
+ * Also returns the user's updated deposit shares after decrement.
*/
function _removeDepositShares(
address staker,
IStrategy strategy,
uint256 depositSharesToRemove
- ) internal returns (bool) {
+ ) internal returns (bool, uint256) {
// sanity checks on inputs
require(depositSharesToRemove != 0, SharesAmountZero());
@@ -296,10 +300,10 @@ contract StrategyManager is
_removeStrategyFromStakerStrategyList(staker, strategy);
// return true in the event that the strategy was removed from stakerStrategyList[staker]
- return true;
+ return (true, userDepositShares);
}
// return false in the event that the strategy was *not* removed from stakerStrategyList[staker]
- return false;
+ return (false, userDepositShares);
}
/**
@@ -387,4 +391,28 @@ contract StrategyManager is
)
);
}
+
+ /// @inheritdoc IStrategyManager
+ function getBurnableShares(
+ IStrategy strategy
+ ) external view returns (uint256) {
+ (, uint256 shares) = EnumerableMap.tryGet(burnableShares, address(strategy));
+ return shares;
+ }
+
+ /// @inheritdoc IStrategyManager
+ function getStrategiesWithBurnableShares() external view returns (address[] memory, uint256[] memory) {
+ uint256 totalEntries = EnumerableMap.length(burnableShares);
+
+ address[] memory strategies = new address[](totalEntries);
+ uint256[] memory shares = new uint256[](totalEntries);
+
+ for (uint256 i = 0; i < totalEntries; i++) {
+ (address strategy, uint256 shareAmount) = EnumerableMap.at(burnableShares, i);
+ strategies[i] = strategy;
+ shares[i] = shareAmount;
+ }
+
+ return (strategies, shares);
+ }
}
diff --git a/src/contracts/core/StrategyManagerStorage.sol b/src/contracts/core/StrategyManagerStorage.sol
index 705dab4a44..61db02e792 100644
--- a/src/contracts/core/StrategyManagerStorage.sol
+++ b/src/contracts/core/StrategyManagerStorage.sol
@@ -1,6 +1,8 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.27;
+import "@openzeppelin/contracts/utils/structs/EnumerableMap.sol";
+
import "../interfaces/IStrategyManager.sol";
import "../interfaces/IStrategy.sol";
import "../interfaces/IEigenPodManager.sol";
@@ -69,8 +71,8 @@ abstract contract StrategyManagerStorage is IStrategyManager {
/// @dev Do not remove, deprecated storage.
mapping(IStrategy strategy => bool) private __deprecated_thirdPartyTransfersForbidden;
- /// @notice Returns the amount of `shares` that have been slashed on EigenLayer but not burned yet.
- mapping(IStrategy strategy => uint256) public burnableShares;
+ /// @notice Returns the amount of `shares` that have been slashed on EigenLayer but not burned yet. Takes 3 storage slots.
+ EnumerableMap.AddressToUintMap internal burnableShares;
// Construction
@@ -88,5 +90,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[38] private __gap;
+ uint256[36] private __gap;
}
diff --git a/src/contracts/interfaces/IAVSDirectory.sol b/src/contracts/interfaces/IAVSDirectory.sol
index 798f5a4e63..643f601e5d 100644
--- a/src/contracts/interfaces/IAVSDirectory.sol
+++ b/src/contracts/interfaces/IAVSDirectory.sol
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;
-import "./ISignatureUtils.sol";
+import "./ISignatureUtilsMixin.sol";
import "./IPauserRegistry.sol";
import "./IStrategy.sol";
@@ -53,7 +53,7 @@ interface IAVSDirectoryEvents is IAVSDirectoryTypes {
event AVSMetadataURIUpdated(address indexed avs, string metadataURI);
}
-interface IAVSDirectory is IAVSDirectoryEvents, IAVSDirectoryErrors, ISignatureUtils {
+interface IAVSDirectory is IAVSDirectoryEvents, IAVSDirectoryErrors, ISignatureUtilsMixin {
/**
*
* EXTERNAL FUNCTIONS
@@ -98,7 +98,7 @@ interface IAVSDirectory is IAVSDirectoryEvents, IAVSDirectoryErrors, ISignatureU
*/
function registerOperatorToAVS(
address operator,
- ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature
+ ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature
) external;
/**
diff --git a/src/contracts/interfaces/IAllocationManager.sol b/src/contracts/interfaces/IAllocationManager.sol
index 66367393f4..f61fd72649 100644
--- a/src/contracts/interfaces/IAllocationManager.sol
+++ b/src/contracts/interfaces/IAllocationManager.sol
@@ -5,6 +5,7 @@ import {OperatorSet} from "../libraries/OperatorSetLib.sol";
import "./IPauserRegistry.sol";
import "./IStrategy.sol";
import "./IAVSRegistrar.sol";
+import "./ISemVerMixin.sol";
interface IAllocationManagerErrors {
/// Input Validation
@@ -26,6 +27,8 @@ interface IAllocationManagerErrors {
/// @dev Thrown when an invalid operator is provided.
error InvalidOperator();
+ /// @dev Thrown when an invalid avs whose metadata is not registered is provided.
+ error NonexistentAVSMetadata();
/// @dev Thrown when an operator's allocation delay has yet to be set.
error UninitializedAllocationDelay();
/// @dev Thrown when attempting to slash an operator when they are not slashable.
@@ -213,14 +216,33 @@ interface IAllocationManagerEvents is IAllocationManagerTypes {
event StrategyRemovedFromOperatorSet(OperatorSet operatorSet, IStrategy strategy);
}
-interface IAllocationManager is IAllocationManagerErrors, IAllocationManagerEvents {
+interface IAllocationManager is IAllocationManagerErrors, IAllocationManagerEvents, ISemVerMixin {
/**
* @dev Initializes the initial owner and paused status.
*/
function initialize(address initialOwner, uint256 initialPausedStatus) external;
/**
- * @notice Called by an AVS to slash an operator in a given operator set
+ * @notice Called by an AVS to slash an operator in a given operator set. The operator must be registered
+ * and have slashable stake allocated to the operator set.
+ *
+ * @param avs The AVS address initiating the slash.
+ * @param params The slashing parameters, containing:
+ * - operator: The operator to slash.
+ * - operatorSetId: The ID of the operator set the operator is being slashed from.
+ * - strategies: Array of strategies to slash allocations from (must be in ascending order).
+ * - wadsToSlash: Array of proportions to slash from each strategy (must be between 0 and 1e18).
+ * - description: Description of why the operator was slashed.
+ *
+ * @dev For each strategy:
+ * 1. Reduces the operator's current allocation magnitude by wadToSlash proportion.
+ * 2. Reduces the strategy's max and encumbered magnitudes proportionally.
+ * 3. If there is a pending deallocation, reduces it proportionally.
+ * 4. Updates the operator's shares in the DelegationManager.
+ *
+ * @dev Small slashing amounts may not result in actual token burns due to
+ * rounding, which will result in small amounts of tokens locked in the contract
+ * rather than fully burning through the burn mechanism.
*/
function slashOperator(address avs, SlashingParams calldata params) external;
@@ -400,6 +422,14 @@ interface IAllocationManager is IAllocationManagerErrors, IAllocationManagerEven
IStrategy strategy
) external view returns (OperatorSet[] memory, Allocation[] memory);
+ /**
+ * @notice For a strategy, get the amount of magnitude that is allocated across one or more operator sets
+ * @param operator the operator to query
+ * @param strategy the strategy to get allocatable magnitude for
+ * @return currently allocated magnitude
+ */
+ function getEncumberedMagnitude(address operator, IStrategy strategy) external view returns (uint64);
+
/**
* @notice For a strategy, get the amount of magnitude not currently allocated to any operator set
* @param operator the operator to query
@@ -528,7 +558,8 @@ interface IAllocationManager is IAllocationManagerErrors, IAllocationManagerEven
/**
* @notice Returns the minimum amount of stake that will be slashable as of some future block,
- * according to each operator's allocation from each strategy to the operator set.
+ * according to each operator's allocation from each strategy to the operator set. Note that this function
+ * will return 0 for the slashable stake if the operator is not slashable at the time of the call.
* @dev This method queries actual delegated stakes in the DelegationManager and applies
* each operator's allocation to the stake to produce the slashable stake each allocation
* represents.
@@ -541,7 +572,6 @@ interface IAllocationManager is IAllocationManagerErrors, IAllocationManagerEven
* @param operators the list of operators whose slashable stakes will be returned
* @param strategies the strategies that each slashable stake corresponds to
* @param futureBlock the block at which to get allocation information. Should be a future block.
- * @return slashableStake a list of slashable stakes, indexed by [operator][strategy]
*/
function getMinimumSlashableStake(
OperatorSet memory operatorSet,
@@ -549,4 +579,25 @@ interface IAllocationManager is IAllocationManagerErrors, IAllocationManagerEven
IStrategy[] memory strategies,
uint32 futureBlock
) external view returns (uint256[][] memory slashableStake);
+
+ /**
+ * @notice Returns the current allocated stake, irrespective of the operator's slashable status for the operatorSet.
+ * @param operatorSet the operator set to query
+ * @param operators the operators to query
+ * @param strategies the strategies to query
+ */
+ function getAllocatedStake(
+ OperatorSet memory operatorSet,
+ address[] memory operators,
+ IStrategy[] memory strategies
+ ) external view returns (uint256[][] memory slashableStake);
+
+ /**
+ * @notice Returns whether an operator is slashable by an operator set.
+ * This returns true if the operator is registered or their slashableUntil block has not passed.
+ * This is because even when operators are deregistered, they still remain slashable for a period of time.
+ * @param operator the operator to check slashability for
+ * @param operatorSet the operator set to check slashability for
+ */
+ function isOperatorSlashable(address operator, OperatorSet memory operatorSet) external view returns (bool);
}
diff --git a/src/contracts/interfaces/IDelegationManager.sol b/src/contracts/interfaces/IDelegationManager.sol
index ce57304d64..6a59398278 100644
--- a/src/contracts/interfaces/IDelegationManager.sol
+++ b/src/contracts/interfaces/IDelegationManager.sol
@@ -3,7 +3,7 @@ pragma solidity >=0.5.0;
import "./IStrategy.sol";
import "./IPauserRegistry.sol";
-import "./ISignatureUtils.sol";
+import "./ISignatureUtilsMixin.sol";
import "../libraries/SlashingLib.sol";
interface IDelegationManagerErrors {
@@ -170,6 +170,9 @@ interface IDelegationManagerEvents is IDelegationManagerTypes {
/// @notice Emitted when a queued withdrawal is completed
event SlashingWithdrawalCompleted(bytes32 withdrawalRoot);
+
+ /// @notice Emitted whenever an operator's shares are slashed for a given strategy
+ event OperatorSharesSlashed(address indexed operator, IStrategy strategy, uint256 totalSlashedShares);
}
/**
@@ -182,7 +185,7 @@ interface IDelegationManagerEvents is IDelegationManagerTypes {
* - enabling any staker to delegate its stake to the operator of its choice (a given staker can only delegate to a single operator at a time)
* - enabling a staker to undelegate its assets from the operator it is delegated to (performed as part of the withdrawal process, initiated through the StrategyManager)
*/
-interface IDelegationManager is ISignatureUtils, IDelegationManagerErrors, IDelegationManagerEvents {
+interface IDelegationManager is ISignatureUtilsMixin, IDelegationManagerErrors, IDelegationManagerEvents {
/**
* @dev Initializes the initial owner and paused status.
*/
@@ -468,13 +471,25 @@ interface IDelegationManager is ISignatureUtils, IDelegationManagerErrors, IDele
*/
function depositScalingFactor(address staker, IStrategy strategy) external view returns (uint256);
- /// @notice Returns the Withdrawal associated with a `withdrawalRoot`, if it exists. NOTE that
- /// withdrawals queued before the slashing release can NOT be queried with this method.
+ /**
+ * @notice Returns the Withdrawal and corresponding shares associated with a `withdrawalRoot`
+ * @param withdrawalRoot The hash identifying the queued withdrawal
+ * @return withdrawal The withdrawal details
+ * @return shares Array of shares corresponding to each strategy in the withdrawal
+ * @dev The shares are what a user would receive from completing a queued withdrawal, assuming all slashings are applied
+ * @dev Withdrawals queued before the slashing release cannot be queried with this method
+ */
function getQueuedWithdrawal(
bytes32 withdrawalRoot
- ) external view returns (Withdrawal memory);
+ ) external view returns (Withdrawal memory withdrawal, uint256[] memory shares);
- /// @notice Returns a list of pending queued withdrawals for a `staker`, and the `shares` to be withdrawn.
+ /**
+ * @notice Returns all queued withdrawals and their corresponding shares for a staker.
+ * @param staker The address of the staker to query withdrawals for.
+ * @return withdrawals Array of Withdrawal structs containing details about each queued withdrawal.
+ * @return shares 2D array of shares, where each inner array corresponds to the strategies in the withdrawal.
+ * @dev The shares are what a user would receive from completing a queued withdrawal, assuming all slashings are applied.
+ */
function getQueuedWithdrawals(
address staker
) external view returns (Withdrawal[] memory withdrawals, uint256[][] memory shares);
diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol
index 5f354e7cd4..83dc8d8211 100644
--- a/src/contracts/interfaces/IEigenPod.sol
+++ b/src/contracts/interfaces/IEigenPod.sol
@@ -4,6 +4,7 @@ pragma solidity >=0.5.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../libraries/BeaconChainProofs.sol";
+import "./ISemVerMixin.sol";
import "./IEigenPodManager.sol";
interface IEigenPodErrors {
@@ -138,7 +139,7 @@ interface IEigenPodEvents is IEigenPodTypes {
* @dev Note that all beacon chain balances are stored as gwei within the beacon chain datastructures. We choose
* to account balances in terms of gwei in the EigenPod contract and convert to wei when making calls to other contracts
*/
-interface IEigenPod is IEigenPodErrors, IEigenPodEvents {
+interface IEigenPod is IEigenPodErrors, IEigenPodEvents, ISemVerMixin {
/// @notice Used to initialize the pointers to contracts crucial to the pod's functionality, in beacon proxy construction from EigenPodManager
function initialize(
address owner
diff --git a/src/contracts/interfaces/IEigenPodManager.sol b/src/contracts/interfaces/IEigenPodManager.sol
index baf574cde8..afb384b744 100644
--- a/src/contracts/interfaces/IEigenPodManager.sol
+++ b/src/contracts/interfaces/IEigenPodManager.sol
@@ -8,6 +8,7 @@ import "./IEigenPod.sol";
import "./IShareManager.sol";
import "./IPausable.sol";
import "./IStrategy.sol";
+import "./ISemVerMixin.sol";
interface IEigenPodManagerErrors {
/// @dev Thrown when caller is not a EigenPod.
@@ -85,7 +86,8 @@ interface IEigenPodManager is
IEigenPodManagerEvents,
IEigenPodManagerTypes,
IShareManager,
- IPausable
+ IPausable,
+ ISemVerMixin
{
/**
* @notice Creates an EigenPod for the sender.
diff --git a/src/contracts/interfaces/IPermissionController.sol b/src/contracts/interfaces/IPermissionController.sol
index 6881289355..b8e2153736 100644
--- a/src/contracts/interfaces/IPermissionController.sol
+++ b/src/contracts/interfaces/IPermissionController.sol
@@ -1,142 +1,157 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.27;
+import "./ISemVerMixin.sol";
+
interface IPermissionControllerErrors {
- /// @notice Thrown when the caller is not the admin
+ /// @notice Thrown when a non-admin caller attempts to perform an admin-only action.
error NotAdmin();
- /// @notice Thrown when the admin to remove is not an admin
+ /// @notice Thrown when attempting to remove an admin that does not exist.
error AdminNotSet();
- /// @notice Thrown when an appointee is already set for the account's function
+ /// @notice Thrown when attempting to set an appointee for a function that already has one.
error AppointeeAlreadySet();
- /// @notice Thrown when an appointee is not set for the account's function
+ /// @notice Thrown when attempting to interact with a non-existent appointee.
error AppointeeNotSet();
- /// @notice Thrown when the account attempts to remove the only admin
+ /// @notice Thrown when attempting to remove the last remaining admin.
error CannotHaveZeroAdmins();
- /// @notice Thrown when an admin is already set
+ /// @notice Thrown when attempting to set an admin that is already registered.
error AdminAlreadySet();
- /// @notice Thrown when an admin is not pending
+ /// @notice Thrown when attempting to interact with an admin that is not in pending status.
error AdminNotPending();
- /// @notice Thrown when an admin is already pending
+ /// @notice Thrown when attempting to add an admin that is already pending.
error AdminAlreadyPending();
}
interface IPermissionControllerEvents {
- /// @notice Emitted when an appointee is set
+ /// @notice Emitted when an appointee is set for an account to handle specific function calls.
event AppointeeSet(address indexed account, address indexed appointee, address target, bytes4 selector);
- /// @notice Emitted when an appointee is revoked
+ /// @notice Emitted when an appointee's permission to handle function calls for an account is revoked.
event AppointeeRemoved(address indexed account, address indexed appointee, address target, bytes4 selector);
- /// @notice Emitted when an admin is set as pending for an account
+ /// @notice Emitted when an address is set as a pending admin for an account, requiring acceptance.
event PendingAdminAdded(address indexed account, address admin);
- /// @notice Emitted when an admin is removed as pending for an account
+ /// @notice Emitted when a pending admin status is removed for an account before acceptance.
event PendingAdminRemoved(address indexed account, address admin);
- /// @notice Emitted when an admin is set for a given account
+ /// @notice Emitted when an address accepts and becomes an active admin for an account.
event AdminSet(address indexed account, address admin);
- /// @notice Emitted when an admin is removed for a given account
+ /// @notice Emitted when an admin's permissions are removed from an account.
event AdminRemoved(address indexed account, address admin);
}
-interface IPermissionController is IPermissionControllerErrors, IPermissionControllerEvents {
+interface IPermissionController is IPermissionControllerErrors, IPermissionControllerEvents, ISemVerMixin {
/**
- * @notice Sets a pending admin of an account
- * @param account to set pending admin for
- * @param admin to set
- * @dev Multiple admins can be set for an account
+ * @notice Sets a pending admin for an account.
+ * @param account The account to set the pending admin for.
+ * @param admin The address to set as pending admin.
+ * @dev The pending admin must accept the role before becoming an active admin.
+ * @dev Multiple admins can be set for a single account.
*/
function addPendingAdmin(address account, address admin) external;
/**
- * @notice Removes a pending admin of an account
- * @param account to remove pending admin for
- * @param admin to remove
- * @dev Only the admin of the account can remove a pending admin
+ * @notice Removes a pending admin from an account before they have accepted the role.
+ * @param account The account to remove the pending admin from.
+ * @param admin The pending admin address to remove.
+ * @dev Only an existing admin of the account can remove a pending admin.
*/
function removePendingAdmin(address account, address admin) external;
/**
- * @notice Accepts the admin role of an account
- * @param account to accept admin for
- * @dev Only a pending admin for the account can become an admin
+ * @notice Allows a pending admin to accept their admin role for an account.
+ * @param account The account to accept the admin role for.
+ * @dev Only addresses that were previously set as pending admins can accept the role.
*/
function acceptAdmin(
address account
) external;
/**
- * @notice Remove an admin of an account
- * @param account to remove admin for
- * @param admin to remove
- * @dev Only the admin of the account can remove an admin
- * @dev Reverts when an admin is removed such that no admins are remaining
+ * @notice Removes an active admin from an account.
+ * @param account The account to remove the admin from.
+ * @param admin The admin address to remove.
+ * @dev Only an existing admin of the account can remove another admin.
+ * @dev Will revert if removing this admin would leave the account with zero admins.
*/
function removeAdmin(address account, address admin) external;
/**
- * @notice Set an appointee for a given account
- * @param account to set appointee for
- * @param appointee to set
- * @param target to set appointee for
- * @param selector to set appointee for
- * @dev Only the admin of the account can set an appointee
+ * @notice Sets an appointee who can call specific functions on behalf of an account.
+ * @param account The account to set the appointee for.
+ * @param appointee The address to be given permission.
+ * @param target The contract address the appointee can interact with.
+ * @param selector The function selector the appointee can call.
+ * @dev Only an admin of the account can set appointees.
*/
function setAppointee(address account, address appointee, address target, bytes4 selector) external;
/**
- * Removes an appointee for a given account
- * @param account to remove appointee for
- * @param appointee to remove
- * @param target to remove appointee for
- * @param selector to remove appointee for
- * @dev Only the admin of the account can remove an appointee
+ * @notice Removes an appointee's permission to call a specific function.
+ * @param account The account to remove the appointee from.
+ * @param appointee The appointee address to remove.
+ * @param target The contract address to remove permissions for.
+ * @param selector The function selector to remove permissions for.
+ * @dev Only an admin of the account can remove appointees.
*/
function removeAppointee(address account, address appointee, address target, bytes4 selector) external;
/**
- * @notice Checks if the given caller is an admin of the account
- * @dev If the account has no admin, the caller is checked to be the account itself
+ * @notice Checks if a given address is an admin of an account.
+ * @param account The account to check admin status for.
+ * @param caller The address to check.
+ * @dev If the account has no admins, returns true only if the caller is the account itself.
+ * @return Returns true if the caller is an admin, false otherwise.
*/
function isAdmin(address account, address caller) external view returns (bool);
/**
- * @notice Checks if the `pendingAdmin` is a pending admin of the `account`
+ * @notice Checks if an address is currently a pending admin for an account.
+ * @param account The account to check pending admin status for.
+ * @param pendingAdmin The address to check.
+ * @return Returns true if the address is a pending admin, false otherwise.
*/
function isPendingAdmin(address account, address pendingAdmin) external view returns (bool);
/**
- * @notice Get the admins of an account
- * @param account The account to get the admin of
- * @dev If the account has no admin, the account itself is returned
+ * @notice Retrieves all active admins for an account.
+ * @param account The account to get the admins for.
+ * @dev If the account has no admins, returns an array containing only the account address.
+ * @return An array of admin addresses.
*/
function getAdmins(
address account
) external view returns (address[] memory);
/**
- * @notice Get the pending admins of an account
- * @param account The account to get the pending admin of
+ * @notice Retrieves all pending admins for an account.
+ * @param account The account to get the pending admins for.
+ * @return An array of pending admin addresses.
*/
function getPendingAdmins(
address account
) external view returns (address[] memory);
/**
- * @notice Checks if the given caller has permissions to call the function
- * @param account to check
- * @param caller to check permission for
- * @param target to check permission for
- * @param selector to check permission for
- * @dev Returns `true` if the admin OR the appointee is the caller
+ * @notice Checks if a caller has permission to call a specific function.
+ * @param account The account to check permissions for.
+ * @param caller The address attempting to make the call.
+ * @param target The contract address being called.
+ * @param selector The function selector being called.
+ * @dev Returns true if the caller is either an admin or an appointed caller.
+ * @dev Be mindful that upgrades to the contract may invalidate the appointee's permissions.
+ * This is only possible if a function's selector changes (e.g. if a function's parameters are modified).
+ * @return Returns true if the caller has permission, false otherwise.
*/
function canCall(address account, address caller, address target, bytes4 selector) external returns (bool);
/**
- * @notice Gets the list of permissions of an appointee for a given account
- * @param account to get appointee permissions for
- * @param appointee to get permissions
+ * @notice Retrieves all permissions granted to an appointee for a given account.
+ * @param account The account to check appointee permissions for.
+ * @param appointee The appointee address to check.
+ * @return Two arrays: target contract addresses and their corresponding function selectors.
*/
function getAppointeePermissions(
address account,
@@ -144,11 +159,12 @@ interface IPermissionController is IPermissionControllerErrors, IPermissionContr
) external returns (address[] memory, bytes4[] memory);
/**
- * @notice Returns the list of appointees for a given account and function
- * @param account to get appointees for
- * @param target to get appointees for
- * @param selector to get appointees for
- * @dev Does NOT include admin as an appointee, even though it can call
+ * @notice Retrieves all appointees that can call a specific function for an account.
+ * @param account The account to get appointees for.
+ * @param target The contract address to check.
+ * @param selector The function selector to check.
+ * @dev Does not include admins in the returned list, even though they have calling permission.
+ * @return An array of appointee addresses.
*/
function getAppointees(address account, address target, bytes4 selector) external returns (address[] memory);
}
diff --git a/src/contracts/interfaces/IRewardsCoordinator.sol b/src/contracts/interfaces/IRewardsCoordinator.sol
index 953c435561..a449e98bbf 100644
--- a/src/contracts/interfaces/IRewardsCoordinator.sol
+++ b/src/contracts/interfaces/IRewardsCoordinator.sol
@@ -3,8 +3,14 @@ pragma solidity ^0.8.27;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../libraries/OperatorSetLib.sol";
+
+import "./IAllocationManager.sol";
+import "./IDelegationManager.sol";
+import "./IStrategyManager.sol";
import "./IPauserRegistry.sol";
+import "./IPermissionController.sol";
import "./IStrategy.sol";
+import "./ISemVerMixin.sol";
interface IRewardsCoordinatorErrors {
/// @dev Thrown when msg.sender is not allowed to call a function
@@ -237,6 +243,35 @@ interface IRewardsCoordinatorTypes {
bytes[] tokenTreeProofs;
TokenTreeMerkleLeaf[] tokenLeaves;
}
+
+ /**
+ * @notice Parameters for the RewardsCoordinator constructor
+ * @param delegationManager The address of the DelegationManager contract
+ * @param strategyManager The address of the StrategyManager contract
+ * @param allocationManager The address of the AllocationManager contract
+ * @param pauserRegistry The address of the PauserRegistry contract
+ * @param permissionController The address of the PermissionController contract
+ * @param CALCULATION_INTERVAL_SECONDS The interval at which rewards are calculated
+ * @param MAX_REWARDS_DURATION The maximum duration of a rewards submission
+ * @param MAX_RETROACTIVE_LENGTH The maximum retroactive length of a rewards submission
+ * @param MAX_FUTURE_LENGTH The maximum future length of a rewards submission
+ * @param GENESIS_REWARDS_TIMESTAMP The timestamp at which rewards are first calculated
+ * @param version The semantic version of the contract (e.g. "v1.2.3")
+ * @dev Needed to avoid stack-too-deep errors
+ */
+ struct RewardsCoordinatorConstructorParams {
+ IDelegationManager delegationManager;
+ IStrategyManager strategyManager;
+ IAllocationManager allocationManager;
+ IPauserRegistry pauserRegistry;
+ IPermissionController permissionController;
+ uint32 CALCULATION_INTERVAL_SECONDS;
+ uint32 MAX_REWARDS_DURATION;
+ uint32 MAX_RETROACTIVE_LENGTH;
+ uint32 MAX_FUTURE_LENGTH;
+ uint32 GENESIS_REWARDS_TIMESTAMP;
+ string version;
+ }
}
interface IRewardsCoordinatorEvents is IRewardsCoordinatorTypes {
@@ -390,7 +425,7 @@ interface IRewardsCoordinatorEvents is IRewardsCoordinatorTypes {
* Calculations are performed based on the completed RewardsSubmission, with the results posted in
* a Merkle root against which Stakers & Operators can make claims.
*/
-interface IRewardsCoordinator is IRewardsCoordinatorErrors, IRewardsCoordinatorEvents {
+interface IRewardsCoordinator is IRewardsCoordinatorErrors, IRewardsCoordinatorEvents, ISemVerMixin {
/**
* @dev Initializes the addresses of the initial owner, pauser registry, rewardsUpdater and
* configures the initial paused status, activationDelay, and defaultOperatorSplitBips.
diff --git a/src/contracts/interfaces/ISemVerMixin.sol b/src/contracts/interfaces/ISemVerMixin.sol
new file mode 100644
index 0000000000..206cf38d46
--- /dev/null
+++ b/src/contracts/interfaces/ISemVerMixin.sol
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.0;
+
+/// @title ISemVerMixin
+/// @notice A mixin interface that provides semantic versioning functionality.
+/// @dev Follows SemVer 2.0.0 specification (https://semver.org/)
+interface ISemVerMixin {
+ /// @notice Returns the semantic version string of the contract.
+ /// @return The version string in SemVer format (e.g., "v1.1.1")
+ function version() external view returns (string memory);
+}
diff --git a/src/contracts/interfaces/IShareManager.sol b/src/contracts/interfaces/IShareManager.sol
index 756c62c05f..4d2d66e9ff 100644
--- a/src/contracts/interfaces/IShareManager.sol
+++ b/src/contracts/interfaces/IShareManager.sol
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.27;
-import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../libraries/SlashingLib.sol";
import "./IStrategy.sol";
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
/**
* @title Interface for a `IShareManager` contract.
@@ -14,19 +14,18 @@ import "./IStrategy.sol";
interface IShareManager {
/// @notice Used by the DelegationManager to remove a Staker's shares from a particular strategy when entering the withdrawal queue
/// @dev strategy must be beaconChainETH when talking to the EigenPodManager
- function removeDepositShares(address staker, IStrategy strategy, uint256 depositSharesToRemove) external;
+ /// @return updatedShares the staker's deposit shares after decrement
+ function removeDepositShares(
+ address staker,
+ IStrategy strategy,
+ uint256 depositSharesToRemove
+ ) external returns (uint256);
/// @notice Used by the DelegationManager to award a Staker some shares that have passed through the withdrawal queue
/// @dev strategy must be beaconChainETH when talking to the EigenPodManager
- /// @dev token is not validated; it is only emitted as an event
/// @return existingDepositShares the shares the staker had before any were added
/// @return addedShares the new shares added to the staker's balance
- function addShares(
- address staker,
- IStrategy strategy,
- IERC20 token,
- uint256 shares
- ) external returns (uint256, uint256);
+ function addShares(address staker, IStrategy strategy, uint256 shares) external returns (uint256, uint256);
/// @notice Used by the DelegationManager to convert deposit shares to tokens and send them to a staker
/// @dev strategy must be beaconChainETH when talking to the EigenPodManager
diff --git a/src/contracts/interfaces/ISignatureUtils.sol b/src/contracts/interfaces/ISignatureUtils.sol
deleted file mode 100644
index 9e1ac2b45d..0000000000
--- a/src/contracts/interfaces/ISignatureUtils.sol
+++ /dev/null
@@ -1,30 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity >=0.5.0;
-
-/**
- * @title The interface for common signature utilities.
- * @author Layr Labs, Inc.
- * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
- */
-interface ISignatureUtils {
- error InvalidSignature();
- error SignatureExpired();
-
- // @notice Struct that bundles together a signature and an expiration time for the signature. Used primarily for stack management.
- struct SignatureWithExpiry {
- // the signature itself, formatted as a single bytes object
- bytes signature;
- // the expiration timestamp (UTC) of the signature
- uint256 expiry;
- }
-
- // @notice Struct that bundles together a signature, a salt for uniqueness, and an expiration time for the signature. Used primarily for stack management.
- struct SignatureWithSaltAndExpiry {
- // the signature itself, formatted as a single bytes object
- bytes signature;
- // the salt used to generate the signature
- bytes32 salt;
- // the expiration timestamp (UTC) of the signature
- uint256 expiry;
- }
-}
diff --git a/src/contracts/interfaces/ISignatureUtilsMixin.sol b/src/contracts/interfaces/ISignatureUtilsMixin.sol
new file mode 100644
index 0000000000..7b9c8c372f
--- /dev/null
+++ b/src/contracts/interfaces/ISignatureUtilsMixin.sol
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity >=0.5.0;
+
+import "./ISemVerMixin.sol";
+
+interface ISignatureUtilsMixinErrors {
+ /// @notice Thrown when a signature is invalid.
+ error InvalidSignature();
+ /// @notice Thrown when a signature has expired.
+ error SignatureExpired();
+}
+
+interface ISignatureUtilsMixinTypes {
+ /// @notice Struct that bundles together a signature and an expiration time for the signature.
+ /// @dev Used primarily for stack management.
+ struct SignatureWithExpiry {
+ // the signature itself, formatted as a single bytes object
+ bytes signature;
+ // the expiration timestamp (UTC) of the signature
+ uint256 expiry;
+ }
+
+ /// @notice Struct that bundles together a signature, a salt for uniqueness, and an expiration time for the signature.
+ /// @dev Used primarily for stack management.
+ struct SignatureWithSaltAndExpiry {
+ // the signature itself, formatted as a single bytes object
+ bytes signature;
+ // the salt used to generate the signature
+ bytes32 salt;
+ // the expiration timestamp (UTC) of the signature
+ uint256 expiry;
+ }
+}
+
+/**
+ * @title The interface for common signature utilities.
+ * @author Layr Labs, Inc.
+ * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
+ */
+interface ISignatureUtilsMixin is ISignatureUtilsMixinErrors, ISignatureUtilsMixinTypes, ISemVerMixin {
+ /// @notice Computes the EIP-712 domain separator used for signature validation.
+ /// @dev The domain separator is computed according to EIP-712 specification, using:
+ /// - The hardcoded name "EigenLayer"
+ /// - The contract's version string
+ /// - The current chain ID
+ /// - This contract's address
+ /// @return The 32-byte domain separator hash used in EIP-712 structured data signing.
+ /// @dev See https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator.
+ function domainSeparator() external view returns (bytes32);
+}
diff --git a/src/contracts/interfaces/IStrategy.sol b/src/contracts/interfaces/IStrategy.sol
index 3052cba1c4..79e95302ca 100644
--- a/src/contracts/interfaces/IStrategy.sol
+++ b/src/contracts/interfaces/IStrategy.sol
@@ -3,6 +3,7 @@ pragma solidity >=0.5.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../libraries/SlashingLib.sol";
+import "./ISemVerMixin.sol";
interface IStrategyErrors {
/// @dev Thrown when called by an account that is not strategy manager.
@@ -47,7 +48,7 @@ interface IStrategyEvents {
* @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
* @notice Custom `Strategy` implementations may expand extensively on this interface.
*/
-interface IStrategy is IStrategyErrors, IStrategyEvents {
+interface IStrategy is IStrategyErrors, IStrategyEvents, ISemVerMixin {
/**
* @notice Used to deposit tokens into this Strategy
* @param token is the ERC20 token being deposited
diff --git a/src/contracts/interfaces/IStrategyFactory.sol b/src/contracts/interfaces/IStrategyFactory.sol
index 137659cc34..c019695b4a 100644
--- a/src/contracts/interfaces/IStrategyFactory.sol
+++ b/src/contracts/interfaces/IStrategyFactory.sol
@@ -4,6 +4,7 @@ pragma solidity ^0.8.27;
import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./IStrategy.sol";
+import "./ISemVerMixin.sol";
/**
* @title Interface for the `StrategyFactory` contract.
@@ -11,7 +12,7 @@ import "./IStrategy.sol";
* @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
* @dev This may not be compatible with non-standard ERC20 tokens. Caution is warranted.
*/
-interface IStrategyFactory {
+interface IStrategyFactory is ISemVerMixin {
/// @dev Thrown when attempting to deploy a strategy for a blacklisted token.
error BlacklistedToken();
/// @dev Thrown when attempting to deploy a strategy that already exists.
diff --git a/src/contracts/interfaces/IStrategyManager.sol b/src/contracts/interfaces/IStrategyManager.sol
index 25808d2637..2af48d4386 100644
--- a/src/contracts/interfaces/IStrategyManager.sol
+++ b/src/contracts/interfaces/IStrategyManager.sol
@@ -5,6 +5,7 @@ import "./IStrategy.sol";
import "./IShareManager.sol";
import "./IDelegationManager.sol";
import "./IEigenPodManager.sol";
+import "./ISemVerMixin.sol";
interface IStrategyManagerErrors {
/// @dev Thrown when total strategies deployed exceeds max.
@@ -30,10 +31,9 @@ interface IStrategyManagerEvents {
* @notice Emitted when a new deposit occurs on behalf of `staker`.
* @param staker Is the staker who is depositing funds into EigenLayer.
* @param strategy Is the strategy that `staker` has deposited into.
- * @param token Is the token that `staker` deposited.
* @param shares Is the number of new shares `staker` has been granted in `strategy`.
*/
- event Deposit(address staker, IERC20 token, IStrategy strategy, uint256 shares);
+ event Deposit(address staker, IStrategy strategy, uint256 shares);
/// @notice Emitted when the `strategyWhitelister` is changed
event StrategyWhitelisterChanged(address previousAddress, address newAddress);
@@ -57,7 +57,7 @@ interface IStrategyManagerEvents {
* @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
* @notice See the `StrategyManager` contract itself for implementation details.
*/
-interface IStrategyManager is IStrategyManagerErrors, IStrategyManagerEvents, IShareManager {
+interface IStrategyManager is IStrategyManagerErrors, IStrategyManagerEvents, IShareManager, ISemVerMixin {
/**
* @notice Initializes the strategy manager contract. Sets the `pauserRegistry` (currently **not** modifiable after being set),
* and transfers contract ownership to the specified `initialOwner`.
@@ -179,6 +179,21 @@ interface IStrategyManager is IStrategyManagerErrors, IStrategyManagerEvents, IS
/// @notice Returns the address of the `strategyWhitelister`
function strategyWhitelister() external view returns (address);
+ /// @notice Returns the burnable shares of a strategy
+ function getBurnableShares(
+ IStrategy strategy
+ ) external view returns (uint256);
+
+ /**
+ * @notice Gets every strategy with burnable shares and the amount of burnable shares in each said strategy
+ *
+ * WARNING: This operation can copy the entire storage to memory, which can be quite expensive. This is designed
+ * to mostly be used by view accessors that are queried without any gas fees. Users should keep in mind that
+ * this function has an unbounded cost, and using it as part of a state-changing function may render the function
+ * uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
+ */
+ function getStrategiesWithBurnableShares() external view returns (address[] memory, uint256[] memory);
+
/**
* @param staker The address of the staker.
* @param strategy The strategy to deposit into.
diff --git a/src/contracts/libraries/OperatorSetLib.sol b/src/contracts/libraries/OperatorSetLib.sol
index eb761b0b45..0b1ae4808d 100644
--- a/src/contracts/libraries/OperatorSetLib.sol
+++ b/src/contracts/libraries/OperatorSetLib.sol
@@ -1,6 +1,8 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.27;
+using OperatorSetLib for OperatorSet global;
+
/**
* @notice An operator set identified by the AVS address and an identifier
* @param avs The address of the AVS this operator set belongs to
diff --git a/src/contracts/libraries/SlashingLib.sol b/src/contracts/libraries/SlashingLib.sol
index b6ce24151c..f608480f08 100644
--- a/src/contracts/libraries/SlashingLib.sol
+++ b/src/contracts/libraries/SlashingLib.sol
@@ -55,13 +55,6 @@ library SlashingLib {
return x.mulDiv(y, WAD, Math.Rounding.Up);
}
- /**
- * @notice Used as part of calculating wadSlashed in the EPM to ensure that we don't overslash
- */
- function divWadRoundUp(uint256 x, uint256 y) internal pure returns (uint256) {
- return x.mulDiv(WAD, y, Math.Rounding.Up);
- }
-
// GETTERS
function scalingFactor(
@@ -101,10 +94,11 @@ library SlashingLib {
uint256 addedShares,
uint256 slashingFactor
) internal {
- // If this is the staker's first deposit, set the scaling factor to
- // the inverse of slashingFactor
if (prevDepositShares == 0) {
- dsf._scalingFactor = uint256(WAD).divWad(slashingFactor);
+ // If this is the staker's first deposit or they are delegating to an operator,
+ // the slashing factor is inverted and applied to the existing DSF. This has the
+ // effect of "forgiving" prior slashing for any subsequent deposits.
+ dsf._scalingFactor = dsf.scalingFactor().divWad(slashingFactor);
return;
}
@@ -143,6 +137,18 @@ library SlashingLib {
dsf._scalingFactor = newDepositScalingFactor;
}
+ /// @dev Reset the staker's DSF for a strategy by setting it to 0. This is the same
+ /// as setting it to WAD (see the `scalingFactor` getter above).
+ ///
+ /// A DSF is reset when a staker reduces their deposit shares to 0, either by queueing
+ /// a withdrawal, or undelegating from their operator. This ensures that subsequent
+ /// delegations/deposits do not use a stale DSF (e.g. from a prior operator).
+ function reset(
+ DepositScalingFactor storage dsf
+ ) internal {
+ dsf._scalingFactor = 0;
+ }
+
// CONVERSION
function calcWithdrawable(
diff --git a/src/contracts/mixins/SemVerMixin.sol b/src/contracts/mixins/SemVerMixin.sol
new file mode 100644
index 0000000000..c955de4f8b
--- /dev/null
+++ b/src/contracts/mixins/SemVerMixin.sol
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.0;
+
+import "../interfaces/ISemVerMixin.sol";
+import "@openzeppelin-upgrades/contracts/utils/ShortStringsUpgradeable.sol";
+
+/// @title SemVerMixin
+/// @notice A mixin contract that provides semantic versioning functionality.
+/// @dev Follows SemVer 2.0.0 specification (https://semver.org/).
+abstract contract SemVerMixin is ISemVerMixin {
+ using ShortStringsUpgradeable for *;
+
+ /// @notice The semantic version string for this contract, stored as a ShortString for gas efficiency.
+ /// @dev Follows SemVer 2.0.0 specification (https://semver.org/). Prefixed with 'v' (e.g., "v1.2.3").
+ ShortString internal immutable _VERSION;
+
+ /// @notice Initializes the contract with a semantic version string.
+ /// @param _version The SemVer-formatted version string (e.g., "v1.2.3")
+ /// @dev Version should follow SemVer 2.0.0 format with 'v' prefix: vMAJOR.MINOR.PATCH
+ constructor(
+ string memory _version
+ ) {
+ _VERSION = _version.toShortString();
+ }
+
+ /// @inheritdoc ISemVerMixin
+ function version() public view virtual returns (string memory) {
+ return _VERSION.toString();
+ }
+
+ /// @notice Returns the major version of the contract.
+ /// @dev Supports single digit major versions (e.g., "v1" for version "v1.2.3")
+ /// @return The major version string (e.g., "v1" for version "v1.2.3")
+ function _majorVersion() internal view returns (string memory) {
+ bytes memory v = bytes(_VERSION.toString());
+ return string(bytes.concat(v[0], v[1]));
+ }
+}
diff --git a/src/contracts/mixins/SignatureUtils.sol b/src/contracts/mixins/SignatureUtils.sol
deleted file mode 100644
index 18f9c89844..0000000000
--- a/src/contracts/mixins/SignatureUtils.sol
+++ /dev/null
@@ -1,85 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.0;
-
-import "@openzeppelin-upgrades/contracts/utils/cryptography/SignatureCheckerUpgradeable.sol";
-
-import "../interfaces/ISignatureUtils.sol";
-
-/// @title SignatureUtils
-/// @notice A mixin to provide EIP-712 signature validation utilities.
-/// @dev Domain name is hardcoded to "EigenLayer".
-abstract contract SignatureUtils is ISignatureUtils {
- using SignatureCheckerUpgradeable for address;
-
- /// CONSTANTS
-
- /// @notice The EIP-712 typehash for the contract's domain.
- bytes32 internal constant EIP712_DOMAIN_TYPEHASH =
- keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
-
- /// @dev Returns the original chain ID from the time the contract was deployed.
- uint256 internal immutable _INITIAL_CHAIN_ID;
-
- /// @dev Returns the original domain separator from the time the contract was deployed.
- bytes32 internal immutable _INITIAL_DOMAIN_SEPARATOR;
-
- /// CONSTRUCTION
-
- constructor() {
- _INITIAL_CHAIN_ID = block.chainid;
- _INITIAL_DOMAIN_SEPARATOR = _calculateDomainSeparator();
- }
-
- /// EXTERNAL FUNCTIONS
-
- /**
- * @notice Returns the current EIP-712 domain separator for this contract.
- *
- * @dev The domain separator will change in the event of a fork that changes the ChainID.
- * @dev By introducing a domain separator the DApp developers are guaranteed that there can be no signature collision.
- * for more detailed information please read EIP-712.
- * @dev Use `_calculateDomainSeparator` rather than using this function.
- */
- function domainSeparator() public view virtual returns (bytes32) {
- /// forgefmt: disable-next-item
- return block.chainid == _INITIAL_CHAIN_ID
- // If the chain ID is the same, return the original domain separator.
- ? _INITIAL_DOMAIN_SEPARATOR
- // If the chain ID is different, return the new domain separator.
- : _calculateDomainSeparator();
- }
-
- /// INTERNAL HELPERS
-
- /// @dev Helper for calculating the contract's domain separator.
- function _calculateDomainSeparator() internal view returns (bytes32) {
- /// forgefmt: disable-next-item
- return
- keccak256(
- abi.encode(
- EIP712_DOMAIN_TYPEHASH,
- keccak256(bytes("EigenLayer")),
- block.chainid,
- address(this)
- )
- );
- }
-
- /// @dev Helper for creating valid EIP-712 signable digests.
- function _calculateSignableDigest(
- bytes32 hash
- ) internal view returns (bytes32) {
- return keccak256(abi.encodePacked("\x19\x01", domainSeparator(), hash));
- }
-
- /// @dev Helper for checking if a signature is valid, reverts if not valid.
- function _checkIsValidSignatureNow(
- address signer,
- bytes32 signableDigest,
- bytes memory signature,
- uint256 expiry
- ) internal view {
- require(expiry >= block.timestamp, SignatureExpired());
- require(signer.isValidSignatureNow(signableDigest, signature), InvalidSignature());
- }
-}
diff --git a/src/contracts/mixins/SignatureUtilsMixin.sol b/src/contracts/mixins/SignatureUtilsMixin.sol
new file mode 100644
index 0000000000..10b33ad61c
--- /dev/null
+++ b/src/contracts/mixins/SignatureUtilsMixin.sol
@@ -0,0 +1,87 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.0;
+
+import "@openzeppelin-upgrades/contracts/utils/ShortStringsUpgradeable.sol";
+import "@openzeppelin-upgrades/contracts/utils/cryptography/SignatureCheckerUpgradeable.sol";
+
+import "../interfaces/ISignatureUtilsMixin.sol";
+import "./SemVerMixin.sol";
+
+/// @dev The EIP-712 domain type hash used for computing the domain separator
+/// See https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator
+bytes32 constant EIP712_DOMAIN_TYPEHASH =
+ keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
+
+/// @title SignatureUtilsMixin
+/// @notice A mixin contract that provides utilities for validating signatures according to EIP-712 and EIP-1271 standards.
+/// @dev The domain name is hardcoded to "EigenLayer". This contract implements signature validation functionality that can be
+/// inherited by other contracts. The domain separator uses the major version (e.g., "v1") to maintain EIP-712
+/// signature compatibility across minor and patch version updates.
+abstract contract SignatureUtilsMixin is ISignatureUtilsMixin, SemVerMixin {
+ using SignatureCheckerUpgradeable for address;
+
+ /// @notice Initializes the contract with a semantic version string.
+ /// @param _version The SemVer-formatted version string (e.g., "v1.1.1") to use for this contract's domain separator.
+ /// @dev Version should follow SemVer 2.0.0 format with 'v' prefix: vMAJOR.MINOR.PATCH.
+ /// Only the major version component is used in the domain separator to maintain signature compatibility
+ /// across minor and patch version updates.
+ constructor(
+ string memory _version
+ ) SemVerMixin(_version) {}
+
+ /// EXTERNAL FUNCTIONS ///
+
+ /// @inheritdoc ISignatureUtilsMixin
+ function domainSeparator() public view virtual returns (bytes32) {
+ // forgefmt: disable-next-item
+ return
+ keccak256(
+ abi.encode(
+ EIP712_DOMAIN_TYPEHASH,
+ keccak256(bytes("EigenLayer")),
+ keccak256(bytes(_majorVersion())),
+ block.chainid,
+ address(this)
+ )
+ );
+ }
+
+ /// INTERNAL HELPERS ///
+
+ /// @notice Creates a digest that can be signed using EIP-712.
+ /// @dev Prepends the EIP-712 prefix ("\x19\x01") and domain separator to the input hash.
+ /// This follows the EIP-712 specification for creating structured data hashes.
+ /// See https://eips.ethereum.org/EIPS/eip-712#specification.
+ /// @param hash The hash of the typed data to be signed.
+ /// @return The complete digest that should be signed according to EIP-712.
+ function _calculateSignableDigest(
+ bytes32 hash
+ ) internal view returns (bytes32) {
+ return keccak256(abi.encodePacked("\x19\x01", domainSeparator(), hash));
+ }
+
+ /// @notice Validates a signature against a signer and digest, with an expiry timestamp.
+ /// @dev Reverts if the signature is invalid or expired. Uses EIP-1271 for smart contract signers.
+ /// For EOA signers, validates ECDSA signatures directly.
+ /// For contract signers, calls isValidSignature according to EIP-1271.
+ /// See https://eips.ethereum.org/EIPS/eip-1271#specification.
+ /// @param signer The address that should have signed the digest.
+ /// @param signableDigest The digest that was signed, created via _calculateSignableDigest.
+ /// @param signature The signature bytes to validate.
+ /// @param expiry The timestamp after which the signature is no longer valid.
+ function _checkIsValidSignatureNow(
+ address signer,
+ bytes32 signableDigest,
+ bytes memory signature,
+ uint256 expiry
+ ) internal view {
+ // First, check if the signature has expired by comparing the expiry timestamp
+ // against the current block timestamp.
+ require(expiry >= block.timestamp, SignatureExpired());
+
+ // Next, verify that the signature is valid for the given signer and digest.
+ // For EOA signers, this performs standard ECDSA signature verification.
+ // For contract signers, this calls the EIP-1271 isValidSignature method.
+ require(signer.isValidSignatureNow(signableDigest, signature), InvalidSignature());
+ }
+}
diff --git a/src/contracts/permissions/PermissionController.sol b/src/contracts/permissions/PermissionController.sol
index 46bdea5bde..ee367d79d8 100644
--- a/src/contracts/permissions/PermissionController.sol
+++ b/src/contracts/permissions/PermissionController.sol
@@ -2,9 +2,10 @@
pragma solidity ^0.8.27;
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
+import "../mixins/SemVerMixin.sol";
import "./PermissionControllerStorage.sol";
-contract PermissionController is Initializable, PermissionControllerStorage {
+contract PermissionController is Initializable, SemVerMixin, PermissionControllerStorage {
using EnumerableSet for *;
modifier onlyAdmin(
@@ -19,7 +20,9 @@ contract PermissionController is Initializable, PermissionControllerStorage {
* INITIALIZING FUNCTIONS
*
*/
- constructor() {
+ constructor(
+ string memory _version
+ ) SemVerMixin(_version) {
_disableInitializers();
}
diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol
index 1066b2fbfb..c92bf9191e 100644
--- a/src/contracts/pods/EigenPod.sol
+++ b/src/contracts/pods/EigenPod.sol
@@ -8,6 +8,8 @@ import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "../libraries/BeaconChainProofs.sol";
import "../libraries/BytesLib.sol";
+import "../mixins/SemVerMixin.sol";
+
import "../interfaces/IETHPOSDeposit.sol";
import "../interfaces/IEigenPodManager.sol";
import "../interfaces/IPausable.sol";
@@ -23,7 +25,13 @@ import "./EigenPodStorage.sol";
* @dev Note that all beacon chain balances are stored as gwei within the beacon chain datastructures. We choose
* to account balances in terms of gwei in the EigenPod contract and convert to wei when making calls to other contracts
*/
-contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingConstants, EigenPodStorage {
+contract EigenPod is
+ Initializable,
+ ReentrancyGuardUpgradeable,
+ EigenPodPausingConstants,
+ EigenPodStorage,
+ SemVerMixin
+{
using BytesLib for bytes;
using SafeERC20 for IERC20;
using BeaconChainProofs for *;
@@ -94,7 +102,12 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC
* CONSTRUCTOR / INIT
*
*/
- constructor(IETHPOSDeposit _ethPOS, IEigenPodManager _eigenPodManager, uint64 _GENESIS_TIME) {
+ constructor(
+ IETHPOSDeposit _ethPOS,
+ IEigenPodManager _eigenPodManager,
+ uint64 _GENESIS_TIME,
+ string memory _version
+ ) SemVerMixin(_version) {
ethPOS = _ethPOS;
eigenPodManager = _eigenPodManager;
GENESIS_TIME = _GENESIS_TIME;
diff --git a/src/contracts/pods/EigenPodManager.sol b/src/contracts/pods/EigenPodManager.sol
index 697b8d0f76..921fefba91 100644
--- a/src/contracts/pods/EigenPodManager.sol
+++ b/src/contracts/pods/EigenPodManager.sol
@@ -7,6 +7,7 @@ import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol";
import "../libraries/SlashingLib.sol";
+import "../mixins/SemVerMixin.sol";
import "../permissions/Pausable.sol";
import "./EigenPodPausingConstants.sol";
import "./EigenPodManagerStorage.sol";
@@ -27,7 +28,8 @@ contract EigenPodManager is
Pausable,
EigenPodPausingConstants,
EigenPodManagerStorage,
- ReentrancyGuardUpgradeable
+ ReentrancyGuardUpgradeable,
+ SemVerMixin
{
using SlashingLib for *;
using Math for *;
@@ -48,8 +50,13 @@ contract EigenPodManager is
IETHPOSDeposit _ethPOS,
IBeacon _eigenPodBeacon,
IDelegationManager _delegationManager,
- IPauserRegistry _pauserRegistry
- ) EigenPodManagerStorage(_ethPOS, _eigenPodBeacon, _delegationManager) Pausable(_pauserRegistry) {
+ IPauserRegistry _pauserRegistry,
+ string memory _version
+ )
+ EigenPodManagerStorage(_ethPOS, _eigenPodBeacon, _delegationManager)
+ Pausable(_pauserRegistry)
+ SemVerMixin(_version)
+ {
_disableInitializers();
}
@@ -59,7 +66,7 @@ contract EigenPodManager is
}
/// @inheritdoc IEigenPodManager
- function createPod() external onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) returns (address) {
+ function createPod() external onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) nonReentrant returns (address) {
require(!hasPod(msg.sender), EigenPodAlreadyExists());
// deploy a pod if the sender doesn't have one already
IEigenPod pod = _deployPod();
@@ -72,7 +79,7 @@ contract EigenPodManager is
bytes calldata pubkey,
bytes calldata signature,
bytes32 depositDataRoot
- ) external payable onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) {
+ ) external payable onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) nonReentrant {
IEigenPod pod = ownerToPod[msg.sender];
if (address(pod) == address(0)) {
//deploy a pod if the sender doesn't have one already
@@ -135,18 +142,20 @@ contract EigenPodManager is
* result in the `podOwner` incurring a "share deficit". This behavior prevents a Staker from queuing a withdrawal which improperly removes excessive
* shares from the operator to whom the staker is delegated.
* @dev The delegation manager validates that the podOwner is not address(0)
+ * @return updatedShares the staker's deposit shares after decrement
*/
function removeDepositShares(
address staker,
IStrategy strategy,
uint256 depositSharesToRemove
- ) external onlyDelegationManager {
+ ) external onlyDelegationManager nonReentrant returns (uint256) {
require(strategy == beaconChainETHStrategy, InvalidStrategy());
int256 updatedShares = podOwnerDepositShares[staker] - int256(depositSharesToRemove);
require(updatedShares >= 0, SharesNegative());
podOwnerDepositShares[staker] = updatedShares;
emit NewTotalShares(staker, updatedShares);
+ return uint256(updatedShares);
}
/**
@@ -159,9 +168,8 @@ contract EigenPodManager is
function addShares(
address staker,
IStrategy strategy,
- IERC20,
uint256 shares
- ) external onlyDelegationManager returns (uint256, uint256) {
+ ) external onlyDelegationManager nonReentrant returns (uint256, uint256) {
require(strategy == beaconChainETHStrategy, InvalidStrategy());
return _addShares(staker, shares);
}
@@ -177,7 +185,7 @@ contract EigenPodManager is
IStrategy strategy,
IERC20,
uint256 shares
- ) external onlyDelegationManager {
+ ) external onlyDelegationManager nonReentrant {
require(strategy == beaconChainETHStrategy, InvalidStrategy());
require(staker != address(0), InputAddressZero());
require(int256(shares) > 0, SharesNegative());
@@ -218,7 +226,7 @@ contract EigenPodManager is
}
/// @inheritdoc IShareManager
- function increaseBurnableShares(IStrategy, uint256 addedSharesToBurn) external onlyDelegationManager {
+ function increaseBurnableShares(IStrategy, uint256 addedSharesToBurn) external onlyDelegationManager nonReentrant {
burnableETHShares += addedSharesToBurn;
emit BurnableETHSharesIncreased(addedSharesToBurn);
}
@@ -263,8 +271,14 @@ contract EigenPodManager is
if (updatedDepositShares <= 0) {
return (0, 0);
}
-
- return (prevDepositShares < 0 ? 0 : uint256(prevDepositShares), shares);
+ // If we have gone from negative to positive shares, return (0, positive delta)
+ else if (prevDepositShares < 0) {
+ return (0, uint256(updatedDepositShares));
+ }
+ // Else, return true previous shares and added shares
+ else {
+ return (uint256(prevDepositShares), shares);
+ }
}
/// @dev Calculates the proportion a pod owner's restaked balance has decreased, and
diff --git a/src/contracts/strategies/EigenStrategy.sol b/src/contracts/strategies/EigenStrategy.sol
index 8a74ef1a15..1bde13901d 100644
--- a/src/contracts/strategies/EigenStrategy.sol
+++ b/src/contracts/strategies/EigenStrategy.sol
@@ -2,6 +2,7 @@
pragma solidity ^0.8.27;
// NOTE: Mainnet uses the OpenZeppelin v4.9.0 contracts, but this imports the 4.7.1 version. This will be changed after an upgrade.
+
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "../interfaces/IStrategyManager.sol";
import "../strategies/StrategyBase.sol";
@@ -37,8 +38,9 @@ contract EigenStrategy is StrategyBase {
/// @notice Since this contract is designed to be initializable, the constructor simply sets `strategyManager`, the only immutable variable.
constructor(
IStrategyManager _strategyManager,
- IPauserRegistry _pauserRegistry
- ) StrategyBase(_strategyManager, _pauserRegistry) {}
+ IPauserRegistry _pauserRegistry,
+ string memory _version
+ ) StrategyBase(_strategyManager, _pauserRegistry, _version) {}
function initialize(IEigen _EIGEN, IERC20 _bEIGEN) public virtual initializer {
EIGEN = _EIGEN;
diff --git a/src/contracts/strategies/StrategyBase.sol b/src/contracts/strategies/StrategyBase.sol
index 3621242c46..5dc1c158cb 100644
--- a/src/contracts/strategies/StrategyBase.sol
+++ b/src/contracts/strategies/StrategyBase.sol
@@ -3,6 +3,7 @@ pragma solidity ^0.8.27;
import "../interfaces/IStrategyManager.sol";
import "../permissions/Pausable.sol";
+import "../mixins/SemVerMixin.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
@@ -28,7 +29,7 @@ import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
* [this thread](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/3706) on the OpenZeppelin repo.
* We specifically use a share offset of `SHARES_OFFSET` and a balance offset of `BALANCE_OFFSET`.
*/
-contract StrategyBase is Initializable, Pausable, IStrategy {
+contract StrategyBase is Initializable, Pausable, IStrategy, SemVerMixin {
using SafeERC20 for IERC20;
uint8 internal constant PAUSED_DEPOSITS = 0;
@@ -69,7 +70,11 @@ contract StrategyBase is Initializable, Pausable, IStrategy {
}
/// @notice Since this contract is designed to be initializable, the constructor simply sets `strategyManager`, the only immutable variable.
- constructor(IStrategyManager _strategyManager, IPauserRegistry _pauserRegistry) Pausable(_pauserRegistry) {
+ constructor(
+ IStrategyManager _strategyManager,
+ IPauserRegistry _pauserRegistry,
+ string memory _version
+ ) Pausable(_pauserRegistry) SemVerMixin(_version) {
strategyManager = _strategyManager;
_disableInitializers();
}
diff --git a/src/contracts/strategies/StrategyBaseTVLLimits.sol b/src/contracts/strategies/StrategyBaseTVLLimits.sol
index ac972822e8..65eca55877 100644
--- a/src/contracts/strategies/StrategyBaseTVLLimits.sol
+++ b/src/contracts/strategies/StrategyBaseTVLLimits.sol
@@ -26,8 +26,9 @@ contract StrategyBaseTVLLimits is StrategyBase {
// solhint-disable-next-line no-empty-blocks
constructor(
IStrategyManager _strategyManager,
- IPauserRegistry _pauserRegistry
- ) StrategyBase(_strategyManager, _pauserRegistry) {}
+ IPauserRegistry _pauserRegistry,
+ string memory _version
+ ) StrategyBase(_strategyManager, _pauserRegistry, _version) {}
function initialize(
uint256 _maxPerDeposit,
diff --git a/src/contracts/strategies/StrategyFactory.sol b/src/contracts/strategies/StrategyFactory.sol
index 20ded2db2e..385bdcd839 100644
--- a/src/contracts/strategies/StrategyFactory.sol
+++ b/src/contracts/strategies/StrategyFactory.sol
@@ -3,6 +3,7 @@ pragma solidity ^0.8.27;
import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
+import "../mixins/SemVerMixin.sol";
import "./StrategyFactoryStorage.sol";
import "./StrategyBase.sol";
import "../permissions/Pausable.sol";
@@ -14,14 +15,18 @@ import "../permissions/Pausable.sol";
* @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
* @dev This may not be compatible with non-standard ERC20 tokens. Caution is warranted.
*/
-contract StrategyFactory is StrategyFactoryStorage, OwnableUpgradeable, Pausable {
+contract StrategyFactory is StrategyFactoryStorage, OwnableUpgradeable, Pausable, SemVerMixin {
uint8 internal constant PAUSED_NEW_STRATEGIES = 0;
/// @notice EigenLayer's StrategyManager contract
IStrategyManager public immutable strategyManager;
/// @notice Since this contract is designed to be initializable, the constructor simply sets the immutable variables.
- constructor(IStrategyManager _strategyManager, IPauserRegistry _pauserRegistry) Pausable(_pauserRegistry) {
+ constructor(
+ IStrategyManager _strategyManager,
+ IPauserRegistry _pauserRegistry,
+ string memory _version
+ ) Pausable(_pauserRegistry) SemVerMixin(_version) {
strategyManager = _strategyManager;
_disableInitializers();
}
diff --git a/src/test/DevnetLifecycle.t.sol b/src/test/DevnetLifecycle.t.sol
index 79beb56f99..aeb3cd6752 100644
--- a/src/test/DevnetLifecycle.t.sol
+++ b/src/test/DevnetLifecycle.t.sol
@@ -119,7 +119,7 @@ contract Devnet_Lifecycle_Test is Test, IAllocationManagerTypes {
function _delegateToOperator() internal {
// Delegate to operator
- ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry;
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory signatureWithExpiry;
cheats.prank(staker);
delegationManager.delegateTo(operator, signatureWithExpiry, bytes32(0));
diff --git a/src/test/harnesses/AllocationManagerHarness.sol b/src/test/harnesses/AllocationManagerHarness.sol
new file mode 100644
index 0000000000..98205c0d22
--- /dev/null
+++ b/src/test/harnesses/AllocationManagerHarness.sol
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "../../contracts/core/AllocationManager.sol";
+
+contract AllocationManagerHarness is AllocationManager {
+ using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;
+
+ constructor(
+ IDelegationManager _delegation,
+ IPauserRegistry _pauserRegistry,
+ IPermissionController _permissionController,
+ uint32 _DEALLOCATION_DELAY,
+ uint32 _ALLOCATION_CONFIGURATION_DELAY
+ )
+ AllocationManager(
+ _delegation,
+ _pauserRegistry,
+ _permissionController,
+ _DEALLOCATION_DELAY,
+ _ALLOCATION_CONFIGURATION_DELAY,
+ "v9.9.9"
+ )
+ {}
+
+ function deallocationQueueAtIndex(
+ address operator,
+ IStrategy strategy,
+ uint256 index
+ ) external view returns (bytes32) {
+ return deallocationQueue[operator][strategy].at(index);
+ }
+}
diff --git a/src/test/harnesses/DelegationManagerHarness.sol b/src/test/harnesses/DelegationManagerHarness.sol
index a88d0fe67b..dcf1bc0229 100644
--- a/src/test/harnesses/DelegationManagerHarness.sol
+++ b/src/test/harnesses/DelegationManagerHarness.sol
@@ -20,7 +20,8 @@ contract DelegationManagerHarness is DelegationManager {
_allocationManager,
_pauserRegistry,
_permissionController,
- _MIN_WITHDRAWAL_DELAY
+ _MIN_WITHDRAWAL_DELAY,
+ "v9.9.9"
)
{}
diff --git a/src/test/harnesses/EigenPodHarness.sol b/src/test/harnesses/EigenPodHarness.sol
index 0be5e4a541..29217270bc 100644
--- a/src/test/harnesses/EigenPodHarness.sol
+++ b/src/test/harnesses/EigenPodHarness.sol
@@ -9,11 +9,13 @@ contract EigenPodHarness is EigenPod {
constructor(
IETHPOSDeposit _ethPOS,
IEigenPodManager _eigenPodManager,
- uint64 _GENESIS_TIME
+ uint64 _GENESIS_TIME,
+ string memory _version
) EigenPod(
_ethPOS,
_eigenPodManager,
- _GENESIS_TIME
+ _GENESIS_TIME,
+ _version
) {}
function getActiveValidatorCount() public view returns (uint256) {
diff --git a/src/test/harnesses/EigenPodManagerWrapper.sol b/src/test/harnesses/EigenPodManagerWrapper.sol
index ffb190a551..5491984548 100644
--- a/src/test/harnesses/EigenPodManagerWrapper.sol
+++ b/src/test/harnesses/EigenPodManagerWrapper.sol
@@ -9,8 +9,9 @@ contract EigenPodManagerWrapper is EigenPodManager {
IETHPOSDeposit _ethPOS,
IBeacon _eigenPodBeacon,
IDelegationManager _delegationManager,
- IPauserRegistry _pauserRegistry
- ) EigenPodManager(_ethPOS, _eigenPodBeacon, _delegationManager, _pauserRegistry) {}
+ IPauserRegistry _pauserRegistry,
+ string memory _version
+ ) EigenPodManager(_ethPOS, _eigenPodBeacon, _delegationManager, _pauserRegistry, _version) {}
function setPodOwnerShares(address owner, IEigenPod pod) external {
ownerToPod[owner] = pod;
diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol
index 852352e910..c998e6de9f 100644
--- a/src/test/integration/IntegrationBase.t.sol
+++ b/src/test/integration/IntegrationBase.t.sol
@@ -9,18 +9,20 @@ import "@openzeppelin/contracts/utils/Strings.sol";
import "src/contracts/libraries/BeaconChainProofs.sol";
import "src/contracts/libraries/SlashingLib.sol";
+import "src/test/integration/TypeImporter.t.sol";
import "src/test/integration/IntegrationDeployer.t.sol";
import "src/test/integration/TimeMachine.t.sol";
import "src/test/integration/users/User.t.sol";
import "src/test/integration/users/User_M1.t.sol";
-abstract contract IntegrationBase is IntegrationDeployer {
+abstract contract IntegrationBase is IntegrationDeployer, TypeImporter {
using StdStyle for *;
using SlashingLib for *;
+ using Math for uint256;
using Strings for *;
using print for *;
- using ArrayLib for IStrategy[];
+ using ArrayLib for *;
uint numStakers = 0;
uint numOperators = 0;
@@ -49,7 +51,7 @@ abstract contract IntegrationBase is IntegrationDeployer {
IStrategy[] memory strategies;
uint[] memory tokenBalances;
- if (forkType == MAINNET && !isUpgraded) {
+ if (!isUpgraded) {
stakerName = string.concat("M2Staker", cheats.toString(numStakers));
(staker, strategies, tokenBalances) = _randUser(stakerName);
@@ -67,6 +69,35 @@ abstract contract IntegrationBase is IntegrationDeployer {
return (staker, strategies, tokenBalances);
}
+ function _newBasicStaker() internal returns (User, IStrategy[] memory, uint[] memory) {
+ string memory stakerName;
+
+ User staker;
+ IStrategy[] memory strategies;
+ uint[] memory tokenBalances;
+
+ if (!isUpgraded) {
+ stakerName = string.concat("M2Staker", cheats.toString(numStakers));
+
+ (staker, strategies, tokenBalances) = _randUser(stakerName);
+
+ stakersToMigrate.push(staker);
+ } else {
+ stakerName = string.concat("staker", cheats.toString(numStakers));
+
+ (staker, strategies, tokenBalances) = _randUser(stakerName);
+ }
+
+ assert_HasUnderlyingTokenBalances(staker, strategies, tokenBalances, "_newRandomStaker: failed to award token balances");
+
+ numStakers++;
+ assembly { // TODO HACK
+ mstore(strategies, 1)
+ mstore(tokenBalances, 1)
+ }
+ return (staker, strategies, tokenBalances);
+ }
+
/**
* @dev Create a new operator according to configured random variants.
* This user will immediately deposit their randomized assets into eigenlayer.
@@ -79,7 +110,7 @@ abstract contract IntegrationBase is IntegrationDeployer {
uint[] memory tokenBalances;
uint[] memory addedShares;
- if (forkType == MAINNET && !isUpgraded) {
+ if (!isUpgraded) {
string memory operatorName = string.concat("M2Operator", numOperators.toString());
// Create an operator for M2.
@@ -102,11 +133,12 @@ abstract contract IntegrationBase is IntegrationDeployer {
operator.registerAsOperator();
operator.depositIntoEigenlayer(strategies, tokenBalances);
- // Roll passed the allocation configuration delay
- rollForward({blocks: ALLOCATION_CONFIGURATION_DELAY});
- }
+ // Roll past the allocation configuration delay
+ rollForward({blocks: ALLOCATION_CONFIGURATION_DELAY + 1});
- assert_Snap_Added_Staker_DepositShares(operator, strategies, addedShares, "_newRandomOperator: failed to add delegatable shares");
+ assert_Snap_Added_Staker_DepositShares(operator, strategies, addedShares, "_newRandomOperator: failed to add delegatable shares");
+ }
+
assert_Snap_Added_OperatorShares(operator, strategies, addedShares, "_newRandomOperator: failed to award shares to operator");
assertTrue(delegationManager.isOperator(address(operator)), "_newRandomOperator: operator should be registered");
@@ -114,9 +146,38 @@ abstract contract IntegrationBase is IntegrationDeployer {
return (operator, strategies, tokenBalances);
}
+ /// @dev Creates a new operator with no assets
+ function _newRandomOperator_NoAssets() internal returns (User) {
+ User operator;
+
+ if (!isUpgraded) {
+ string memory operatorName = string.concat("M2Operator", numOperators.toString());
+
+ // Create an operator for M2.
+ operator = _randUser_NoAssets(operatorName);
+ User_M2(payable(operator)).registerAsOperator_M2();
+
+ operatorsToMigrate.push(operator);
+ } else {
+ string memory operatorName = string.concat("operator", numOperators.toString());
+
+ operator = _randUser_NoAssets(operatorName);
+ operator.registerAsOperator();
+
+ // Roll past the allocation configuration delay
+ rollForward({blocks: ALLOCATION_CONFIGURATION_DELAY + 1});
+ }
+
+ assertTrue(delegationManager.isOperator(address(operator)), "_newRandomOperator: operator should be registered");
+
+ numOperators++;
+ return operator;
+ }
+
function _newRandomAVS() internal returns (AVS avs, OperatorSet[] memory operatorSets) {
string memory avsName = string.concat("avs", numAVSs.toString());
avs = _genRandAVS(avsName);
+ avs.updateAVSMetadataURI("https://example.com");
operatorSets = avs.createOperatorSets(_randomStrategies());
++numAVSs;
}
@@ -138,44 +199,16 @@ abstract contract IntegrationBase is IntegrationDeployer {
return (gweiSent, remainderSent);
}
-
- /// @dev If we're on mainnet, upgrade contracts to slashing and migrate stakers/operators
- function _upgradeEigenLayerContracts() internal {
- if (forkType == MAINNET) {
- require(!isUpgraded, "_upgradeEigenLayerContracts: already performed slashing upgrade");
-
- emit log("_upgradeEigenLayerContracts: upgrading mainnet to slashing");
- _upgradeMainnetContracts();
-
- // Bump block.timestamp forward to allow verifyWC proofs for migrated pods
- emit log("advancing block time to start of next epoch:");
-
- beaconChain.advanceEpoch_NoRewards();
-
- emit log("======");
-
- isUpgraded = true;
- emit log("_upgradeEigenLayerContracts: slashing upgrade complete");
- } else if (forkType == HOLESKY) {
- require(!isUpgraded, "_upgradeEigenLayerContracts: already performed slashing upgrade");
-
- emit log("_upgradeEigenLayerContracts: upgrading holesky to slashing");
- _upgradeHoleskyContracts();
-
- isUpgraded = true;
- emit log("_upgradeEigenLayerContracts: slashing upgrade complete");
- }
- }
-
+
/// @dev Choose a random subset of validators (selects AT LEAST ONE)
function _choose(uint40[] memory validators) internal returns (uint40[] memory) {
- uint rand = _randUint({ min: 1, max: validators.length ** 2 });
+ uint _rand = _randUint({ min: 1, max: validators.length ** 2 });
uint40[] memory result = new uint40[](validators.length);
uint newLen;
for (uint i = 0; i < validators.length; i++) {
// if bit set, add validator
- if (rand >> i & 1 == 1) {
+ if (_rand >> i & 1 == 1) {
result[newLen] = validators[i];
newLen++;
}
@@ -242,215 +275,902 @@ abstract contract IntegrationBase is IntegrationDeployer {
}
}
- function assert_HasOperatorShares(
- User user,
- IStrategy[] memory strategies,
- uint[] memory expectedShares,
+ function assert_HasOperatorShares(
+ User user,
+ IStrategy[] memory strategies,
+ uint[] memory expectedShares,
+ string memory err
+ ) internal view {
+ for (uint i = 0; i < strategies.length; i++) {
+ uint actualShares = delegationManager.operatorShares(address(user), strategies[i]);
+ assertEq(expectedShares[i], actualShares, err);
+ }
+ }
+
+ /// @dev Asserts that ALL of the `withdrawalRoots` is in `delegationManager.pendingWithdrawals`
+ function assert_AllWithdrawalsPending(bytes32[] memory withdrawalRoots, string memory err) internal view {
+ for (uint i = 0; i < withdrawalRoots.length; i++) {
+ assert_WithdrawalPending(withdrawalRoots[i], err);
+ }
+ }
+
+ /// @dev Asserts that NONE of the `withdrawalRoots` is in `delegationManager.pendingWithdrawals`
+ function assert_NoWithdrawalsPending(bytes32[] memory withdrawalRoots, string memory err) internal view {
+ for (uint i = 0; i < withdrawalRoots.length; i++) {
+ assert_WithdrawalNotPending(withdrawalRoots[i], err);
+ }
+ }
+
+ /// @dev Asserts that the hash of each withdrawal corresponds to the provided withdrawal root
+ function assert_WithdrawalPending(bytes32 withdrawalRoot, string memory err) internal view {
+ assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), err);
+ }
+
+ function assert_WithdrawalNotPending(bytes32 withdrawalRoot, string memory err) internal view {
+ assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), err);
+ }
+
+ function assert_ValidWithdrawalHashes(
+ Withdrawal[] memory withdrawals,
+ bytes32[] memory withdrawalRoots,
+ string memory err
+ ) internal view {
+ for (uint i = 0; i < withdrawals.length; i++) {
+ assert_ValidWithdrawalHash(withdrawals[i], withdrawalRoots[i], err);
+ }
+ }
+
+ function assert_ValidWithdrawalHash(
+ Withdrawal memory withdrawal,
+ bytes32 withdrawalRoot,
+ string memory err
+ ) internal view {
+ assertEq(withdrawalRoot, delegationManager.calculateWithdrawalRoot(withdrawal), err);
+ }
+
+ function assert_PodBalance_Eq(
+ User staker,
+ uint expectedBalance,
+ string memory err
+ ) internal view {
+ EigenPod pod = staker.pod();
+ assertEq(address(pod).balance, expectedBalance, err);
+ }
+
+ function assert_ProofsRemainingEqualsActive(
+ User staker,
+ string memory err
+ ) internal view {
+ EigenPod pod = staker.pod();
+ assertEq(pod.currentCheckpoint().proofsRemaining, pod.activeValidatorCount(), err);
+ }
+
+ function assert_CheckpointPodBalance(
+ User staker,
+ uint64 expectedPodBalanceGwei,
+ string memory err
+ ) internal view {
+ EigenPod pod = staker.pod();
+ assertEq(pod.currentCheckpoint().podBalanceGwei, expectedPodBalanceGwei, err);
+ }
+
+ function assert_MaxEqualsAllocatablePlusEncumbered(
+ User operator,
+ string memory err
+ ) internal view {
+ Magnitudes[] memory mags = _getMagnitudes(operator, allStrats);
+
+ for (uint i = 0; i < allStrats.length; i++) {
+ Magnitudes memory m = mags[i];
+ assertEq(m.max, m.encumbered + m.allocatable, err);
+ }
+ }
+
+ function assert_CurMinSlashableEqualsMinAllocated(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies,
+ string memory err
+ ) internal view {
+ uint[] memory minSlashableStake = _getMinSlashableStake(operator, operatorSet, strategies);
+ uint[] memory minAllocatedStake = _getAllocatedStake(operator, operatorSet, strategies);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(minSlashableStake[i], minAllocatedStake[i], err);
+ }
+ }
+
+ function assert_MaxMagsEqualMaxMagsAtCurrentBlock(
+ User operator,
+ IStrategy[] memory strategies,
+ string memory err
+ ) internal view {
+ uint64[] memory maxMagnitudes = _getMaxMagnitudes(operator, strategies);
+ uint64[] memory maxAtCurrentBlock = _getMaxMagnitudes(operator, strategies, uint32(block.number));
+
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(maxMagnitudes[i], maxAtCurrentBlock[i], err);
+ }
+ }
+
+ function assert_CurrentMagnitude(
+ User operator,
+ AllocateParams memory params,
+ string memory err
+ ) internal view {
+ Allocation[] memory allocations = _getAllocations(operator, params.operatorSet, params.strategies);
+
+ for (uint i = 0; i < allocations.length; i++) {
+ assertEq(allocations[i].currentMagnitude, params.newMagnitudes[i], err);
+ }
+ }
+
+ function assert_NoPendingModification(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies,
+ string memory err
+ ) internal view {
+ Allocation[] memory allocations = _getAllocations(operator, operatorSet, strategies);
+
+ for (uint i = 0; i < allocations.length; i++) {
+ assertEq(0, allocations[i].effectBlock, err);
+ }
+ }
+
+ function assert_HasPendingIncrease(
+ User operator,
+ AllocateParams memory params,
+ string memory err
+ ) internal view {
+ uint32 delay = _getExistingAllocationDelay(operator);
+ Allocation[] memory allocations = _getAllocations(operator, params.operatorSet, params.strategies);
+
+ for (uint i = 0; i < allocations.length; i++) {
+ assertEq(allocations[i].effectBlock, uint32(block.number) + delay, err);
+ assertTrue(allocations[i].currentMagnitude != params.newMagnitudes[i], err);
+ assertGt(allocations[i].pendingDiff, 0, err);
+ }
+ }
+
+ function assert_HasPendingDecrease(
+ User operator,
+ AllocateParams memory params,
+ string memory err
+ ) internal view {
+ uint32 deallocationDelay = allocationManager.DEALLOCATION_DELAY();
+ Allocation[] memory allocations = _getAllocations(operator, params.operatorSet, params.strategies);
+
+ for (uint i = 0; i < allocations.length; i++) {
+ assertEq(allocations[i].effectBlock, uint32(block.number) + deallocationDelay + 1, err);
+ assertTrue(allocations[i].currentMagnitude != params.newMagnitudes[i], err);
+ assertLt(allocations[i].pendingDiff, 0, err);
+ }
+ }
+
+ function assert_IsRegistered(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal view {
+ assertTrue(allocationManager.isMemberOfOperatorSet(address(operator), operatorSet), err);
+ }
+
+ function assert_IsSlashable(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal view {
+ assertTrue(allocationManager.isOperatorSlashable(address(operator), operatorSet), err);
+ }
+
+ function assert_NotSlashable(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal view {
+ assertFalse(allocationManager.isOperatorSlashable(address(operator), operatorSet), err);
+ }
+
+ function assert_IsAllocatedToSet(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal view {
+ assertTrue(allocationManager.getAllocatedSets(address(operator)).contains(operatorSet), err);
+ }
+
+ function assert_IsNotAllocated(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal view {
+ assertEq(allocationManager.getAllocatedStrategies(address(operator), operatorSet).length, 0, err);
+ }
+
+ function assert_IsAllocatedToSetStrats(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies,
+ string memory err
+ ) internal view {
+ IStrategy[] memory allocatedStrategies = allocationManager.getAllocatedStrategies(address(operator), operatorSet);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ assertTrue(allocatedStrategies.contains(strategies[i]), err);
+ }
+ }
+
+ function assert_HasAllocatedStake(
+ User operator,
+ AllocateParams memory params,
+ string memory err
+ ) internal view {
+ OperatorSet memory operatorSet = params.operatorSet;
+ IStrategy[] memory strategies = params.strategies;
+ uint64[] memory curMagnitudes = params.newMagnitudes;
+
+ uint64[] memory maxMagnitudes = _getMaxMagnitudes(operator, params.strategies);
+ uint[] memory operatorShares = _getOperatorShares(operator, params.strategies);
+ uint[] memory allocatedStake = _getAllocatedStake(operator, operatorSet, strategies);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ uint expectedAllocated;
+ if (maxMagnitudes[i] == 0) {
+ expectedAllocated = 0;
+ } else {
+ uint slashableProportion = uint(curMagnitudes[i]).divWad(maxMagnitudes[i]);
+ expectedAllocated = operatorShares[i].mulWad(slashableProportion);
+ }
+
+ assertEq(expectedAllocated, allocatedStake[i], err);
+ }
+ }
+
+ function assert_HasSlashableStake(
+ User operator,
+ AllocateParams memory params,
+ string memory err
+ ) internal view {
+ OperatorSet memory operatorSet = params.operatorSet;
+ IStrategy[] memory strategies = params.strategies;
+ uint64[] memory curMagnitudes = params.newMagnitudes;
+
+ uint64[] memory maxMagnitudes = _getMaxMagnitudes(operator, params.strategies);
+ uint[] memory operatorShares = _getOperatorShares(operator, params.strategies);
+ uint[] memory slashableStake = _getMinSlashableStake(operator, operatorSet, strategies);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ uint expectedSlashable;
+ if (maxMagnitudes[i] == 0) {
+ expectedSlashable = 0;
+ } else {
+ uint slashableProportion = uint(curMagnitudes[i]).divWad(maxMagnitudes[i]);
+ expectedSlashable = operatorShares[i].mulWad(slashableProportion);
+ }
+
+ assertEq(expectedSlashable, slashableStake[i], err);
+ }
+ }
+
+ function assert_NoSlashableStake(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal view {
+ IStrategy[] memory strategies = allocationManager.getStrategiesInOperatorSet(operatorSet);
+ uint[] memory slashableStake = _getMinSlashableStake(operator, operatorSet, strategies);
+
+ for (uint i = 0; i < slashableStake.length; i++) {
+ assertEq(slashableStake[i], 0, err);
+ }
+ }
+
+ function assert_DSF_Reset(
+ User staker,
+ IStrategy[] memory strategies,
+ string memory err
+ ) internal {
+ uint[] memory depositScalingFactors = _getDepositScalingFactors(staker, strategies);
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(depositScalingFactors[i], WAD, err);
+ }
+ }
+
+ /*******************************************************************************
+ SNAPSHOT ASSERTIONS
+ TIME TRAVELERS ONLY BEYOND THIS POINT
+ *******************************************************************************/
+
+ /*******************************************************************************
+ SNAPSHOT ASSERTIONS: ALLOCATIONS
+ *******************************************************************************/
+
+ function assert_Snap_Became_Registered(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal {
+ bool curIsMemberOfSet = _getIsMemberOfSet(operator, operatorSet);
+ bool prevIsMemberOfSet = _getPrevIsMemberOfSet(operator, operatorSet);
+
+ assertFalse(prevIsMemberOfSet, err);
+ assertTrue(curIsMemberOfSet, err);
+ }
+
+ function assert_Snap_Became_Deregistered(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal {
+ bool curIsMemberOfSet = _getIsMemberOfSet(operator, operatorSet);
+ bool prevIsMemberOfSet = _getPrevIsMemberOfSet(operator, operatorSet);
+
+ assertTrue(prevIsMemberOfSet, err);
+ assertFalse(curIsMemberOfSet, err);
+ }
+
+ function assert_Snap_Unchanged_Registration(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal {
+ bool curIsMemberOfSet = _getIsMemberOfSet(operator, operatorSet);
+ bool prevIsMemberOfSet = _getPrevIsMemberOfSet(operator, operatorSet);
+
+ assertEq(prevIsMemberOfSet, curIsMemberOfSet, err);
+ }
+
+ function assert_Snap_Became_Slashable(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal {
+ bool curIsSlashable = _getIsSlashable(operator, operatorSet);
+ bool prevIsSlashable = _getPrevIsSlashable(operator, operatorSet);
+
+ assertFalse(prevIsSlashable, err);
+ assertTrue(curIsSlashable, err);
+ }
+
+ function assert_Snap_Remains_Slashable(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal {
+ bool curIsSlashable = _getIsSlashable(operator, operatorSet);
+ bool prevIsSlashable = _getPrevIsSlashable(operator, operatorSet);
+
+ assertTrue(prevIsSlashable, err);
+ assertTrue(curIsSlashable, err);
+ }
+
+ function assert_Snap_Unchanged_Slashability(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal {
+ bool curIsSlashable = _getIsSlashable(operator, operatorSet);
+ bool prevIsSlashable = _getPrevIsSlashable(operator, operatorSet);
+
+ assertEq(prevIsSlashable, curIsSlashable, err);
+ }
+
+ function assert_Snap_Unchanged_AllocatedStrats(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal {
+ IStrategy[] memory curAllocatedStrats = _getAllocatedStrats(operator, operatorSet);
+ IStrategy[] memory prevAllocatedStrats = _getPrevAllocatedStrats(operator, operatorSet);
+
+ assertEq(curAllocatedStrats.length, prevAllocatedStrats.length, err);
+
+ for (uint i = 0; i < curAllocatedStrats.length; i++) {
+ assertEq(address(curAllocatedStrats[i]), address(prevAllocatedStrats[i]), err);
+ }
+ }
+
+ function assert_Snap_Unchanged_StrategyAllocations(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies,
+ string memory err
+ ) internal {
+ Allocation[] memory curAllocations = _getAllocations(operator, operatorSet, strategies);
+ Allocation[] memory prevAllocations = _getPrevAllocations(operator, operatorSet, strategies);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ Allocation memory curAllocation = curAllocations[i];
+ Allocation memory prevAllocation = prevAllocations[i];
+
+ assertEq(curAllocation.currentMagnitude, prevAllocation.currentMagnitude, err);
+ assertEq(curAllocation.pendingDiff, prevAllocation.pendingDiff, err);
+ assertEq(curAllocation.effectBlock, prevAllocation.effectBlock, err);
+ }
+ }
+
+ function assert_Snap_Added_AllocatedSet(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal {
+ OperatorSet[] memory curAllocatedSets = _getAllocatedSets(operator);
+ OperatorSet[] memory prevAllocatedSets = _getPrevAllocatedSets(operator);
+
+ assertEq(curAllocatedSets.length, prevAllocatedSets.length + 1, err);
+ assertFalse(prevAllocatedSets.contains(operatorSet), err);
+ assertTrue(curAllocatedSets.contains(operatorSet), err);
+ }
+
+ function assert_Snap_Unchanged_AllocatedSets(
+ User operator,
+ string memory err
+ ) internal {
+ OperatorSet[] memory curAllocatedSets = _getAllocatedSets(operator);
+ OperatorSet[] memory prevAllocatedSets = _getPrevAllocatedSets(operator);
+
+ assertEq(curAllocatedSets.length, prevAllocatedSets.length, err);
+ }
+
+ function assert_Snap_Removed_AllocatedSet(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal {
+ OperatorSet[] memory curAllocatedSets = _getAllocatedSets(operator);
+ OperatorSet[] memory prevAllocatedSets = _getPrevAllocatedSets(operator);
+
+ assertEq(curAllocatedSets.length + 1, prevAllocatedSets.length, err);
+ assertTrue(prevAllocatedSets.contains(operatorSet), err);
+ assertFalse(curAllocatedSets.contains(operatorSet), err);
+ }
+
+ function assert_Snap_Added_RegisteredSet(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal {
+ OperatorSet[] memory curRegisteredSets = _getRegisteredSets(operator);
+ OperatorSet[] memory prevRegisteredSets = _getPrevRegisteredSets(operator);
+
+ assertEq(curRegisteredSets.length, prevRegisteredSets.length + 1, err);
+ assertFalse(prevRegisteredSets.contains(operatorSet), err);
+ assertTrue(curRegisteredSets.contains(operatorSet), err);
+ }
+
+ function assert_Snap_Removed_RegisteredSet(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal {
+ OperatorSet[] memory curRegisteredSets = _getRegisteredSets(operator);
+ OperatorSet[] memory prevRegisteredSets = _getPrevRegisteredSets(operator);
+
+ assertEq(curRegisteredSets.length + 1, prevRegisteredSets.length, err);
+ assertTrue(prevRegisteredSets.contains(operatorSet), err);
+ assertFalse(curRegisteredSets.contains(operatorSet), err);
+ }
+
+ function assert_Snap_Unchanged_RegisteredSet(
+ User operator,
+ string memory err
+ ) internal {
+ OperatorSet[] memory curRegisteredSets = _getRegisteredSets(operator);
+ OperatorSet[] memory prevRegisteredSets = _getPrevRegisteredSets(operator);
+
+ assertEq(curRegisteredSets.length, prevRegisteredSets.length, err);
+ for (uint i = 0; i < curRegisteredSets.length; i++) {
+ assertEq(curRegisteredSets[i].avs, prevRegisteredSets[i].avs, err);
+ assertEq(curRegisteredSets[i].id, prevRegisteredSets[i].id, err);
+ }
+ }
+
+ function assert_Snap_Added_MemberOfSet(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal {
+ address[] memory curOperators = _getMembers(operatorSet);
+ address[] memory prevOperators = _getPrevMembers(operatorSet);
+
+ assertEq(curOperators.length, prevOperators.length + 1, err);
+ assertFalse(prevOperators.contains(address(operator)), err);
+ assertTrue(curOperators.contains(address(operator)), err);
+ }
+
+ function assert_Snap_Removed_MemberOfSet(
+ User operator,
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal {
+ address[] memory curOperators = _getMembers(operatorSet);
+ address[] memory prevOperators = _getPrevMembers(operatorSet);
+
+ assertEq(curOperators.length + 1, prevOperators.length, err);
+ assertTrue(prevOperators.contains(address(operator)), err);
+ assertFalse(curOperators.contains(address(operator)), err);
+ }
+
+ function assert_Snap_Unchanged_MemberOfSet(
+ OperatorSet memory operatorSet,
+ string memory err
+ ) internal {
+ address[] memory curOperators = _getMembers(operatorSet);
+ address[] memory prevOperators = _getPrevMembers(operatorSet);
+
+ assertEq(curOperators.length, prevOperators.length, err);
+ for (uint i = 0; i < curOperators.length; i++) {
+ assertEq(curOperators[i], prevOperators[i], err);
+ }
+ }
+
+ function assert_Snap_StakeBecameSlashable(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies,
+ string memory err
+ ) internal {
+ uint[] memory curSlashableStake = _getMinSlashableStake(operator, operatorSet, strategies);
+ uint[] memory prevSlashableStake = _getPrevMinSlashableStake(operator, operatorSet, strategies);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ assertTrue(prevSlashableStake[i] < curSlashableStake[i], err);
+ }
+ }
+
+ function assert_Snap_StakeBecomeUnslashable(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies,
+ string memory err
+ ) internal {
+ uint[] memory curSlashableStake = _getMinSlashableStake(operator, operatorSet, strategies);
+ uint[] memory prevSlashableStake = _getPrevMinSlashableStake(operator, operatorSet, strategies);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ assertTrue(prevSlashableStake[i] > curSlashableStake[i], err);
+ }
+ }
+
+ function assert_Snap_Added_SlashableStake(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies,
+ uint[] memory slashableShares,
+ string memory err
+ ) internal {
+ uint[] memory curSlashableStake = _getMinSlashableStake(operator, operatorSet, strategies);
+ uint[] memory prevSlashableStake = _getPrevMinSlashableStake(operator, operatorSet, strategies);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(curSlashableStake[i], prevSlashableStake[i] + slashableShares[i], err);
+ }
+ }
+
+ function assert_Snap_Unchanged_SlashableStake(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies,
+ string memory err
+ ) internal {
+ uint[] memory curSlashableStake = _getMinSlashableStake(operator, operatorSet, strategies);
+ uint[] memory prevSlashableStake = _getPrevMinSlashableStake(operator, operatorSet, strategies);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(curSlashableStake[i], prevSlashableStake[i], err);
+ }
+ }
+
+ function assert_Snap_Removed_SlashableStake(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies,
+ uint[] memory removedSlashableShares,
+ string memory err
+ ) internal {
+ uint[] memory curSlashableStake = _getMinSlashableStake(operator, operatorSet, strategies);
+ uint[] memory prevSlashableStake = _getPrevMinSlashableStake(operator, operatorSet, strategies);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(curSlashableStake[i] + removedSlashableShares[i], prevSlashableStake[i], err);
+ }
+ }
+
+ function assert_Snap_Slashed_SlashableStake(
+ User operator,
+ OperatorSet memory operatorSet,
+ SlashingParams memory params,
+ string memory err
+ ) internal {
+ uint[] memory curSlashableStake = _getMinSlashableStake(operator, operatorSet, params.strategies);
+ uint[] memory prevSlashableStake = _getPrevMinSlashableStake(operator, operatorSet, params.strategies);
+
+ Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, params.strategies);
+ Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, params.strategies);
+
+ for (uint i = 0; i < params.strategies.length; i++) {
+ uint expectedSlashed = SlashingLib.calcSlashedAmount({
+ operatorShares: prevSlashableStake[i],
+ prevMaxMagnitude: prevMagnitudes[i].max,
+ newMaxMagnitude: curMagnitudes[i].max
+ });
+
+ assertEq(curSlashableStake[i], prevSlashableStake[i] - expectedSlashed, err);
+ }
+ }
+
+ function assert_Snap_StakeBecameAllocated(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies,
+ string memory err
+ ) internal {
+ uint[] memory curMinAllocatedStake = _getAllocatedStake(operator, operatorSet, strategies);
+ uint[] memory prevMinAllocatedStake = _getPrevAllocatedStake(operator, operatorSet, strategies);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ assertGt(curMinAllocatedStake[i], prevMinAllocatedStake[i], err);
+ }
+ }
+
+ function assert_Snap_StakeBecameDeallocated(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies,
+ string memory err
+ ) internal {
+ uint[] memory curMinAllocatedStake = _getAllocatedStake(operator, operatorSet, strategies);
+ uint[] memory prevMinAllocatedStake = _getPrevAllocatedStake(operator, operatorSet, strategies);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ assertLt(curMinAllocatedStake[i], prevMinAllocatedStake[i], err);
+ }
+ }
+
+ function assert_Snap_Unchanged_AllocatedStake(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies,
+ string memory err
+ ) internal {
+ uint[] memory curAllocatedStake = _getAllocatedStake(operator, operatorSet, strategies);
+ uint[] memory prevAllocatedStake = _getPrevAllocatedStake(operator, operatorSet, strategies);
+
+ for (uint i = 0; i < curAllocatedStake.length; i++) {
+ assertEq(curAllocatedStake[i], prevAllocatedStake[i], err);
+ }
+ }
+
+ function assert_Snap_Slashed_AllocatedStake(
+ User operator,
+ OperatorSet memory operatorSet,
+ SlashingParams memory params,
+ string memory err
+ ) internal {
+ uint[] memory curAllocatedStake = _getAllocatedStake(operator, operatorSet, params.strategies);
+ uint[] memory prevAllocatedStake = _getPrevAllocatedStake(operator, operatorSet, params.strategies);
+
+ Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, params.strategies);
+ Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, params.strategies);
+
+ for (uint i = 0; i < curAllocatedStake.length; i++) {
+ uint expectedSlashed = SlashingLib.calcSlashedAmount({
+ operatorShares: prevAllocatedStake[i],
+ prevMaxMagnitude: prevMagnitudes[i].max,
+ newMaxMagnitude: curMagnitudes[i].max
+ });
+
+ assertEq(curAllocatedStake[i], prevAllocatedStake[i] - expectedSlashed, err);
+ }
+ }
+
+ function assert_Snap_Added_EncumberedMagnitude(
+ User operator,
+ IStrategy[] memory strategies,
+ uint64[] memory magnitudeAdded,
+ string memory err
+ ) internal {
+ Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies);
+ Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(curMagnitudes[i].encumbered, prevMagnitudes[i].encumbered + magnitudeAdded[i], err);
+ }
+ }
+
+ function assert_Snap_Unchanged_EncumberedMagnitude(
+ User operator,
+ IStrategy[] memory strategies,
string memory err
- ) internal view {
+ ) internal {
+ Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies);
+ Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies);
+
for (uint i = 0; i < strategies.length; i++) {
- uint actualShares = delegationManager.operatorShares(address(user), strategies[i]);
- assertEq(expectedShares[i], actualShares, err);
+ assertEq(curMagnitudes[i].encumbered, prevMagnitudes[i].encumbered, err);
}
}
- /// @dev Asserts that ALL of the `withdrawalRoots` is in `delegationManager.pendingWithdrawals`
- function assert_AllWithdrawalsPending(bytes32[] memory withdrawalRoots, string memory err) internal view {
- for (uint i = 0; i < withdrawalRoots.length; i++) {
- assert_WithdrawalPending(withdrawalRoots[i], err);
+ function assert_Snap_Removed_EncumberedMagnitude(
+ User operator,
+ IStrategy[] memory strategies,
+ uint64[] memory magnitudeRemoved,
+ string memory err
+ ) internal {
+ Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies);
+ Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(curMagnitudes[i].encumbered + magnitudeRemoved[i], prevMagnitudes[i].encumbered, err);
}
}
- /// @dev Asserts that NONE of the `withdrawalRoots` is in `delegationManager.pendingWithdrawals`
- function assert_NoWithdrawalsPending(bytes32[] memory withdrawalRoots, string memory err) internal view {
- for (uint i = 0; i < withdrawalRoots.length; i++) {
- assert_WithdrawalNotPending(withdrawalRoots[i], err);
+ function assert_Snap_Slashed_EncumberedMagnitude(
+ User operator,
+ SlashingParams memory params,
+ string memory err
+ ) internal {
+ Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, params.strategies);
+ Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, params.strategies);
+
+ for (uint i = 0; i < params.strategies.length; i++) {
+ uint expectedSlashed = prevMagnitudes[i].encumbered.mulWadRoundUp(params.wadsToSlash[i]);
+ assertEq(curMagnitudes[i].encumbered, prevMagnitudes[i].encumbered - expectedSlashed, err);
}
}
- /// @dev Asserts that the hash of each withdrawal corresponds to the provided withdrawal root
- function assert_WithdrawalPending(bytes32 withdrawalRoot, string memory err) internal view {
- assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), err);
- }
+ function assert_Snap_Added_AllocatableMagnitude(
+ User operator,
+ IStrategy[] memory strategies,
+ uint64[] memory magnitudeFreed,
+ string memory err
+ ) internal {
+ Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies);
+ Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies);
- function assert_WithdrawalNotPending(bytes32 withdrawalRoot, string memory err) internal view {
- assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), err);
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(curMagnitudes[i].allocatable, prevMagnitudes[i].allocatable + magnitudeFreed[i], err);
+ }
}
- function assert_ValidWithdrawalHashes(
- IDelegationManagerTypes.Withdrawal[] memory withdrawals,
- bytes32[] memory withdrawalRoots,
+ function assert_Snap_Unchanged_AllocatableMagnitude(
+ User operator,
+ IStrategy[] memory strategies,
string memory err
- ) internal view {
- for (uint i = 0; i < withdrawals.length; i++) {
- assert_ValidWithdrawalHash(withdrawals[i], withdrawalRoots[i], err);
+ ) internal {
+ Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies);
+ Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(curMagnitudes[i].allocatable, prevMagnitudes[i].allocatable, err);
}
}
- function assert_ValidWithdrawalHash(
- IDelegationManagerTypes.Withdrawal memory withdrawal,
- bytes32 withdrawalRoot,
+ function assert_Snap_Removed_AllocatableMagnitude(
+ User operator,
+ IStrategy[] memory strategies,
+ uint64[] memory magnitudeRemoved,
string memory err
- ) internal view {
- assertEq(withdrawalRoot, delegationManager.calculateWithdrawalRoot(withdrawal), err);
+ ) internal {
+ Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies);
+ Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(curMagnitudes[i].allocatable, prevMagnitudes[i].allocatable - magnitudeRemoved[i], err);
+ }
}
- function assert_PodBalance_Eq(
- User staker,
- uint expectedBalance,
+ function assert_Snap_Allocated_Magnitude(
+ User operator,
+ IStrategy[] memory strategies,
string memory err
- ) internal view {
- EigenPod pod = staker.pod();
- assertEq(address(pod).balance, expectedBalance, err);
+ ) internal {
+ Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies);
+ Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies);
+
+ /// Check:
+ /// allocatable increased
+ /// encumbered decreased
+ for (uint i = 0; i < strategies.length; i++) {
+ assertLt(curMagnitudes[i].allocatable, prevMagnitudes[i].allocatable, err);
+ assertGt(curMagnitudes[i].encumbered, prevMagnitudes[i].encumbered, err);
+ }
}
- function assert_ProofsRemainingEqualsActive(
- User staker,
+ function assert_Snap_Deallocated_Magnitude(
+ User operator,
+ IStrategy[] memory strategies,
string memory err
- ) internal view {
- EigenPod pod = staker.pod();
- assertEq(pod.currentCheckpoint().proofsRemaining, pod.activeValidatorCount(), err);
+ ) internal {
+ Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies);
+ Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies);
+
+ /// Check:
+ /// allocatable increased
+ /// encumbered decreased
+ for (uint i = 0; i < strategies.length; i++) {
+ assertGt(curMagnitudes[i].allocatable, prevMagnitudes[i].allocatable, err);
+ assertLt(curMagnitudes[i].encumbered, prevMagnitudes[i].encumbered, err);
+ }
}
- function assert_CheckpointPodBalance(
- User staker,
- uint64 expectedPodBalanceGwei,
+ function assert_Snap_Set_CurrentMagnitude(
+ User operator,
+ AllocateParams memory params,
string memory err
- ) internal view {
- EigenPod pod = staker.pod();
- assertEq(pod.currentCheckpoint().podBalanceGwei, expectedPodBalanceGwei, err);
+ ) internal {
+ Allocation[] memory curAllocations = _getAllocations(operator, params.operatorSet, params.strategies);
+ Allocation[] memory prevAllocations = _getPrevAllocations(operator, params.operatorSet, params.strategies);
+
+ /// Prev allocation.currentMagnitude should NOT equal newly-set magnitude
+ /// Cur allocation.currentMagnitude SHOULD
+ for (uint i = 0; i < params.strategies.length; i++) {
+ assertTrue(prevAllocations[i].currentMagnitude != params.newMagnitudes[i], err);
+ assertEq(curAllocations[i].currentMagnitude, params.newMagnitudes[i], err);
+ }
}
-
- /*******************************************************************************
- SNAPSHOT ASSERTIONS
- TIME TRAVELERS ONLY BEYOND THIS POINT
- *******************************************************************************/
-
- /*******************************************************************************
- SNAPSHOT ASSERTIONS: ALLOCATIONS
- *******************************************************************************/
- function assert_Snap_Allocations_Modified(
+ function assert_Snap_Slashed_Allocation(
User operator,
- IAllocationManagerTypes.AllocateParams memory allocateParams,
- bool completed,
+ OperatorSet memory operatorSet,
+ SlashingParams memory params,
string memory err
) internal {
- IAllocationManagerTypes.Allocation[] memory curAllocs = _getAllocations(operator, allocateParams.operatorSet, allocateParams.strategies);
- IAllocationManagerTypes.Allocation[] memory prevAllocs = _getPrevAllocations(operator, allocateParams.operatorSet, allocateParams.strategies);
- Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, allocateParams.strategies);
- Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, allocateParams.strategies);
-
- for (uint i = 0; i < allocateParams.strategies.length; i++) {
- IAllocationManagerTypes.Allocation memory curAlloc = curAllocs[i];
- IAllocationManagerTypes.Allocation memory prevAlloc = prevAllocs[i];
-
- // Check allocations
- if (completed) {
- assertEq(curAlloc.currentMagnitude, allocateParams.newMagnitudes[i], string.concat(err, " (currentMagnitude)"));
- assertEq(curAlloc.pendingDiff, 0, string.concat(err, " (pendingDiff)"));
- assertEq(curAlloc.effectBlock, 0, string.concat(err, " (effectBlock)"));
- } else {
- assertEq(
- curAlloc.currentMagnitude,
- prevAlloc.currentMagnitude,
- string.concat(err, " (currentMagnitude)")
- );
- assertEq(
- curAlloc.pendingDiff,
- prevAlloc.pendingDiff + int128(int64(allocateParams.newMagnitudes[i])),
- string.concat(err, " (pendingDiff)")
- );
-
- (, uint32 delay) = allocationManager.getAllocationDelay(address(operator));
-
- assertEq(
- curAlloc.effectBlock,
- block.number + delay,
- string.concat(err, " (effectBlock)")
- );
- }
-
- // Check magnitudes
- Magnitudes memory curMagnitude = curMagnitudes[i];
- Magnitudes memory prevMagnitude = prevMagnitudes[i];
-
- // if (isAllocation) ...
- if (prevAlloc.currentMagnitude < allocateParams.newMagnitudes[i]) {
- uint256 delta = allocateParams.newMagnitudes[i] - prevAlloc.currentMagnitude;
-
- // FIXME: Fails on `testFuzz_deposit_delegate_allocate` when completed == true.
- if (!completed) {
- assertEq(
- curMagnitude.encumbered,
- prevMagnitude.encumbered + delta,
- string.concat(err, " (encumbered magnitude)")
- );
+ Allocation[] memory curAllocations = _getAllocations(operator, operatorSet, params.strategies);
+ Allocation[] memory prevAllocations = _getPrevAllocations(operator, operatorSet, params.strategies);
- assertEq(
- curMagnitude.allocatable,
- prevMagnitude.allocatable - delta,
- string.concat(err, " (allocatable magnitude)")
- );
- }
- } else {
- uint256 delta = prevAlloc.currentMagnitude - allocateParams.newMagnitudes[i];
+ for (uint i = 0; i < params.strategies.length; i++) {
+ uint expectedSlashed = prevAllocations[i].currentMagnitude.mulWadRoundUp(params.wadsToSlash[i]);
+ assertEq(curAllocations[i].currentMagnitude, prevAllocations[i].currentMagnitude - expectedSlashed, err);
+ }
+ }
- // if deallocated, and completed
- if (completed) {
- assertEq(
- curMagnitude.encumbered - delta,
- prevMagnitude.encumbered,
- string.concat(err, " (encumbered magnitude)")
- );
+ function assert_Snap_Unchanged_MaxMagnitude(
+ User operator,
+ IStrategy[] memory strategies,
+ string memory err
+ ) internal {
+ Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, strategies);
+ Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, strategies);
- assertEq(
- curMagnitude.allocatable,
- prevMagnitude.allocatable + delta,
- string.concat(err, " (allocatable magnitude)")
- );
- } else {
- assertEq(
- curMagnitude.encumbered,
- prevMagnitude.encumbered,
- string.concat(err, " (encumbered magnitude)")
- );
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(curMagnitudes[i].max, prevMagnitudes[i].max, err);
+ }
+ }
- assertEq(
- curMagnitude.allocatable,
- prevMagnitude.allocatable,
- string.concat(err, " (allocatable magnitude)")
- );
- }
- }
+ function assert_Snap_Slashed_MaxMagnitude(
+ User operator,
+ SlashingParams memory params,
+ string memory err
+ ) internal {
+ Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, params.strategies);
+ Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, params.strategies);
- // Max magnitude should not have mutated.
- assertEq(
- curMagnitude.max,
- prevMagnitude.max,
- string.concat(err, " (max magnitude)")
- );
+ for (uint i = 0; i < params.strategies.length; i++) {
+ uint expectedSlashed = prevMagnitudes[i].max.mulWadRoundUp(params.wadsToSlash[i]);
+ assertEq(curMagnitudes[i].max, prevMagnitudes[i].max - expectedSlashed, err);
}
}
function assert_Snap_Allocations_Slashed(
- IAllocationManagerTypes.SlashingParams memory slashingParams,
+ SlashingParams memory slashingParams,
OperatorSet memory operatorSet,
bool completed,
string memory err
) internal {
User op = User(payable(slashingParams.operator));
- IAllocationManagerTypes.Allocation[] memory curAllocs = _getAllocations(op, operatorSet, slashingParams.strategies);
- IAllocationManagerTypes.Allocation[] memory prevAllocs = _getPrevAllocations(op, operatorSet, slashingParams.strategies);
+ Allocation[] memory curAllocs = _getAllocations(op, operatorSet, slashingParams.strategies);
+ Allocation[] memory prevAllocs = _getPrevAllocations(op, operatorSet, slashingParams.strategies);
Magnitudes[] memory curMagnitudes = _getMagnitudes(op, slashingParams.strategies);
Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(op, slashingParams.strategies);
- (, uint32 delay) = allocationManager.getAllocationDelay(slashingParams.operator);
+ uint32 delay = _getExistingAllocationDelay(User(payable(slashingParams.operator)));
for (uint i = 0; i < slashingParams.strategies.length; i++) {
- IAllocationManagerTypes.Allocation memory curAlloc = curAllocs[i];
- IAllocationManagerTypes.Allocation memory prevAlloc = prevAllocs[i];
+ Allocation memory curAlloc = curAllocs[i];
+ Allocation memory prevAlloc = prevAllocs[i];
uint64 slashedMagnitude = uint64(uint256(prevAlloc.currentMagnitude).mulWadRoundUp(slashingParams.wadsToSlash[i]));
@@ -518,8 +1238,8 @@ abstract contract IntegrationBase is IntegrationDeployer {
function assert_HasUnderlyingTokenBalances_AfterSlash(
User staker,
- IAllocationManagerTypes.AllocateParams memory allocateParams,
- IAllocationManagerTypes.SlashingParams memory slashingParams,
+ AllocateParams memory allocateParams,
+ SlashingParams memory slashingParams,
uint[] memory expectedBalances,
string memory err
) internal view {
@@ -545,8 +1265,8 @@ abstract contract IntegrationBase is IntegrationDeployer {
function assert_Snap_StakerWithdrawableShares_AfterSlash(
User staker,
- IAllocationManagerTypes.AllocateParams memory allocateParams,
- IAllocationManagerTypes.SlashingParams memory slashingParams,
+ AllocateParams memory allocateParams,
+ SlashingParams memory slashingParams,
string memory err
) internal {
uint[] memory curShares = _getWithdrawableShares(staker, allocateParams.strategies);
@@ -604,7 +1324,7 @@ abstract contract IntegrationBase is IntegrationDeployer {
// For each strategy, check (prev - removed == cur)
for (uint i = 0; i < strategies.length; i++) {
- assertEq(prevShares[i] - removedShares[i], curShares[i], err);
+ assertEq(prevShares[i], curShares[i] + removedShares[i], err);
}
}
@@ -648,6 +1368,47 @@ abstract contract IntegrationBase is IntegrationDeployer {
}
}
+ function assert_Snap_Slashed_OperatorShares(
+ User operator,
+ SlashingParams memory params,
+ string memory err
+ ) internal {
+ uint[] memory curShares = _getOperatorShares(operator, params.strategies);
+ uint[] memory prevShares = _getPrevOperatorShares(operator, params.strategies);
+
+ Magnitudes[] memory curMagnitudes = _getMagnitudes(operator, params.strategies);
+ Magnitudes[] memory prevMagnitudes = _getPrevMagnitudes(operator, params.strategies);
+
+ for (uint i = 0; i < params.strategies.length; i++) {
+ uint expectedSlashed = SlashingLib.calcSlashedAmount({
+ operatorShares: prevShares[i],
+ prevMaxMagnitude: prevMagnitudes[i].max,
+ newMaxMagnitude: curMagnitudes[i].max
+ });
+
+ assertEq(curShares[i], prevShares[i] - expectedSlashed, err);
+ }
+ }
+
+ function assert_Snap_Increased_BurnableShares(
+ User operator,
+ SlashingParams memory params,
+ string memory err
+ ) internal {
+ uint[] memory curBurnable = _getBurnableShares(params.strategies);
+ uint[] memory prevBurnable = _getPrevBurnableShares(params.strategies);
+
+ uint[] memory curShares = _getOperatorShares(operator, params.strategies);
+ uint[] memory prevShares = _getPrevOperatorShares(operator, params.strategies);
+
+ for (uint i = 0; i < params.strategies.length; i++) {
+ uint slashedAtLeast = prevShares[i] - curShares[i];
+
+ // Not factoring in slashable shares in queue here, because that gets more complex (TODO)
+ assertTrue(curBurnable[i] >= (prevBurnable[i] + slashedAtLeast), err);
+ }
+ }
+
/*******************************************************************************
SNAPSHOT ASSERTIONS: STAKER SHARES
*******************************************************************************/
@@ -673,80 +1434,131 @@ abstract contract IntegrationBase is IntegrationDeployer {
function assert_Snap_Added_Staker_DepositShares(
User staker,
IStrategy strat,
- uint _addedShares,
+ uint addedShares,
string memory err
) internal {
- IStrategy[] memory strategies = new IStrategy[](1);
- uint[] memory addedShares = new uint[](1);
- strategies[0] = strat;
- addedShares[0] = _addedShares;
-
- assert_Snap_Added_Staker_DepositShares(staker, strategies, addedShares, err);
+ assert_Snap_Added_Staker_DepositShares(staker, strat.toArray(), addedShares.toArrayU256(), err);
}
/// @dev Check that the staker has `removedShares` fewer delegatable shares
/// for each strategy since the last snapshot
- function assert_Snap_Removed_StakerDepositShares(
+ function assert_Snap_Removed_Staker_DepositShares(
+ User staker,
+ IStrategy[] memory strategies,
+ uint[] memory removedShares,
+ string memory err
+ ) internal {
+ uint[] memory curShares = _getStakerDepositShares(staker, strategies);
+ // Use timewarp to get previous staker shares
+ uint[] memory prevShares = _getPrevStakerDepositShares(staker, strategies);
+
+ // For each strategy, check (prev - removed == cur)
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(prevShares[i] - removedShares[i], curShares[i], err);
+ }
+ }
+
+ function assert_Snap_Removed_Staker_DepositShares(
+ User staker,
+ IStrategy strat,
+ uint removedShares,
+ string memory err
+ ) internal {
+ assert_Snap_Removed_Staker_DepositShares(staker, strat.toArray(), removedShares.toArrayU256(), err);
+ }
+
+ /// @dev Check that the staker's delegatable shares in ALL strategies have not changed
+ /// since the last snapshot
+ function assert_Snap_Unchanged_Staker_DepositShares(
+ User staker,
+ string memory err
+ ) internal {
+ IStrategy[] memory strategies = allStrats;
+
+ uint[] memory curShares = _getStakerDepositShares(staker, strategies);
+ // Use timewarp to get previous staker shares
+ uint[] memory prevShares = _getPrevStakerDepositShares(staker, strategies);
+
+ // For each strategy, check (prev == cur)
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(prevShares[i], curShares[i], err);
+ }
+ }
+
+ /// @dev Check that the staker's withdrawable shares have increased by `addedShares`
+ function assert_Snap_Added_Staker_WithdrawableShares(
+ User staker,
+ IStrategy[] memory strategies,
+ uint[] memory addedShares,
+ string memory err
+ ) internal {
+ uint[] memory curShares = _getStakerWithdrawableShares(staker, strategies);
+ // Use timewarp to get previous staker shares
+ uint[] memory prevShares = _getPrevStakerWithdrawableShares(staker, strategies);
+
+ // For each strategy, check (prev - removed == cur)
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(prevShares[i] + addedShares[i], curShares[i], err);
+ }
+ }
+
+ /// @dev Check that the staker's withdrawable shares have decreased by `removedShares`
+ function assert_Snap_Removed_Staker_WithdrawableShares(
+ User staker,
+ IStrategy[] memory strategies,
+ uint[] memory removedShares,
+ string memory err
+ ) internal {
+ uint[] memory curShares = _getStakerWithdrawableShares(staker, strategies);
+ // Use timewarp to get previous staker shares
+ uint[] memory prevShares = _getPrevStakerWithdrawableShares(staker, strategies);
+
+ // For each strategy, check (prev - removed == cur)
+ for (uint i = 0; i < strategies.length; i++) {
+ assertEq(prevShares[i] - removedShares[i], curShares[i], err);
+ }
+ }
+
+ /// @dev Check that all the staker's withdrawable shares have been removed
+ function assert_Snap_RemovedAll_Staker_WithdrawableShares(
User staker,
IStrategy[] memory strategies,
- uint[] memory removedShares,
string memory err
) internal {
- uint[] memory curShares = _getStakerDepositShares(staker, strategies);
- // Use timewarp to get previous staker shares
- uint[] memory prevShares = _getPrevStakerDepositShares(staker, strategies);
-
- // For each strategy, check (prev - removed == cur)
+ uint[] memory curShares = _getStakerWithdrawableShares(staker, strategies);
+ // For each strategy, check all shares have been withdrawn
for (uint i = 0; i < strategies.length; i++) {
- assertEq(prevShares[i] - removedShares[i], curShares[i], err);
+ assertEq(0, curShares[i], err);
}
}
- function assert_Snap_Removed_StakerDepositShares(
+ function assert_Snap_Removed_Staker_WithdrawableShares(
User staker,
IStrategy strat,
- uint _removedShares,
+ uint removedShares,
string memory err
) internal {
- IStrategy[] memory strategies = new IStrategy[](1);
- uint[] memory removedShares = new uint[](1);
- strategies[0] = strat;
- removedShares[0] = _removedShares;
-
- assert_Snap_Removed_StakerDepositShares(staker, strategies, removedShares, err);
+ assert_Snap_Removed_Staker_WithdrawableShares(staker, strat.toArray(), removedShares.toArrayU256(), err);
}
/// @dev Check that the staker's withdrawable shares have decreased by `removedShares`
- function assert_Snap_Removed_StakerWithdrawableShares(
- User staker,
- IStrategy[] memory strategies,
- uint[] memory removedShares,
+ /// FIX THIS WHEN WORKING ON ROUNDING ISSUES
+ function assert_Snap_Unchanged_Staker_WithdrawableShares_Delegation(
+ User staker,
string memory err
) internal {
+ IStrategy[] memory strategies = allStrats;
+
uint[] memory curShares = _getStakerWithdrawableShares(staker, strategies);
// Use timewarp to get previous staker shares
uint[] memory prevShares = _getPrevStakerWithdrawableShares(staker, strategies);
// For each strategy, check (prev - removed == cur)
for (uint i = 0; i < strategies.length; i++) {
- assertEq(prevShares[i] - removedShares[i], curShares[i], err);
+ assertApproxEqAbs(prevShares[i], curShares[i], 100000, err);
}
}
- function assert_Snap_Removed_StakerWithdrawableShares(
- User staker,
- IStrategy strat,
- uint _removedShares,
- string memory err
- ) internal {
- IStrategy[] memory strategies = new IStrategy[](1);
- uint[] memory removedShares = new uint[](1);
- strategies[0] = strat;
- removedShares[0] = _removedShares;
-
- assert_Snap_Removed_StakerWithdrawableShares(staker, strategies, removedShares, err);
- }
-
/// @dev Check that the staker's withdrawable shares have decreased by at least `removedShares`
/// @dev Used to handle overslashing of beacon chain
function assert_Snap_Removed_Staker_WithdrawableShares_AtLeast(
@@ -771,30 +1583,7 @@ abstract contract IntegrationBase is IntegrationDeployer {
uint removedShares,
string memory err
) internal {
- IStrategy[] memory strategies = new IStrategy[](1);
- uint[] memory removedSharesArr = new uint[](1);
- strategies[0] = strat;
- removedSharesArr[0] = removedShares;
-
- assert_Snap_Removed_Staker_WithdrawableShares_AtLeast(staker, strategies, removedSharesArr, err);
- }
-
- /// @dev Check that the staker's delegatable shares in ALL strategies have not changed
- /// since the last snapshot
- function assert_Snap_Unchanged_StakerDepositShares(
- User staker,
- string memory err
- ) internal {
- IStrategy[] memory strategies = allStrats;
-
- uint[] memory curShares = _getStakerDepositShares(staker, strategies);
- // Use timewarp to get previous staker shares
- uint[] memory prevShares = _getPrevStakerDepositShares(staker, strategies);
-
- // For each strategy, check (prev == cur)
- for (uint i = 0; i < strategies.length; i++) {
- assertEq(prevShares[i], curShares[i], err);
- }
+ assert_Snap_Removed_Staker_WithdrawableShares_AtLeast(staker, strat.toArray(), removedShares.toArrayU256(), err);
}
function assert_Snap_Delta_StakerShares(
@@ -925,7 +1714,7 @@ abstract contract IntegrationBase is IntegrationDeployer {
function assert_Snap_Added_QueuedWithdrawals(
User staker,
- IDelegationManagerTypes.Withdrawal[] memory withdrawals,
+ Withdrawal[] memory withdrawals,
string memory err
) internal {
uint curQueuedWithdrawals = _getCumulativeWithdrawals(staker);
@@ -937,7 +1726,7 @@ abstract contract IntegrationBase is IntegrationDeployer {
function assert_Snap_Added_QueuedWithdrawal(
User staker,
- IDelegationManagerTypes.Withdrawal memory /*withdrawal*/,
+ Withdrawal memory /*withdrawal*/,
string memory err
) internal {
uint curQueuedWithdrawal = _getCumulativeWithdrawals(staker);
@@ -990,12 +1779,12 @@ abstract contract IntegrationBase is IntegrationDeployer {
) internal {
bytes32[] memory pubkeyHashes = beaconChain.getPubkeyHashes(addedValidators);
- IEigenPodTypes.VALIDATOR_STATUS[] memory curStatuses = _getValidatorStatuses(staker, pubkeyHashes);
- IEigenPodTypes.VALIDATOR_STATUS[] memory prevStatuses = _getPrevValidatorStatuses(staker, pubkeyHashes);
+ VALIDATOR_STATUS[] memory curStatuses = _getValidatorStatuses(staker, pubkeyHashes);
+ VALIDATOR_STATUS[] memory prevStatuses = _getPrevValidatorStatuses(staker, pubkeyHashes);
for (uint i = 0; i < curStatuses.length; i++) {
- assertTrue(prevStatuses[i] == IEigenPodTypes.VALIDATOR_STATUS.INACTIVE, err);
- assertTrue(curStatuses[i] == IEigenPodTypes.VALIDATOR_STATUS.ACTIVE, err);
+ assertTrue(prevStatuses[i] == VALIDATOR_STATUS.INACTIVE, err);
+ assertTrue(curStatuses[i] == VALIDATOR_STATUS.ACTIVE, err);
}
}
@@ -1006,12 +1795,12 @@ abstract contract IntegrationBase is IntegrationDeployer {
) internal {
bytes32[] memory pubkeyHashes = beaconChain.getPubkeyHashes(exitedValidators);
- IEigenPodTypes.VALIDATOR_STATUS[] memory curStatuses = _getValidatorStatuses(staker, pubkeyHashes);
- IEigenPodTypes.VALIDATOR_STATUS[] memory prevStatuses = _getPrevValidatorStatuses(staker, pubkeyHashes);
+ VALIDATOR_STATUS[] memory curStatuses = _getValidatorStatuses(staker, pubkeyHashes);
+ VALIDATOR_STATUS[] memory prevStatuses = _getPrevValidatorStatuses(staker, pubkeyHashes);
for (uint i = 0; i < curStatuses.length; i++) {
- assertTrue(prevStatuses[i] == IEigenPodTypes.VALIDATOR_STATUS.ACTIVE, err);
- assertTrue(curStatuses[i] == IEigenPodTypes.VALIDATOR_STATUS.WITHDRAWN, err);
+ assertTrue(prevStatuses[i] == VALIDATOR_STATUS.ACTIVE, err);
+ assertTrue(curStatuses[i] == VALIDATOR_STATUS.WITHDRAWN, err);
}
}
@@ -1106,6 +1895,183 @@ abstract contract IntegrationBase is IntegrationDeployer {
UTILITY METHODS
*******************************************************************************/
+ /// @dev Fetches the opreator's allocation delay; asserts that it is set
+ function _getExistingAllocationDelay(User operator) internal view returns (uint32) {
+ (bool isSet, uint32 delay) = allocationManager.getAllocationDelay(address(operator));
+ assertTrue(isSet, "_getExistingAllocationDelay: expected allocation delay to be set");
+
+ return delay;
+ }
+
+ /// @dev Generate params to allocate all available magnitude to each strategy in the operator set
+ function _genAllocation_AllAvailable(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal view returns (AllocateParams memory params) {
+ return _genAllocation_AllAvailable({
+ operator: operator,
+ operatorSet: operatorSet,
+ strategies: allocationManager.getStrategiesInOperatorSet(operatorSet)
+ });
+ }
+
+ /// @dev Generate params to allocate all available magnitude to each strategy in the operator set
+ function _genAllocation_AllAvailable(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies
+ ) internal view returns (AllocateParams memory params) {
+ params.operatorSet = operatorSet;
+ params.strategies = strategies;
+ params.newMagnitudes = new uint64[](params.strategies.length);
+
+ for (uint i = 0; i < params.strategies.length; i++) {
+ IStrategy strategy = params.strategies[i];
+ params.newMagnitudes[i] = allocationManager.getMaxMagnitude(address(operator), strategy);
+ }
+ }
+
+ /// @dev Gen params to allocate half of available magnitude to each strategy in the operator set
+ /// returns the params to complete this allocation
+ function _genAllocation_HalfAvailable(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal view returns (AllocateParams memory params) {
+ return _genAllocation_HalfAvailable({
+ operator: operator,
+ operatorSet: operatorSet,
+ strategies: allocationManager.getStrategiesInOperatorSet(operatorSet)
+ });
+ }
+
+ /// @dev Gen params to allocate half of available magnitude to each strategy in the operator set
+ /// returns the params to complete this allocation
+ function _genAllocation_HalfAvailable(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies
+ ) internal view returns (AllocateParams memory params) {
+ params.operatorSet = operatorSet;
+ params.strategies = strategies;
+ params.newMagnitudes = new uint64[](params.strategies.length);
+
+ Allocation[] memory allocations = _getAllocations(operator, operatorSet, strategies);
+ Magnitudes[] memory magnitudes = _getMagnitudes(operator, strategies);
+
+ for (uint i = 0; i < params.strategies.length; i++) {
+ uint64 halfAvailable = uint64(magnitudes[i].allocatable) / 2;
+ params.newMagnitudes[i] = allocations[i].currentMagnitude + halfAvailable;
+ }
+ }
+
+ /// @dev Generate params to allocate a random portion of available magnitude to each strategy
+ /// in the operator set. All strategies will have a nonzero allocation, and the minimum allocation
+ /// will be 10% of available magnitude
+ function _genAllocation_Rand(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal returns (AllocateParams memory params) {
+ params.operatorSet = operatorSet;
+ params.strategies = allocationManager.getStrategiesInOperatorSet(operatorSet);
+ params.newMagnitudes = new uint64[](params.strategies.length);
+
+ Allocation[] memory allocations = _getAllocations(operator, operatorSet, params.strategies);
+ Magnitudes[] memory magnitudes = _getMagnitudes(operator, params.strategies);
+
+ for (uint i = 0; i < params.strategies.length; i++) {
+ // minimum of 10%, maximum of 100%. increments of 10%.
+ uint r = _randUint({min: 1, max: 10});
+ uint64 allocation = uint64(magnitudes[i].allocatable) / uint64(r);
+
+ params.newMagnitudes[i] = allocations[i].currentMagnitude + allocation;
+ }
+ }
+
+ /// @dev Generates params for a half deallocation from all strategies the operator is allocated to in the operator set
+ function _genDeallocation_HalfRemaining(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal view returns (AllocateParams memory params) {
+ return _genDeallocation_HalfRemaining({
+ operator: operator,
+ operatorSet: operatorSet,
+ strategies: allocationManager.getStrategiesInOperatorSet(operatorSet)
+ });
+ }
+
+ /// @dev Generates params for a half deallocation from all strategies the operator is allocated to in the operator set
+ function _genDeallocation_HalfRemaining(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies
+ ) internal view returns (AllocateParams memory params) {
+ params.operatorSet = operatorSet;
+ params.strategies = strategies;
+ params.newMagnitudes = new uint64[](params.strategies.length);
+
+ for (uint i = 0; i < params.strategies.length; i++) {
+ IStrategy strategy = params.strategies[i];
+ params.newMagnitudes[i] = allocationManager.getEncumberedMagnitude(address(operator), strategy) / 2;
+ }
+ }
+
+ /// @dev Generates params for a full deallocation from all strategies the operator is allocated to in the operator set
+ function _genDeallocation_Full(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal view returns (AllocateParams memory params) {
+ return _genDeallocation_Full({
+ operator: operator,
+ operatorSet: operatorSet,
+ strategies: allocationManager.getStrategiesInOperatorSet(operatorSet)
+ });
+ }
+
+ /// @dev Generates params for a full deallocation from all strategies the operator is allocated to in the operator set
+ function _genDeallocation_Full(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies
+ ) internal pure returns (AllocateParams memory params) {
+ params.operatorSet = operatorSet;
+ params.strategies = strategies;
+ params.newMagnitudes = new uint64[](params.strategies.length);
+ }
+
+ /// Generate random slashing between 1 and 99%
+ function _genSlashing_Rand(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal returns (SlashingParams memory params) {
+ params.operator = address(operator);
+ params.operatorSetId = operatorSet.id;
+ params.description = "genSlashing_Half";
+ params.strategies = allocationManager.getStrategiesInOperatorSet(operatorSet).sort();
+ params.wadsToSlash = new uint[](params.strategies.length);
+
+ /// 1% * rand(1, 99)
+ uint slashWad = 1e16 * _randUint({min: 1, max: 99});
+
+ for (uint i = 0; i < params.wadsToSlash.length; i++) {
+ params.wadsToSlash[i] = slashWad;
+ }
+ }
+
+ function _genSlashing_Half(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal view returns (SlashingParams memory params) {
+ params.operator = address(operator);
+ params.operatorSetId = operatorSet.id;
+ params.description = "genSlashing_Half";
+ params.strategies = allocationManager.getStrategiesInOperatorSet(operatorSet).sort();
+ params.wadsToSlash = new uint[](params.strategies.length);
+
+ for (uint i = 0; i < params.wadsToSlash.length; i++) {
+ params.wadsToSlash[i] = 1e17;
+ }
+ }
+
function _randWadToSlash() internal returns (uint) {
return _randUint({ min: 0.01 ether, max: 1 ether });
}
@@ -1133,6 +2099,45 @@ abstract contract IntegrationBase is IntegrationDeployer {
return (strategies.sort(), wadsToSlash);
}
+
+ function _strategiesAndWadsForFullSlash(
+ OperatorSet memory operatorSet
+ ) internal view returns (IStrategy[] memory strategies, uint[] memory wadsToSlash) {
+ // Get list of all strategies in an operator set.
+ strategies = allocationManager.getStrategiesInOperatorSet(operatorSet);
+
+ wadsToSlash = new uint[](strategies.length);
+
+ for (uint i; i < strategies.length; ++i) {
+ wadsToSlash[i] = 1 ether;
+ }
+
+ return(strategies.sort(), wadsToSlash);
+ }
+
+ function _strategiesAndWadsForRandFullSlash(
+ OperatorSet memory operatorSet
+ ) internal returns (IStrategy[] memory strategies, uint[] memory wadsToSlash) {
+ // Get list of all strategies in an operator set.
+ strategies = allocationManager.getStrategiesInOperatorSet(operatorSet);
+
+ // Randomly select a subset of strategies to slash.
+ uint len = _randUint({ min: 1, max: strategies.length });
+
+ // Update length of strategies array.
+ assembly {
+ mstore(strategies, len)
+ }
+
+ wadsToSlash = new uint[](len);
+
+ // Fully slash each selected strategy
+ for (uint i; i < len; ++i) {
+ wadsToSlash[i] = 1 ether;
+ }
+
+ return (strategies.sort(), wadsToSlash);
+ }
function _randMagnitudes(uint64 sum, uint256 len) internal returns (uint64[] memory magnitudes) {
magnitudes = new uint64[](len);
@@ -1151,6 +2156,18 @@ abstract contract IntegrationBase is IntegrationDeployer {
}
}
+ function _maxMagnitudes(OperatorSet memory operatorSet, User operator) internal view returns (uint64[] memory magnitudes) {
+ IStrategy[] memory strategies = allocationManager.getStrategiesInOperatorSet(operatorSet);
+ uint256 len = strategies.length;
+ magnitudes = new uint64[](len);
+
+ if (len == 0) return magnitudes;
+
+ for (uint256 i; i < len; ++i) {
+ magnitudes[i] = allocationManager.getMaxMagnitude(address(operator), strategies[i]);
+ }
+ }
+
function _randWithdrawal(
IStrategy[] memory strategies,
uint[] memory shares
@@ -1242,7 +2259,13 @@ abstract contract IntegrationBase is IntegrationDeployer {
}
function _calcNativeETHOperatorShareDelta(User staker, int shareDelta) internal view returns (int) {
- int curPodOwnerShares = eigenPodManager.podOwnerDepositShares(address(staker));
+ // TODO: Maybe we update parent method to have an M2 and Slashing version?
+ int curPodOwnerShares;
+ if (!isUpgraded) {
+ curPodOwnerShares = IEigenPodManager_DeprecatedM2(address(eigenPodManager)).podOwnerShares(address(staker));
+ } else {
+ curPodOwnerShares = eigenPodManager.podOwnerDepositShares(address(staker));
+ }
int newPodOwnerShares = curPodOwnerShares + shareDelta;
if (curPodOwnerShares <= 0) {
@@ -1303,7 +2326,7 @@ abstract contract IntegrationBase is IntegrationDeployer {
}
function _getWithdrawalHashes(
- IDelegationManagerTypes.Withdrawal[] memory withdrawals
+ Withdrawal[] memory withdrawals
) internal view returns (bytes32[] memory) {
bytes32[] memory withdrawalRoots = new bytes32[](withdrawals.length);
@@ -1338,7 +2361,7 @@ abstract contract IntegrationBase is IntegrationDeployer {
}
/// @dev Rolls forward by the minimum withdrawal delay blocks.
- function _rollBlocksForCompleteWithdrawals(IDelegationManagerTypes.Withdrawal[] memory withdrawals) internal {
+ function _rollBlocksForCompleteWithdrawals(Withdrawal[] memory withdrawals) internal {
uint256 latest;
for (uint i = 0; i < withdrawals.length; ++i) {
if (withdrawals[i].startBlock > latest) latest = withdrawals[i].startBlock;
@@ -1346,6 +2369,24 @@ abstract contract IntegrationBase is IntegrationDeployer {
cheats.roll(latest + delegationManager.minWithdrawalDelayBlocks() + 1);
}
+ function _rollForward_AllocationDelay(User operator) internal {
+ uint32 delay = _getExistingAllocationDelay(operator);
+ rollForward(delay);
+ }
+
+ function _rollBackward_AllocationDelay(User operator) internal {
+ uint32 delay = _getExistingAllocationDelay(operator);
+ rollBackward(delay);
+ }
+
+ function _rollForward_DeallocationDelay() internal {
+ rollForward(allocationManager.DEALLOCATION_DELAY() + 1);
+ }
+
+ function _rollBackward_DeallocationDelay() internal {
+ rollBackward(allocationManager.DEALLOCATION_DELAY() + 1);
+ }
+
/// @dev Rolls forward by the default allocation delay blocks.
function _rollBlocksForCompleteAllocation(
User operator,
@@ -1381,7 +2422,7 @@ abstract contract IntegrationBase is IntegrationDeployer {
User operator,
OperatorSet memory operatorSet,
IStrategy[] memory strategies
- ) internal timewarp() returns (IAllocationManagerTypes.Allocation[] memory) {
+ ) internal timewarp() returns (Allocation[] memory) {
return _getAllocations(operator, operatorSet, strategies);
}
@@ -1390,13 +2431,63 @@ abstract contract IntegrationBase is IntegrationDeployer {
User operator,
OperatorSet memory operatorSet,
IStrategy[] memory strategies
- ) internal view returns (IAllocationManagerTypes.Allocation[] memory allocations) {
- allocations = new IAllocationManagerTypes.Allocation[](strategies.length);
+ ) internal view returns (Allocation[] memory allocations) {
+ allocations = new Allocation[](strategies.length);
for (uint i = 0; i < strategies.length; ++i) {
allocations[i] = allocationManager.getAllocation(address(operator), operatorSet, strategies[i]);
}
}
+ function _getPrevAllocatedStrats(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal timewarp() returns (IStrategy[] memory) {
+ return _getAllocatedStrats(operator, operatorSet);
+ }
+
+ function _getAllocatedStrats(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal view returns (IStrategy[] memory) {
+ return allocationManager.getAllocatedStrategies(address(operator), operatorSet);
+ }
+
+ function _getPrevAllocatedSets(
+ User operator
+ ) internal timewarp() returns (OperatorSet[] memory) {
+ return _getAllocatedSets(operator);
+ }
+
+ function _getAllocatedSets(
+ User operator
+ ) internal view returns (OperatorSet[] memory) {
+ return allocationManager.getAllocatedSets(address(operator));
+ }
+
+ function _getPrevRegisteredSets(
+ User operator
+ ) internal timewarp() returns (OperatorSet[] memory) {
+ return _getRegisteredSets(operator);
+ }
+
+ function _getRegisteredSets(
+ User operator
+ ) internal view returns (OperatorSet[] memory) {
+ return allocationManager.getRegisteredSets(address(operator));
+ }
+
+ function _getPrevMembers(
+ OperatorSet memory operatorSet
+ ) internal timewarp returns (address[] memory) {
+ return _getMembers(operatorSet);
+ }
+
+ function _getMembers(
+ OperatorSet memory operatorSet
+ ) internal view returns (address[] memory) {
+ return allocationManager.getMembers(operatorSet);
+ }
+
struct Magnitudes {
uint256 encumbered;
uint256 allocatable;
@@ -1417,13 +2508,129 @@ abstract contract IntegrationBase is IntegrationDeployer {
magnitudes = new Magnitudes[](strategies.length);
for (uint i = 0; i < strategies.length; ++i) {
magnitudes[i] = Magnitudes({
- encumbered: allocationManager.encumberedMagnitude(address(operator), strategies[i]),
+ encumbered: allocationManager.getEncumberedMagnitude(address(operator), strategies[i]),
allocatable: allocationManager.getAllocatableMagnitude(address(operator), strategies[i]),
max: allocationManager.getMaxMagnitude(address(operator), strategies[i])
});
}
}
+ function _getMaxMagnitudes(
+ User operator,
+ IStrategy[] memory strategies
+ ) internal view returns (uint64[] memory) {
+ return allocationManager.getMaxMagnitudes(address(operator), strategies);
+ }
+
+ function _getMaxMagnitudes(
+ User operator,
+ IStrategy[] memory strategies,
+ uint32 blockNum
+ ) internal view returns (uint64[] memory) {
+ return allocationManager.getMaxMagnitudesAtBlock(address(operator), strategies, blockNum);
+ }
+
+ function _getPrevMinSlashableStake(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies
+ ) internal timewarp() returns (uint[] memory) {
+ return _getMinSlashableStake(operator, operatorSet, strategies);
+ }
+
+ function _getMinSlashableStake(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies
+ ) internal view returns (uint[] memory) {
+ return allocationManager.getMinimumSlashableStake({
+ operatorSet: operatorSet,
+ operators: address(operator).toArray(),
+ strategies: strategies,
+ futureBlock: uint32(block.number)
+ })[0];
+ }
+
+ function _getPrevAllocatedStake(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies
+ ) internal timewarp() returns (uint[] memory) {
+ return _getAllocatedStake(operator, operatorSet, strategies);
+ }
+
+ function _getAllocatedStake(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies
+ ) internal view returns (uint[] memory) {
+ return allocationManager.getAllocatedStake({
+ operatorSet: operatorSet,
+ operators: address(operator).toArray(),
+ strategies: strategies
+ })[0];
+ }
+
+ function _getPrevIsSlashable(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal timewarp() returns (bool) {
+ return _getIsSlashable(operator, operatorSet);
+ }
+
+ function _getIsSlashable(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal view returns (bool) {
+ return allocationManager.isOperatorSlashable(address(operator), operatorSet);
+ }
+
+ function _getPrevIsMemberOfSet(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal timewarp() returns (bool) {
+ return _getIsMemberOfSet(operator, operatorSet);
+ }
+
+ function _getIsMemberOfSet(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal view returns (bool) {
+ return allocationManager.isMemberOfOperatorSet(address(operator), operatorSet);
+ }
+
+ function _getPrevBurnableShares(IStrategy[] memory strategies) internal timewarp() returns (uint[] memory) {
+ return _getBurnableShares(strategies);
+ }
+
+ function _getBurnableShares(IStrategy[] memory strategies) internal view returns (uint[] memory) {
+ uint[] memory burnableShares = new uint[](strategies.length);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ if (strategies[i] == beaconChainETHStrategy) {
+ burnableShares[i] = eigenPodManager.burnableETHShares();
+ } else {
+ burnableShares[i] = strategyManager.getBurnableShares(strategies[i]);
+ }
+ }
+
+ return burnableShares;
+ }
+
+ function _getPrevSlashableSharesInQueue(User operator, IStrategy[] memory strategies) internal timewarp() returns (uint[] memory) {
+ return _getSlashableSharesInQueue(operator, strategies);
+ }
+
+ function _getSlashableSharesInQueue(User operator, IStrategy[] memory strategies) internal view returns (uint[] memory) {
+ uint[] memory slashableShares = new uint[](strategies.length);
+
+ for (uint i = 0; i < strategies.length; i++) {
+ slashableShares[i] = delegationManager.getSlashableSharesInQueue(address(operator), strategies[i]);
+ }
+
+ return slashableShares;
+ }
+
/// @dev Uses timewarp modifier to get operator shares at the last snapshot
function _getPrevOperatorShares(
User operator,
@@ -1462,12 +2669,7 @@ abstract contract IntegrationBase is IntegrationDeployer {
// This method should only be used for tests that handle positive
// balances. Negative balances are an edge case that require
// the own tests and helper methods.
- int shares;
- if (forkType != LOCAL && !isUpgraded) {
- shares = int(IEigenPodManager_DeprecatedM2(address(eigenPodManager)).podOwnerShares(address(staker)));
- } else {
- shares = int(eigenPodManager.podOwnerDepositShares(address(staker)));
- }
+ int shares = eigenPodManager.podOwnerDepositShares(address(staker));
if (shares < 0) {
revert("_getStakerDepositShares: negative shares");
@@ -1475,11 +2677,7 @@ abstract contract IntegrationBase is IntegrationDeployer {
curShares[i] = uint(shares);
} else {
- if (forkType != LOCAL && !isUpgraded) {
- curShares[i] = IStrategyManager_DeprecatedM2(address(strategyManager)).stakerStrategyShares(address(staker), strat);
- } else {
- curShares[i] = strategyManager.stakerDepositShares(address(staker), strat);
- }
+ curShares[i] = strategyManager.stakerDepositShares(address(staker), strat);
}
}
@@ -1573,6 +2771,34 @@ abstract contract IntegrationBase is IntegrationDeployer {
return shares;
}
+ function _getDepositScalingFactors(User staker, IStrategy[] memory strategies) internal view returns (uint[] memory) {
+ uint[] memory depositScalingFactors = new uint[](strategies.length);
+ for (uint i=0; i < strategies.length; i++) {
+ depositScalingFactors[i] = _getDepositScalingFactor(staker, strategies[i]);
+ }
+ return depositScalingFactors;
+ }
+
+ function _getDepositScalingFactor(User staker, IStrategy strategy) internal view returns (uint) {
+ return delegationManager.depositScalingFactor(address(staker), strategy);
+ }
+
+ function _getExpectedDSFUndelegate(User staker) internal view returns (uint expectedDepositScalingFactor) {
+ return WAD.divWad(_getBeaconChainSlashingFactor(staker));
+ }
+
+ function _getExpectedWithdrawableSharesUndelegate(User staker, IStrategy[] memory strategies, uint[] memory shares) internal view returns (uint[] memory){
+ uint[] memory expectedWithdrawableShares = new uint[](strategies.length);
+ for (uint i = 0; i < strategies.length; i++) {
+ if (strategies[i] == BEACONCHAIN_ETH_STRAT) {
+ expectedWithdrawableShares[i] = shares[i].mulWad(_getExpectedDSFUndelegate(staker)).mulWad(_getBeaconChainSlashingFactor(staker));
+ } else {
+ expectedWithdrawableShares[i] = shares[i];
+ }
+ }
+ return expectedWithdrawableShares;
+ }
+
function _getPrevWithdrawableShares(User staker, IStrategy[] memory strategies) internal timewarp() returns (uint[] memory) {
return _getWithdrawableShares(staker, strategies);
}
@@ -1590,9 +2816,9 @@ abstract contract IntegrationBase is IntegrationDeployer {
return _getActiveValidatorCount(staker);
}
- function _getValidatorStatuses(User staker, bytes32[] memory pubkeyHashes) internal view returns (IEigenPodTypes.VALIDATOR_STATUS[] memory) {
+ function _getValidatorStatuses(User staker, bytes32[] memory pubkeyHashes) internal view returns (VALIDATOR_STATUS[] memory) {
EigenPod pod = staker.pod();
- IEigenPodTypes.VALIDATOR_STATUS[] memory statuses = new IEigenPodTypes.VALIDATOR_STATUS[](pubkeyHashes.length);
+ VALIDATOR_STATUS[] memory statuses = new VALIDATOR_STATUS[](pubkeyHashes.length);
for (uint i = 0; i < statuses.length; i++) {
statuses[i] = pod.validatorStatus(pubkeyHashes[i]);
@@ -1601,7 +2827,7 @@ abstract contract IntegrationBase is IntegrationDeployer {
return statuses;
}
- function _getPrevValidatorStatuses(User staker, bytes32[] memory pubkeyHashes) internal timewarp() returns (IEigenPodTypes.VALIDATOR_STATUS[] memory) {
+ function _getPrevValidatorStatuses(User staker, bytes32[] memory pubkeyHashes) internal timewarp() returns (VALIDATOR_STATUS[] memory) {
return _getValidatorStatuses(staker, pubkeyHashes);
}
@@ -1633,13 +2859,8 @@ abstract contract IntegrationBase is IntegrationDeployer {
}
function _getCheckpointPodBalanceGwei(User staker) internal view returns (uint64) {
- if (forkType != LOCAL && !isUpgraded) {
- IEigenPod_DeprecatedM2 pod = IEigenPod_DeprecatedM2(address(staker.pod()));
- return uint64(pod.currentCheckpoint().podBalanceGwei);
- } else {
- EigenPod pod = staker.pod();
- return uint64(pod.currentCheckpoint().podBalanceGwei);
- }
+ EigenPod pod = staker.pod();
+ return uint64(pod.currentCheckpoint().podBalanceGwei);
}
function _getPrevCheckpointPodBalanceGwei(User staker) internal timewarp() returns (uint64) {
diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol
index 6229e74e73..da6db99215 100644
--- a/src/test/integration/IntegrationChecks.t.sol
+++ b/src/test/integration/IntegrationChecks.t.sol
@@ -10,22 +10,12 @@ import "src/test/integration/users/User_M2.t.sol";
contract IntegrationCheckUtils is IntegrationBase {
using ArrayLib for IStrategy[];
using SlashingLib for *;
+ using StdStyle for *;
/*******************************************************************************
EIGENPOD CHECKS
*******************************************************************************/
- function check_VerifyWC_State(
- User_M2 staker,
- uint40[] memory validators,
- uint64 beaconBalanceGwei
- ) internal {
- uint beaconBalanceWei = beaconBalanceGwei * GWEI_TO_WEI;
- assert_Snap_Added_Staker_DepositShares(staker, BEACONCHAIN_ETH_STRAT, beaconBalanceWei, "staker should have added deposit shares to beacon chain strat");
- assert_Snap_Added_ActiveValidatorCount(staker, validators.length, "staker should have increased active validator count");
- assert_Snap_Added_ActiveValidators(staker, validators, "validators should each be active");
- }
-
function check_VerifyWC_State(
User staker,
uint40[] memory validators,
@@ -99,8 +89,8 @@ contract IntegrationCheckUtils is IntegrationBase {
) internal {
check_CompleteCheckpoint_State(staker);
- assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should not have decreased");
- assert_Snap_Removed_StakerWithdrawableShares(staker, BEACONCHAIN_ETH_STRAT, slashedAmountGwei * GWEI_TO_WEI, "should have decreased withdrawable shares by slashed amount");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should not have decreased");
+ assert_Snap_Removed_Staker_WithdrawableShares(staker, BEACONCHAIN_ETH_STRAT, slashedAmountGwei * GWEI_TO_WEI, "should have decreased withdrawable shares by slashed amount");
assert_Snap_Removed_ActiveValidatorCount(staker, slashedValidators.length, "should have decreased active validator count");
assert_Snap_Removed_ActiveValidators(staker, slashedValidators, "exited validators should each be WITHDRAWN");
}
@@ -112,10 +102,11 @@ contract IntegrationCheckUtils is IntegrationBase {
) internal {
check_CompleteCheckpoint_State(staker);
- assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should not have decreased");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should not have decreased");
assert_Snap_Removed_Staker_WithdrawableShares_AtLeast(staker, BEACONCHAIN_ETH_STRAT, slashedAmountGwei * GWEI_TO_WEI, "should have decreased withdrawable shares by at least slashed amount");
- assert_Snap_Removed_ActiveValidatorCount(staker, slashedValidators.length, "should have decreased active validator count");
- assert_Snap_Removed_ActiveValidators(staker, slashedValidators, "exited validators should each be WITHDRAWN");
+ // TODO - currently only used after a `NoWithdrawNoRewards` action. Investigate re-adding in future.
+ // assert_Snap_Removed_ActiveValidatorCount(staker, slashedValidators.length, "should have decreased active validator count");
+ // assert_Snap_Removed_ActiveValidators(staker, slashedValidators, "exited validators should each be WITHDRAWN");
}
function check_CompleteCheckpoint_WithCLSlashing_HandleRoundDown_State(
@@ -124,7 +115,7 @@ contract IntegrationCheckUtils is IntegrationBase {
) internal {
check_CompleteCheckpoint_State(staker);
- assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should not have decreased");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should not have decreased");
assert_Snap_Removed_Staker_WithdrawableShares_AtLeast(staker, BEACONCHAIN_ETH_STRAT, slashedAmountGwei * GWEI_TO_WEI, "should have decreased withdrawable shares by at least slashed amount");
assert_Snap_Unchanged_ActiveValidatorCount(staker, "should not have changed active validator count");
}
@@ -135,8 +126,8 @@ contract IntegrationCheckUtils is IntegrationBase {
) internal {
check_CompleteCheckpoint_State(staker);
- assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should not have decreased");
- assert_Snap_Removed_StakerWithdrawableShares(staker, BEACONCHAIN_ETH_STRAT, slashedAmountGwei * GWEI_TO_WEI, "should have decreased withdrawable shares by slashed amount");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should not have decreased");
+ assert_Snap_Removed_Staker_WithdrawableShares(staker, BEACONCHAIN_ETH_STRAT, slashedAmountGwei * GWEI_TO_WEI, "should have decreased withdrawable shares by slashed amount");
assert_Snap_Unchanged_ActiveValidatorCount(staker, "should not have changed active validator count");
}
@@ -147,7 +138,7 @@ contract IntegrationCheckUtils is IntegrationBase {
) internal {
check_CompleteCheckpoint_WithPodBalance_State(staker, exitedBalanceGwei);
- assert_Snap_Unchanged_StakerDepositShares(staker, "staker should not have changed shares");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker should not have changed shares");
assert_Snap_Added_BalanceExitedGwei(staker, exitedBalanceGwei, "should have attributed expected gwei to exited balance");
assert_Snap_Removed_ActiveValidatorCount(staker, exitedValidators.length, "should have decreased active validator count");
assert_Snap_Removed_ActiveValidators(staker, exitedValidators, "exited validators should each be WITHDRAWN");
@@ -170,8 +161,8 @@ contract IntegrationCheckUtils is IntegrationBase {
// and that the staker now has the expected amount of delegated shares in each strategy
assert_HasNoUnderlyingTokenBalance(staker, strategies, "staker should have transferred all underlying tokens");
assert_Snap_Added_Staker_DepositShares(staker, strategies, shares, "staker should expect shares in each strategy after depositing");
+ assert_Snap_Added_Staker_WithdrawableShares(staker, strategies, shares, "deposit should increase withdrawable shares");
}
-
function check_Deposit_State_PartialDeposit(User staker, IStrategy[] memory strategies, uint[] memory shares, uint[] memory tokenBalances) internal {
/// Deposit into strategies:
@@ -182,6 +173,7 @@ contract IntegrationCheckUtils is IntegrationBase {
// and that the staker now has the expected amount of delegated shares in each strategy
assert_HasUnderlyingTokenBalances(staker, strategies, tokenBalances, "staker should have transferred some underlying tokens");
assert_Snap_Added_Staker_DepositShares(staker, strategies, shares, "staker should expected shares in each strategy after depositing");
+ assert_Snap_Added_Staker_WithdrawableShares(staker, strategies, shares, "deposit should increase withdrawable shares");
}
function check_Delegation_State(
@@ -197,9 +189,10 @@ contract IntegrationCheckUtils is IntegrationBase {
assertTrue(delegationManager.isDelegated(address(staker)), "staker should be delegated");
assertEq(address(operator), delegationManager.delegatedTo(address(staker)), "staker should be delegated to operator");
assert_HasExpectedShares(staker, strategies, shares, "staker should still have expected shares after delegating");
- assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should be unchanged after delegating");
- // TODO: fix this assertion
- // assert_Snap_Added_OperatorShares(operator, strategies, shares, "operator should have received shares");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should be unchanged after delegating");
+ assert_Snap_Unchanged_Staker_WithdrawableShares_Delegation(staker, "withdrawable shares should be unchanged after delegating");
+ uint256[] memory delegatableShares = _getPrevStakerWithdrawableShares(staker, strategies);
+ assert_Snap_Added_OperatorShares(operator, strategies, delegatableShares, "operator should have received shares");
}
function check_QueuedWithdrawal_State(
@@ -207,7 +200,7 @@ contract IntegrationCheckUtils is IntegrationBase {
User operator,
IStrategy[] memory strategies,
uint[] memory shares,
- IDelegationManagerTypes.Withdrawal[] memory withdrawals,
+ Withdrawal[] memory withdrawals,
bytes32[] memory withdrawalRoots
) internal {
// The staker will queue one or more withdrawals for the selected strategies and shares
@@ -224,35 +217,72 @@ contract IntegrationCheckUtils is IntegrationBase {
"check_QueuedWithdrawal_State: staker should have increased nonce by withdrawals.length");
assert_Snap_Removed_OperatorShares(operator, strategies, shares,
"check_QueuedWithdrawal_State: failed to remove operator shares");
- assert_Snap_Removed_StakerDepositShares(staker, strategies, shares,
+ assert_Snap_Removed_Staker_DepositShares(staker, strategies, shares,
"check_QueuedWithdrawal_State: failed to remove staker shares");
+ assert_Snap_Removed_Staker_WithdrawableShares(staker, strategies, shares,
+ "check_QueuedWithdrawal_State: failed to remove staker withdrawable shares");
}
function check_Undelegate_State(
User staker,
User operator,
- IDelegationManagerTypes.Withdrawal[] memory withdrawals,
+ Withdrawal[] memory withdrawals,
bytes32[] memory withdrawalRoots,
IStrategy[] memory strategies,
- uint[] memory shares
+ uint[] memory stakerDepositShares,
+ uint[] memory stakerDelegatedShares
) internal {
/// Undelegate from an operator
//
- // ... check that the staker is undelegated, all strategies from which the staker is deposited are unqeuued,
+ // ... check that the staker is undelegated, all strategies from which the staker is deposited are unqueued,
// that the returned root matches the hashes for each strategy and share amounts, and that the staker
// and operator have reduced shares
assertFalse(delegationManager.isDelegated(address(staker)),
"check_Undelegate_State: staker should not be delegated");
assert_ValidWithdrawalHashes(withdrawals, withdrawalRoots,
- "check_Undelegate_State: calculated withdrawals should match returned roots");
+ "check_Undelegate_State: calculated withdrawal should match returned root");
assert_AllWithdrawalsPending(withdrawalRoots,
"check_Undelegate_State: stakers withdrawal should now be pending");
+ assert_DSF_Reset(staker, strategies,
+ "check_Undelegate_State: staker dsfs should be reset to wad");
assert_Snap_Added_QueuedWithdrawals(staker, withdrawals,
"check_Undelegate_State: staker should have increased nonce by withdrawals.length");
- assert_Snap_Removed_OperatorShares(operator, strategies, shares,
+ assert_Snap_Removed_OperatorShares(operator, strategies, stakerDelegatedShares,
"check_Undelegate_State: failed to remove operator shares");
- assert_Snap_Removed_StakerDepositShares(staker, strategies, shares,
+ assert_Snap_Removed_Staker_DepositShares(staker, strategies, stakerDepositShares,
"check_Undelegate_State: failed to remove staker shares");
+ assert_Snap_RemovedAll_Staker_WithdrawableShares(staker, strategies,
+ "check_QueuedWithdrawal_State: failed to remove staker withdrawable shares");
+ }
+
+ function check_Redelegate_State(
+ User staker,
+ User operator,
+ IDelegationManagerTypes.Withdrawal[] memory withdrawals,
+ bytes32[] memory withdrawalRoots,
+ IStrategy[] memory strategies,
+ uint[] memory stakerDepositShares,
+ uint[] memory stakerDelegatedShares
+ ) internal {
+ /// Redelegate to a new operator
+ //
+ // ... check that the staker is delegated to new operator, all strategies from which the staker is deposited are unqueued,
+ // that the returned root matches the hashes for each strategy and share amounts, and that the staker
+ // and operator have reduced shares
+ assertTrue(delegationManager.isDelegated(address(staker)),
+ "check_Redelegate_State: staker should not be delegated");
+ assert_ValidWithdrawalHashes(withdrawals, withdrawalRoots,
+ "check_Redelegate_State: calculated withdrawal should match returned root");
+ assert_AllWithdrawalsPending(withdrawalRoots,
+ "check_Redelegate_State: stakers withdrawal should now be pending");
+ assert_Snap_Added_QueuedWithdrawals(staker, withdrawals,
+ "check_Redelegate_State: staker should have increased nonce by withdrawals.length");
+ assert_Snap_Removed_OperatorShares(operator, strategies, stakerDelegatedShares,
+ "check_Redelegate_State: failed to remove operator shares");
+ assert_Snap_Removed_Staker_DepositShares(staker, strategies, stakerDepositShares,
+ "check_Redelegate_State: failed to remove staker shares");
+ assert_Snap_RemovedAll_Staker_WithdrawableShares(staker, strategies,
+ "check_QueuedWithdrawal_State: failed to remove staker withdrawable shares");
}
/**
@@ -268,7 +298,7 @@ contract IntegrationCheckUtils is IntegrationBase {
function check_Withdrawal_AsTokens_State(
User staker,
User operator,
- IDelegationManagerTypes.Withdrawal memory withdrawal,
+ Withdrawal memory withdrawal,
IStrategy[] memory strategies,
uint[] memory shares,
IERC20[] memory tokens,
@@ -278,7 +308,7 @@ contract IntegrationCheckUtils is IntegrationBase {
assert_WithdrawalNotPending(delegationManager.calculateWithdrawalRoot(withdrawal), "staker withdrawal should no longer be pending");
assert_Snap_Added_TokenBalances(staker, tokens, expectedTokens, "staker should have received expected tokens");
- assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should not have changed");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should not have changed");
assert_Snap_Removed_StrategyShares(strategies, shares, "strategies should have total shares decremented");
// Checks specific to an operator that the Staker has delegated to
@@ -293,7 +323,7 @@ contract IntegrationCheckUtils is IntegrationBase {
function check_Withdrawal_AsShares_State(
User staker,
User operator,
- IDelegationManagerTypes.Withdrawal memory withdrawal,
+ Withdrawal memory withdrawal,
IStrategy[] memory strategies,
uint[] memory shares
) internal {
@@ -316,6 +346,30 @@ contract IntegrationCheckUtils is IntegrationBase {
function check_Withdrawal_AsShares_Undelegated_State(
User staker,
User operator,
+ Withdrawal memory withdrawal,
+ IStrategy[] memory strategies,
+ uint[] memory shares
+ ) internal {
+ /// Complete withdrawal(s):
+ // The staker will complete the withdrawal as shares
+ //
+ // ... check that the withdrawal is not pending, that the token balances of the staker and operator are unchanged,
+ // that the withdrawer received the expected shares, and that that the total shares of each o
+ // strategy withdrawn remains unchanged
+ assert_WithdrawalNotPending(delegationManager.calculateWithdrawalRoot(withdrawal), "staker withdrawal should no longer be pending");
+ assert_Snap_Unchanged_TokenBalances(staker, "staker should not have any change in underlying token balances");
+ assert_Snap_Unchanged_TokenBalances(operator, "operator should not have any change in underlying token balances");
+ assert_Snap_Added_Staker_DepositShares(staker, strategies, shares, "staker should have received expected deposit shares");
+ uint[] memory expectedWithdrawableShares = _getExpectedWithdrawableSharesUndelegate(staker, strategies, shares);
+ assert_Snap_Added_Staker_WithdrawableShares(staker, strategies, expectedWithdrawableShares, "staker should have received expected withdrawable shares");
+ assert_Snap_Unchanged_OperatorShares(operator, "operator should have shares unchanged");
+ assert_Snap_Unchanged_StrategyShares(strategies, "strategies should have total shares unchanged");
+ }
+
+ function check_Withdrawal_AsShares_Redelegated_State(
+ User staker,
+ User operator,
+ User newOperator,
IDelegationManagerTypes.Withdrawal memory withdrawal,
IStrategy[] memory strategies,
uint[] memory shares
@@ -335,17 +389,523 @@ contract IntegrationCheckUtils is IntegrationBase {
}
/*******************************************************************************
- ALLOCATION MANAGER CHECKS
+ ALM - BASIC INVARIANTS
+ *******************************************************************************/
+
+ /// @dev Run a method as if the user's allocation delay had passed
+ /// When done, reset block number so other tests are not affected
+ modifier activateAllocation(User operator) {
+ _rollForward_AllocationDelay(operator);
+
+ _;
+
+ _rollBackward_AllocationDelay(operator);
+ }
+
+ /// @dev Run a method as if the deallocation delay has passed
+ /// When done, reset block number so other tests are not affected
+ modifier activateDeallocation() {
+ _rollForward_DeallocationDelay();
+
+ _;
+
+ _rollBackward_DeallocationDelay();
+ }
+
+ /// @dev Run a method ONLY IF the operator has a nonzero activation delay
+ modifier skipIfInstantAlloc(User operator) {
+ /// Note: if the ALM says the allocation delay is "not set", this will revert
+ uint32 delay = _getExistingAllocationDelay(operator);
+
+ if (delay != 0) {
+ _;
+ } else {
+ console.log("%s", "skipping checks for operator with allocation delay of 0".italic());
+ }
+ }
+
+ /// @dev Check global max magnitude invariants - these should ALWAYS hold
+ function check_MaxMag_Invariants(
+ User operator
+ ) internal {
+ assert_MaxMagsEqualMaxMagsAtCurrentBlock(operator, allStrats, "max magnitudes should equal upperlookup at current block");
+ assert_MaxEqualsAllocatablePlusEncumbered(operator, "max magnitude should equal encumbered plus allocatable");
+ }
+
+ /// @dev Check that the last call to modifyAllocations resulted in a non-pending modification
+ function check_ActiveModification_State(
+ User operator,
+ AllocateParams memory params
+ ) internal {
+ OperatorSet memory operatorSet = params.operatorSet;
+ IStrategy[] memory strategies = params.strategies;
+
+ assert_CurrentMagnitude(operator, params, "current magnitude should match allocate params");
+ assert_NoPendingModification(operator, operatorSet, strategies, "there should not be a pending modification for any strategy");
+ }
+
+ function check_IsSlashable_State(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory strategies
+ ) internal {
+ assert_IsSlashable(operator, operatorSet, "operator should be slashable for operator set");
+ assert_CurMinSlashableEqualsMinAllocated(operator, operatorSet, strategies, "minimum slashable stake should equal allocated stake at current block");
+ }
+
+ function check_NotSlashable_State(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal {
+ assert_NotSlashable(operator, operatorSet, "operator should not be slashable for operator set");
+ assert_NoSlashableStake(operator, operatorSet, "operator should not have any slashable stake");
+ }
+
+ /*******************************************************************************
+ ALM - REGISTRATION
*******************************************************************************/
+ /// @dev Basic invariants that should hold after EVERY call to `registerForOperatorSets`
+ /// NOTE: These are only slightly modified from check_Base_Deregistration_State
+ /// If you add invariants here, consider adding them there (and vice-versa)
+ function check_Base_Registration_State(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal {
+ check_MaxMag_Invariants(operator);
+ check_IsSlashable_State(operator, operatorSet, allocationManager.getStrategiesInOperatorSet(operatorSet));
+
+ // Registration SHOULD register the operator, making them slashable and adding them as a member of the set
+ assert_Snap_Became_Registered(operator, operatorSet, "operator should not have been registered before, and is now registered");
+ assert_Snap_Became_Slashable(operator, operatorSet, "operator should not have been slashable before, and is now slashable");
+ assert_Snap_Added_RegisteredSet(operator, operatorSet, "should have added operator sets to list of registered sets");
+ assert_Snap_Added_MemberOfSet(operator, operatorSet, "should have added operator to list of set members");
+
+ // Registration should NOT change anything about magnitude, allocations, or allocated sets
+ assert_Snap_Unchanged_AllocatedSets(operator, "should not have updated allocated sets");
+ assert_Snap_Unchanged_AllocatedStrats(operator, operatorSet, "should not have updated allocated strategies");
+ assert_Snap_Unchanged_MaxMagnitude(operator, allStrats, "should not have updated max magnitudes in any way");
+ assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, allStrats, "should not have updated allocated stake in any way");
+ assert_Snap_Unchanged_StrategyAllocations(operator, operatorSet, allStrats, "should not have updated any individual allocations");
+ assert_Snap_Unchanged_EncumberedMagnitude(operator, allStrats, "should not have updated encumbered magnitude");
+ assert_Snap_Unchanged_AllocatableMagnitude(operator, allStrats, "should not have updated allocatable magnitude");
+ }
+
+ /// @dev Check invariants for registerForOperatorSets given a set of strategies
+ /// for which NO allocation exists (currentMag/pendingDiff are 0)
+ /// @param unallocated For the given operatorSet, a list of strategies for which NO allocation exists
+ function check_Registration_State_NoAllocation(
+ User operator,
+ OperatorSet memory operatorSet,
+ IStrategy[] memory unallocated
+ ) internal {
+ check_Base_Registration_State(operator, operatorSet);
+
+ /// The operator is NOT allocated, ensure their slashable stake and magnitudes are unchanged
+ assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, unallocated, "should not have updated allocated stake in any way");
+ assert_Snap_Unchanged_SlashableStake(operator, operatorSet, unallocated, "operator should not have increased slashable stake for any given strategy");
+ }
+
+ /// @dev Check invariants for registerForOperatorSets AFTER a prior allocation becomes active
+ /// @param active allocation params to the last call to modifyAllocations
+ ///
+ /// ASSUMES:
+ /// - the effect block for `params` has already passed
+ /// - params.newMagnitudes does NOT contain any `0` entries
+ function check_Registration_State_ActiveAllocation(
+ User operator,
+ AllocateParams memory active
+ ) internal {
+ OperatorSet memory operatorSet = active.operatorSet;
+ IStrategy[] memory strategies = active.strategies;
+
+ /// Basic registerForOperatorSets invariants
+ check_Base_Registration_State(operator, operatorSet);
+
+ /// Given an active allocation, check that the allocation is reflected in state
+ assert_IsAllocatedToSet(operator, operatorSet, "operatorSet should be included in allocatedSets");
+ assert_IsAllocatedToSetStrats(operator, operatorSet, strategies, "strategies should be included in allocatedStrategies");
+ assert_CurrentMagnitude(operator, active, "queried allocation should equal active allocation");
+
+ /// Check that additional stake just became slashable
+ assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, strategies, "should not have updated allocated stake in any way");
+ assert_Snap_StakeBecameSlashable(operator, operatorSet, strategies, "registration should make entirety of active allocation slashable");
+ }
+
+ /// @dev Check registration invariants. Assumes the operator has a PENDING allocation
+ /// to the set, but that the allocation's effect block has not yet been reached
+ function check_Registration_State_PendingAllocation(
+ User operator,
+ AllocateParams memory params
+ ) internal {
+ OperatorSet memory operatorSet = params.operatorSet;
+ IStrategy[] memory strategies = params.strategies;
+
+ check_Base_Registration_State(operator, operatorSet);
+
+ assert_IsAllocatedToSet(operator, operatorSet, "operator should be allocated to set, even while pending");
+ assert_IsAllocatedToSetStrats(operator, operatorSet, strategies, "strategies should be included in allocatedStrategies");
+
+ /// Skip pending checks if operator has no allocation delay
+ uint32 delay = _getExistingAllocationDelay(operator);
+ if (delay == 0) {
+ return;
+ }
+
+ assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, strategies, "should not have updated allocated stake in any way");
+ assert_Snap_Unchanged_SlashableStake(operator, operatorSet, allStrats, "operator should not have increased slashable stake");
+ }
+
+ /*******************************************************************************
+ ALM - DEREGISTRATION
+ *******************************************************************************/
+
+ /// @dev Basic invariants that should hold after EVERY call to `deregisterFromOperatorSets`
+ /// NOTE: These are only slightly modified from check_Base_Registration_State
+ /// If you add invariants here, consider adding them there (and vice-versa)
+ function check_Base_Deregistration_State(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal {
+ check_MaxMag_Invariants(operator);
+
+ // Deregistration SHOULD remove the operator as a member of the set
+ assert_Snap_Became_Deregistered(operator, operatorSet, "operator should have been registered before, and is now deregistered");
+ assert_Snap_Removed_RegisteredSet(operator, operatorSet, "should have removed operator set from list of registered sets");
+ assert_Snap_Removed_MemberOfSet(operator, operatorSet, "should have removed operator from list of set members");
+
+ // Deregistration should NOT change slashability, magnitude, allocations, or allocated sets
+ assert_Snap_Remains_Slashable(operator, operatorSet, "operator should have been slashable already, and should still be slashable");
+ assert_Snap_Unchanged_AllocatedSets(operator, "should not have updated allocated sets");
+ assert_Snap_Unchanged_AllocatedStrats(operator, operatorSet, "should not have updated allocated strategies");
+ assert_Snap_Unchanged_MaxMagnitude(operator, allStrats, "should not have updated max magnitudes in any way");
+ assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, allStrats, "should not have updated allocated stake in any way");
+ assert_Snap_Unchanged_StrategyAllocations(operator, operatorSet, allStrats, "should not have updated any individual allocations");
+ assert_Snap_Unchanged_EncumberedMagnitude(operator, allStrats, "should not have updated encumbered magnitude");
+ assert_Snap_Unchanged_AllocatableMagnitude(operator, allStrats, "should not have updated allocatable magnitude");
+
+ _rollForward_DeallocationDelay();
+ {
+ check_NotSlashable_State(operator, operatorSet);
+ }
+ _rollBackward_DeallocationDelay();
+ }
+
+ function check_Deregistration_State_NoAllocation(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal {
+ check_Base_Deregistration_State(operator, operatorSet);
+
+ assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, allStrats, "should not have updated allocated stake in any way");
+ assert_Snap_Unchanged_SlashableStake(operator, operatorSet, allStrats, "operator should not have increased slashable stake for any given strategy");
+ }
+
+ function check_Deregistration_State_ActiveAllocation(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal {
+ check_Base_Deregistration_State(operator, operatorSet);
+
+ assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, allStrats, "should not have updated allocated stake in any way");
+ assert_Snap_Unchanged_SlashableStake(operator, operatorSet, allStrats, "operator should not have increased slashable stake for any given strategy");
+ }
+
+ function check_Deregistration_State_PendingAllocation(
+ User operator,
+ OperatorSet memory operatorSet
+ ) internal {
+ check_Base_Deregistration_State(operator, operatorSet);
+
+ assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, allStrats, "should not have updated allocated stake in any way");
+ assert_Snap_Unchanged_SlashableStake(operator, operatorSet, allStrats, "operator should not have increased slashable stake for any given strategy");
+ }
+
+ /*******************************************************************************
+ ALM - INCREASE ALLOCATION
+ *******************************************************************************/
+
+ /// @dev Basic invariants that should hold after all calls to `modifyAllocations`
+ /// where the input `params` represent an _increase_ in magnitude
+ function check_Base_IncrAlloc_State(
+ User operator,
+ AllocateParams memory params
+ ) internal {
+ check_MaxMag_Invariants(operator);
+
+ OperatorSet memory operatorSet = params.operatorSet;
+ IStrategy[] memory strategies = params.strategies;
+ uint64[] memory newMagnitudes = params.newMagnitudes;
+
+ // Increasing Allocation should NOT change operator set registration, max magnitude
+ assert_Snap_Unchanged_Registration(operator, operatorSet, "operator registration status should be unchanged");
+ assert_Snap_Unchanged_Slashability(operator, operatorSet, "operator slashability should be unchanged");
+ assert_Snap_Unchanged_RegisteredSet(operator, "list of registered sets should remain unchanged");
+ assert_Snap_Unchanged_MemberOfSet(operatorSet, "list of set members should remain unchanged");
+ assert_Snap_Unchanged_MaxMagnitude(operator, allStrats, "should not have updated max magnitudes in any way");
+
+ // Increasing Allocation SHOULD consume magnitude and mark the operator as being allocated to the set
+ assert_IsAllocatedToSet(operator, operatorSet, "operator should be allocated to set");
+ assert_IsAllocatedToSetStrats(operator, operatorSet, strategies, "operator should be allocated to strategies for set");
+ assert_Snap_Allocated_Magnitude(operator, strategies, "operator should have allocated magnitude");
+ }
+
+ /// @dev Invariants for modifyAllocations. Use when:
+ /// - operator is NOT slashable for this operator set
+ /// - last call to modifyAllocations created an INCREASE in allocation
+ function check_IncrAlloc_State_NotSlashable(
+ User operator,
+ AllocateParams memory params
+ ) internal {
+ check_Base_IncrAlloc_State(operator, params);
+ check_NotSlashable_State(operator, params.operatorSet);
+
+ /// Run checks on pending allocation, if the operator has a nonzero delay
+ check_IncrAlloc_State_NotSlashable_Pending(operator, params);
+
+ /// Run checks on active allocation
+ check_IncrAlloc_State_NotSlashable_Active(operator, params);
+ }
+
+ /// @dev Invariants for modifyAllocations. Used when:
+ /// - operator is NOT slashable for this operator set
+ /// - last call to modifyAllocations created an INCREASE in allocation
+ /// - effectBlock for the increase HAS NOT been reached
+ function check_IncrAlloc_State_NotSlashable_Pending(
+ User operator,
+ AllocateParams memory params
+ ) private skipIfInstantAlloc(operator) {
+ // Validate operator allocation is pending
+ assert_HasPendingIncrease(operator, params, "params should reflect a pending modification");
+
+ // Should not have allocated magnitude
+ assert_Snap_Unchanged_AllocatedStake(operator, params.operatorSet, params.strategies, "should not have updated allocated stake in any way");
+ assert_Snap_Unchanged_SlashableStake(operator, params.operatorSet, params.strategies, "should not have updated allocated stake in any way");
+ }
+
+ /// @dev Invariants for modifyAllocations. Used when:
+ /// - operator is NOT slashable for this operator set
+ /// - last call to modifyAllocations created an INCREASE in allocation
+ /// - effectBlock for the increase HAS been reached
+ function check_IncrAlloc_State_NotSlashable_Active(
+ User operator,
+ AllocateParams memory params
+ ) private activateAllocation(operator) {
+ // Validate allocation is active
+ check_ActiveModification_State(operator, params);
+
+ // SHOULD set current magnitude and increase allocated stake
+ assert_Snap_Set_CurrentMagnitude(operator, params, "should have updated the operator's magnitude");
+ assert_HasAllocatedStake(operator, params, "operator should have expected allocated stake for each strategy");
+ assert_Snap_StakeBecameAllocated(operator, params.operatorSet, params.strategies, "allocated stake should have increased");
+
+ // Should NOT change slashable stake
+ assert_Snap_Unchanged_SlashableStake(operator, params.operatorSet, params.strategies, "slashable stake should not be changed");
+ }
+
+ /// @dev Invariants for modifyAllocations. Use when:
+ /// - operator IS slashable for this operator set
+ /// - last call to modifyAllocations created an INCREASE in allocation
+ function check_IncrAlloc_State_Slashable(
+ User operator,
+ AllocateParams memory params
+ ) internal {
+ check_Base_IncrAlloc_State(operator, params);
+ check_IsSlashable_State(operator, params.operatorSet, params.strategies);
+
+ /// Run checks on pending allocation, if the operator has a nonzero delay
+ check_IncrAlloc_State_Slashable_Pending(operator, params);
+
+ /// Run checks on active allocation
+ check_IncrAlloc_State_Slashable_Active(operator, params);
+ }
+
+ /// @dev Invariants for modifyAllocations. Used when:
+ /// - operator IS slashable for this operator set
+ /// - last call to modifyAllocations created an INCREASE in allocation
+ /// - effectBlock for the increase HAS NOT been reached
+ function check_IncrAlloc_State_Slashable_Pending(
+ User operator,
+ AllocateParams memory params
+ ) private skipIfInstantAlloc(operator) {
+ OperatorSet memory operatorSet = params.operatorSet;
+ IStrategy[] memory strategies = params.strategies;
+
+ // Validate operator has pending allocation and unchanged allocated/slashable stake
+ assert_HasPendingIncrease(operator, params, "params should reflect a pending modification");
+
+ // Should not have allocated magnitude
+ assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, strategies, "should not have updated allocated stake in any way");
+ assert_Snap_Unchanged_SlashableStake(operator, operatorSet, strategies, "should not have updated allocated stake in any way");
+ }
+
+ /// @dev Invariants for modifyAllocations. Used when:
+ /// - operator IS slashable for this operator set
+ /// - last call to modifyAllocations created an INCREASE in allocation
+ /// - effectBlock for the increase HAS been reached
+ function check_IncrAlloc_State_Slashable_Active(
+ User operator,
+ AllocateParams memory params
+ ) private activateAllocation(operator) {
+ // Validate operator does not have a pending modification, and has expected slashable stake
+ check_ActiveModification_State(operator, params);
+
+ // SHOULD set current magnitude and increase slashable/allocated stake
+ assert_Snap_Set_CurrentMagnitude(operator, params, "should have updated the operator's magnitude");
+ assert_HasAllocatedStake(operator, params, "operator should have expected allocated stake for each strategy");
+ assert_HasSlashableStake(operator, params, "operator should have expected slashable stake for each strategy");
+ assert_Snap_StakeBecameAllocated(operator, params.operatorSet, params.strategies, "allocated stake should have increased");
+ assert_Snap_StakeBecameSlashable(operator, params.operatorSet, params.strategies, "slashable stake should have increased");
+ }
+
+ /*******************************************************************************
+ ALM - DECREASE ALLOCATION
+ *******************************************************************************/
+
+ /// @dev Basic invariants that should hold after all calls to `modifyAllocations`
+ /// where the input `params` represent a decrease in magnitude
+ function check_Base_DecrAlloc_State(
+ User operator,
+ AllocateParams memory params
+ ) internal {
+ check_MaxMag_Invariants(operator);
+
+ OperatorSet memory operatorSet = params.operatorSet;
+ IStrategy[] memory strategies = params.strategies;
+ uint64[] memory newMagnitudes = params.newMagnitudes;
+
+ // Decreasing Allocation should NOT change operator set registration, max magnitude
+ assert_Snap_Unchanged_Registration(operator, operatorSet, "operator registration status should be unchanged");
+ assert_Snap_Unchanged_Slashability(operator, operatorSet, "operator slashability should be unchanged");
+ assert_Snap_Unchanged_RegisteredSet(operator, "list of registered sets should remain unchanged");
+ assert_Snap_Unchanged_MemberOfSet(operatorSet, "list of set members should remain unchanged");
+ assert_Snap_Unchanged_MaxMagnitude(operator, allStrats, "should not have updated max magnitudes in any way");
+ }
+
+ function check_DecrAlloc_State_NotSlashable(
+ User operator,
+ AllocateParams memory params
+ ) internal {
+ OperatorSet memory operatorSet = params.operatorSet;
+ IStrategy[] memory strategies = params.strategies;
+
+ check_Base_DecrAlloc_State(operator, params);
+ check_NotSlashable_State(operator, operatorSet);
+ check_ActiveModification_State(operator, params);
+
+ // SHOULD set current magnitude and decrease allocated stake
+ assert_HasAllocatedStake(operator, params, "operator should have expected allocated stake for each strategy");
+ assert_Snap_Set_CurrentMagnitude(operator, params, "should have updated the operator's magnitude");
+ assert_Snap_StakeBecameDeallocated(operator, operatorSet, strategies, "allocated stake should have increased");
+ assert_Snap_Deallocated_Magnitude(operator, strategies, "should have deallocated magnitude");
+ }
+
+ function check_DecrAlloc_State_Slashable(
+ User operator,
+ AllocateParams memory params
+ ) internal {
+ check_Base_DecrAlloc_State(operator, params);
+ check_IsSlashable_State(operator, params.operatorSet, params.strategies);
+
+ // Run checks on pending deallocation
+ check_DecrAlloc_State_Slashable_Pending(operator, params);
+
+ // Run checks on active deallocation
+ check_DecrAlloc_State_Slashable_Active(operator, params);
+ }
+
+ function check_DecrAlloc_State_Slashable_Pending(
+ User operator,
+ AllocateParams memory params
+ ) private {
+ // Validate deallocation is pending
+ assert_HasPendingDecrease(operator, params, "params should reflect a pending modification");
+
+ // Should NOT have changed allocated magnitude or stake
+ assert_Snap_Unchanged_EncumberedMagnitude(operator, params.strategies, "should not have changed encumbered magnitude");
+ assert_Snap_Unchanged_AllocatableMagnitude(operator, params.strategies, "should not have changed allocatable magnitude");
+ assert_Snap_Unchanged_AllocatedSets(operator, "should not have removed operator set from allocated sets");
+ assert_Snap_Unchanged_AllocatedStake(operator, params.operatorSet, params.strategies, "should not have updated allocated stake in any way");
+ assert_Snap_Unchanged_SlashableStake(operator, params.operatorSet, params.strategies, "should not have updated allocated stake in any way");
+ }
+
+ function check_DecrAlloc_State_Slashable_Active(
+ User operator,
+ AllocateParams memory params
+ ) private activateDeallocation() {
+ OperatorSet memory operatorSet = params.operatorSet;
+ IStrategy[] memory strategies = params.strategies;
+
+ check_ActiveModification_State(operator, params);
+
+ // SHOULD set current magnitude and decrease allocated stake
+ assert_Snap_Set_CurrentMagnitude(operator, params, "should have updated the operator's magnitude");
+ assert_HasAllocatedStake(operator, params, "operator should have expected allocated stake for each strategy");
+ assert_HasSlashableStake(operator, params, "operator should have expected slashable stake for each strategy");
+
+ assert_Snap_StakeBecomeUnslashable(operator, operatorSet, strategies, "slashable stake should have decreased");
+ assert_Snap_StakeBecameDeallocated(operator, params.operatorSet, params.strategies, "allocated stake should have decreased");
+ assert_Snap_Deallocated_Magnitude(operator, strategies, "should have deallocated magnitude");
+ }
+
+ function check_FullyDeallocated_State(
+ User operator,
+ AllocateParams memory allocateParams,
+ AllocateParams memory deallocateParams
+ ) internal {
+ OperatorSet memory operatorSet = allocateParams.operatorSet;
+ assert_NoSlashableStake(operator, operatorSet, "should not have any slashable stake");
+ // TODO - broken; do we want to fix this?
+ // assert_Snap_Removed_AllocatedSet(operator, operatorSet, "should have removed operator set from allocated sets");
+
+ // Any instant deallocation
+ assert_Snap_Removed_EncumberedMagnitude(operator, allocateParams.strategies, allocateParams.newMagnitudes, "should have removed allocation from encumbered magnitude");
+ assert_Snap_Added_AllocatableMagnitude(operator, allocateParams.strategies, allocateParams.newMagnitudes, "should have added allocation to allocatable magnitude");
+ assert_Snap_Unchanged_MaxMagnitude(operator, allStrats, "max magnitude should not have changed");
+
+ assert_MaxEqualsAllocatablePlusEncumbered(operator, "max magnitude should equal encumbered plus allocatable");
+ check_ActiveModification_State(operator, deallocateParams);
+ }
+
+ /*******************************************************************************
+ ALM - SLASHING
+ *******************************************************************************/
+
+ function check_Base_Slashing_State(
+ User operator,
+ AllocateParams memory allocateParams,
+ SlashingParams memory slashParams
+ ) internal {
+ OperatorSet memory operatorSet = allocateParams.operatorSet;
+
+ check_MaxMag_Invariants(operator);
+ check_IsSlashable_State(operator, operatorSet, allocateParams.strategies);
+
+ // Slashing SHOULD change max magnitude and current allocation
+ assert_Snap_Slashed_MaxMagnitude(operator, slashParams, "slash should lower max magnitude");
+ assert_Snap_Slashed_EncumberedMagnitude(operator, slashParams, "slash should lower max magnitude");
+ assert_Snap_Slashed_AllocatedStake(operator, operatorSet, slashParams, "slash should lower allocated stake");
+ assert_Snap_Slashed_SlashableStake(operator, operatorSet, slashParams, "slash should lower slashable stake");
+ assert_Snap_Slashed_OperatorShares(operator, slashParams, "slash should remove operator shares");
+ assert_Snap_Slashed_Allocation(operator, operatorSet, slashParams, "slash should reduce current magnitude");
+ assert_Snap_Increased_BurnableShares(operator, slashParams, "slash should increase burnable shares");
+
+ // Slashing SHOULD NOT change allocatable magnitude, registration, and slashability status
+ assert_Snap_Unchanged_AllocatableMagnitude(operator, allStrats, "slashing should not change allocatable magnitude");
+ assert_Snap_Unchanged_Registration(operator, operatorSet, "slash should not change registration status");
+ assert_Snap_Unchanged_Slashability(operator, operatorSet, "slash should not change slashability status");
+ assert_Snap_Unchanged_AllocatedSets(operator, "should not have updated allocated sets");
+ assert_Snap_Unchanged_AllocatedStrats(operator, operatorSet, "should not have updated allocated strategies");
+ }
+
// TODO: improvement needed
function check_Withdrawal_AsTokens_State_AfterSlash(
User staker,
User operator,
- IDelegationManagerTypes.Withdrawal memory withdrawal,
- IAllocationManagerTypes.AllocateParams memory allocateParams,
- IAllocationManagerTypes.SlashingParams memory slashingParams,
+ Withdrawal memory withdrawal,
+ AllocateParams memory allocateParams,
+ SlashingParams memory slashingParams,
uint[] memory expectedTokens
) internal {
IERC20[] memory tokens = new IERC20[](withdrawal.strategies.length);
@@ -377,8 +937,9 @@ contract IntegrationCheckUtils is IntegrationBase {
// Common checks
assert_WithdrawalNotPending(delegationManager.calculateWithdrawalRoot(withdrawal), "staker withdrawal should no longer be pending");
+ // TODO FIXME
// assert_Snap_Added_TokenBalances(staker, tokens, expectedTokens, "staker should have received expected tokens");
- assert_Snap_Unchanged_StakerDepositShares(staker, "staker shares should not have changed");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should not have changed");
assert_Snap_Removed_StrategyShares(withdrawal.strategies, withdrawal.scaledShares, "strategies should have total shares decremented");
// Checks specific to an operator that the Staker has delegated to
@@ -393,9 +954,9 @@ contract IntegrationCheckUtils is IntegrationBase {
function check_Withdrawal_AsShares_State_AfterSlash(
User staker,
User operator,
- IDelegationManagerTypes.Withdrawal memory withdrawal,
- IAllocationManagerTypes.AllocateParams memory, // TODO - was this needed?
- IAllocationManagerTypes.SlashingParams memory slashingParams
+ Withdrawal memory withdrawal,
+ AllocateParams memory allocateParams, // TODO - was this needed?
+ SlashingParams memory slashingParams
) internal {
IERC20[] memory tokens = new IERC20[](withdrawal.strategies.length);
diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol
index 8f69e208a4..90811262cd 100644
--- a/src/test/integration/IntegrationDeployer.t.sol
+++ b/src/test/integration/IntegrationDeployer.t.sol
@@ -10,6 +10,7 @@ import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
import "forge-std/Test.sol";
import "src/contracts/core/DelegationManager.sol";
+import "src/contracts/core/AllocationManager.sol";
import "src/contracts/core/StrategyManager.sol";
import "src/contracts/strategies/StrategyFactory.sol";
import "src/contracts/strategies/StrategyBase.sol";
@@ -30,20 +31,6 @@ import "src/test/integration/users/User_M2.t.sol";
import "script/utils/ExistingDeploymentParser.sol";
-// DelegationManager
-uint8 constant PAUSED_NEW_DELEGATION = 0;
-uint8 constant PAUSED_ENTER_WITHDRAWAL_QUEUE = 1;
-uint8 constant PAUSED_EXIT_WITHDRAWAL_QUEUE = 2;
-// StrategyManager
-uint8 constant PAUSED_DEPOSITS = 0;
-// EigenpodManager
-uint8 constant PAUSED_NEW_EIGENPODS = 0;
-uint8 constant PAUSED_WITHDRAW_RESTAKED_ETH = 1;
-uint8 constant PAUSED_EIGENPODS_VERIFY_CREDENTIALS = 2;
-uint8 constant PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE = 3;
-uint8 constant PAUSED_EIGENPODS_VERIFY_WITHDRAWAL = 4;
-uint8 constant PAUSED_NON_PROOF_WITHDRAWALS = 5;
-
IStrategy constant beaconChainETHStrategy = IStrategy(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0);
abstract contract IntegrationDeployer is ExistingDeploymentParser {
@@ -51,21 +38,20 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
// Fork ids for specific fork tests
bool isUpgraded;
- uint mainnetForkBlock = 20_847_130; // Post PI upgrade
- uint mainnetForkId;
- uint holeskyForkBLock = 1_213_950;
- uint holeskyForkId;
- uint64 constant DENEB_FORK_TIMESTAMP = 1_705_473_120;
+ uint mainnetForkBlock = 21_616_692; // Post Protocol Council upgrade
+
+ string version = "v9.9.9";
// Beacon chain genesis time when running locally
// Multiple of 12 for sanity's sake
uint64 constant GENESIS_TIME_LOCAL = 1 hours * 12;
uint64 constant GENESIS_TIME_MAINNET = 1_606_824_023;
+ uint64 BEACON_GENESIS_TIME; // set after forkType is decided
- uint8 constant NUM_LST_STRATS = 32;
-
- TimeMachine public timeMachine;
+ // Beacon chain deposit contract. The BeaconChainMock contract etchs ETHPOSDepositMock code here.
+ IETHPOSDeposit constant DEPOSIT_CONTRACT = IETHPOSDeposit(0x00000000219ab540356cBB839Cbe05303d7705Fa);
+ uint8 constant NUM_LST_STRATS = 32;
// Lists of strategies used in the system
//
// When we select random user assets, we use the `assetType` to determine
@@ -74,16 +60,16 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
IStrategy[] ethStrats; // only has one strat tbh
IStrategy[] allStrats; // just a combination of the above 2 lists
IERC20[] allTokens; // `allStrats`, but contains all of the underlying tokens instead
+ uint maxUniqueAssetsHeld;
// If a token is in this mapping, then we will ignore this LST as it causes issues with reading balanceOf
mapping(address => bool) public tokensNotTested;
// Mock Contracts to deploy
- ETHPOSDepositMock ethPOSDeposit;
+ TimeMachine public timeMachine;
BeaconChainMock public beaconChain;
// Admin Addresses
- address eigenLayerReputedMultisig = address(this); // admin address
address constant pauser = address(555);
address constant unpauser = address(556);
@@ -96,8 +82,26 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
// Set only once in setUp, if FORK_MAINNET env is set
uint forkType;
- // Constants
- uint64 constant MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR = 32e9;
+ /// @dev used to configure randomness and default user/asset types
+ ///
+ /// Tests that want alternate user/asset types can still use this modifier,
+ /// and then configure user/asset types individually using the methods:
+ /// _configAssetTypes(...)
+ /// _configUserTypes(...)
+ ///
+ /// (Alternatively, this modifier can be overwritten)
+ modifier rand(uint24 r) virtual {
+ _configRand({
+ _randomSeed: r,
+ _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
+ _userTypes: DEFAULT | ALT_METHODS
+ });
+
+ // Used to create shared setups between tests
+ _init();
+
+ _;
+ }
constructor() {
address stETH_Holesky = 0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034;
@@ -112,6 +116,10 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
tokensNotTested[osETH_Holesky] = true;
tokensNotTested[osETH_Mainnet] = true;
tokensNotTested[cbETH_Holesky] = true;
+
+ // Use current contracts by default. Upgrade tests are only run with mainnet fork tests
+ // using the `UpgradeTest.t.sol` mixin.
+ isUpgraded = true;
}
function NAME() public view virtual override returns (string memory) {
@@ -126,33 +134,37 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
* Note that forkIds are also created so you can make explicit fork tests using cheats.selectFork(forkId)
*/
function setUp() public virtual {
- isUpgraded = false;
-
- /**
- * env FOUNDRY_PROFILE=forktest forge t --mc Integration
- *
- * Running foundry like this will trigger the fork test profile,
- * lowering fuzz runs and using a remote RPC to test against mainnet state
- */
- bool forkMainnet = _hash("forktest") == _hash(cheats.envOr(string("FOUNDRY_PROFILE"), string("default")));
+ bool forkMainnet = isForktest();
if (forkMainnet) {
- console.log("Setting up `%s` integration tests:", "MAINNET_FORK".green().bold());
- console.log("RPC:", cheats.rpcUrl("mainnet"));
- console.log("Block:", mainnetForkBlock);
-
- cheats.createSelectFork(cheats.rpcUrl("mainnet"), mainnetForkBlock);
forkType = MAINNET;
+ _setUpMainnet();
} else {
- console.log("Setting up `%s` integration tests:", "LOCAL".yellow().bold());
-
forkType = LOCAL;
+ _setUpLocal();
}
+ }
- _deployOrFetchContracts();
+ /// @dev Used to create shared setup between tests. This method is called
+ /// when the `rand` modifier is run, before a test starts
+ function _init() internal virtual {
+ return;
}
- function _setUpLocal() public virtual {
+ /**
+ * env FOUNDRY_PROFILE=forktest forge t --mc Integration
+ *
+ * Running foundry like this will trigger the fork test profile,
+ * lowering fuzz runs and using a remote RPC to test against mainnet state
+ */
+ function isForktest() public view returns (bool) {
+ return _hash("forktest") == _hash(cheats.envOr(string("FOUNDRY_PROFILE"), string("default")));
+ }
+
+ /// Deploy EigenLayer locally
+ function _setUpLocal() public noTracing virtual {
+ console.log("Setting up `%s` integration tests:", "LOCAL".yellow().bold());
+
// Deploy ProxyAdmin
eigenLayerProxyAdmin = new ProxyAdmin();
executorMultisig = address(eigenLayerProxyAdmin.owner());
@@ -163,138 +175,25 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
eigenLayerPauserReg = new PauserRegistry(pausers, unpauser);
// Deploy mocks
- EmptyContract emptyContract = new EmptyContract();
- ethPOSDeposit = new ETHPOSDepositMock();
+ emptyContract = new EmptyContract();
// Matching parameters to testnet
DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS = 50;
DEALLOCATION_DELAY = 50;
ALLOCATION_CONFIGURATION_DELAY = 75;
- /**
- * First, deploy upgradeable proxy contracts that **will point** to the implementations. Since the implementation contracts are
- * not yet deployed, we give these proxies an empty contract as the initial implementation, to act as if they have no code.
- */
- 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), ""))
- );
- 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), ""))
- );
-
- // Deploy EigenPod Contracts
- eigenPodImplementation = new EigenPod(ethPOSDeposit, eigenPodManager, GENESIS_TIME_LOCAL);
-
- eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation));
- // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs
- delegationManagerImplementation = new DelegationManager(strategyManager, eigenPodManager, allocationManager, eigenLayerPauserReg, permissionController, DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS);
- strategyManagerImplementation = new StrategyManager(delegationManager, eigenLayerPauserReg);
- eigenPodManagerImplementation = new EigenPodManager(
- ethPOSDeposit,
- eigenPodBeacon,
- delegationManager,
- eigenLayerPauserReg
- );
- strategyManagerImplementation = new StrategyManager(delegationManager, eigenLayerPauserReg);
- eigenPodManagerImplementation = new EigenPodManager(ethPOSDeposit, eigenPodBeacon, delegationManager, eigenLayerPauserReg);
- avsDirectoryImplementation = new AVSDirectory(delegationManager, eigenLayerPauserReg);
- strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg);
- allocationManagerImplementation = new AllocationManager(delegationManager, eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, ALLOCATION_CONFIGURATION_DELAY);
- permissionControllerImplementation = new PermissionController();
-
- // Third, upgrade the proxy contracts to point to the implementations
- // DelegationManager
- eigenLayerProxyAdmin.upgradeAndCall(
- ITransparentUpgradeableProxy(payable(address(delegationManager))),
- address(delegationManagerImplementation),
- abi.encodeWithSelector(
- DelegationManager.initialize.selector,
- eigenLayerReputedMultisig, // initialOwner
- 0 /* initialPausedStatus */
- )
- );
- // StrategyManager
- eigenLayerProxyAdmin.upgradeAndCall(
- ITransparentUpgradeableProxy(payable(address(strategyManager))),
- address(strategyManagerImplementation),
- abi.encodeWithSelector(
- StrategyManager.initialize.selector,
- eigenLayerReputedMultisig, //initialOwner
- eigenLayerReputedMultisig, //initial whitelister
- 0 // initialPausedStatus
- )
- );
- // EigenPodManager
- eigenLayerProxyAdmin.upgradeAndCall(
- ITransparentUpgradeableProxy(payable(address(eigenPodManager))),
- address(eigenPodManagerImplementation),
- abi.encodeWithSelector(
- EigenPodManager.initialize.selector,
- eigenLayerReputedMultisig, // initialOwner
- 0 // initialPausedStatus
- )
- );
- // AVSDirectory
- eigenLayerProxyAdmin.upgradeAndCall(
- ITransparentUpgradeableProxy(payable(address(avsDirectory))),
- address(avsDirectoryImplementation),
- abi.encodeWithSelector(
- AVSDirectory.initialize.selector,
- eigenLayerReputedMultisig, // initialOwner
- 0 // initialPausedStatus
- )
- );
- // AllocationManager
- eigenLayerProxyAdmin.upgradeAndCall(
- ITransparentUpgradeableProxy(payable(address(allocationManager))),
- address(allocationManagerImplementation),
- abi.encodeWithSelector(
- AllocationManager.initialize.selector,
- eigenLayerReputedMultisig, // initialOwner
- 0 // initialPausedStatus
- )
- );
- //PermissionController
- eigenLayerProxyAdmin.upgrade(
- ITransparentUpgradeableProxy(payable(address(permissionController))),
- address(permissionControllerImplementation)
- );
- // Create base strategy implementation and deploy a few strategies
- baseStrategyImplementation = new StrategyBase(strategyManager, eigenLayerPauserReg);
-
- // Create a proxy beacon for base strategy implementation
- strategyBeacon = new UpgradeableBeacon(address(baseStrategyImplementation));
+ REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS = 86400;
+ REWARDS_COORDINATOR_MAX_REWARDS_DURATION = 6048000;
+ REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH = 7776000;
+ REWARDS_COORDINATOR_MAX_FUTURE_LENGTH = 2592000;
+ REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP = 1710979200;
- // Strategy Factory, upgrade and initialized
- eigenLayerProxyAdmin.upgradeAndCall(
- ITransparentUpgradeableProxy(payable(address(strategyFactory))),
- address(strategyFactoryImplementation),
- abi.encodeWithSelector(
- StrategyFactory.initialize.selector,
- eigenLayerReputedMultisig,
- 0, // initial paused status
- IBeacon(strategyBeacon)
- )
- );
-
- cheats.prank(eigenLayerReputedMultisig);
- strategyManager.setStrategyWhitelister(address(strategyFactory));
+ _deployProxies();
+ _deployImplementations();
+ _upgradeProxies();
+ _initializeProxies();
+ // Deploy and configure strategies and tokens
for (uint i = 1; i < NUM_LST_STRATS + 1; ++i) {
string memory name = string.concat("LST-Strat", cheats.toString(i), " token");
string memory symbol = string.concat("lstStrat", cheats.toString(i));
@@ -305,26 +204,59 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
ethStrats.push(BEACONCHAIN_ETH_STRAT);
allStrats.push(BEACONCHAIN_ETH_STRAT);
allTokens.push(NATIVE_ETH);
+ maxUniqueAssetsHeld = allStrats.length;
// Create time machine and beacon chain. Set block time to beacon chain genesis time
- // TODO: update if needed to sane timestamp
- cheats.warp(GENESIS_TIME_LOCAL);
+ BEACON_GENESIS_TIME = GENESIS_TIME_LOCAL;
+ cheats.warp(BEACON_GENESIS_TIME);
timeMachine = new TimeMachine();
- beaconChain = new BeaconChainMock(eigenPodManager, GENESIS_TIME_LOCAL);
+ beaconChain = new BeaconChainMock(eigenPodManager, BEACON_GENESIS_TIME);
+ }
+
+ /// Parse existing contracts from mainnet
+ function _setUpMainnet() public noTracing virtual {
+ console.log("Setting up `%s` integration tests:", "MAINNET_FORK".green().bold());
+ console.log("RPC:", cheats.rpcUrl("mainnet"));
+ console.log("Block:", mainnetForkBlock);
+
+ cheats.createSelectFork(cheats.rpcUrl("mainnet"), mainnetForkBlock);
+
+ string memory deploymentInfoPath = "script/configs/mainnet/mainnet-addresses.config.json";
+ _parseDeployedContracts(deploymentInfoPath);
+ string memory existingDeploymentParams = "script/configs/mainnet.json";
+ _parseParamsForIntegrationUpgrade(existingDeploymentParams);
+
+ // Add deployed strategies to lstStrats and allStrats
+ for (uint i; i < deployedStrategyArray.length; i++) {
+ IStrategy strategy = IStrategy(deployedStrategyArray[i]);
+
+ if (tokensNotTested[address(strategy.underlyingToken())]) {
+ continue;
+ }
+
+ // Add to lstStrats and allStrats
+ lstStrats.push(strategy);
+ allStrats.push(strategy);
+ allTokens.push(strategy.underlyingToken());
+ }
+
+ maxUniqueAssetsHeld = allStrats.length;
+
+ // Create time machine and mock beacon chain
+ BEACON_GENESIS_TIME = GENESIS_TIME_MAINNET;
+ timeMachine = new TimeMachine();
+ beaconChain = new BeaconChainMock(eigenPodManager, BEACON_GENESIS_TIME);
+
+ // Since we haven't done the slashing upgrade on mainnet yet, upgrade mainnet contracts
+ // prior to test. `isUpgraded` is true by default, but is set to false in `UpgradeTest.t.sol`
+ if (isUpgraded) {
+ _upgradeMainnetContracts();
+ }
}
- /**
- * @notice deploy current implementation contracts and upgrade the existing proxy EigenLayer contracts
- * on Mainnet. Setup for integration tests on mainnet fork.
- *
- * Note that beacon chain oracle and eth deposit contracts are mocked and pointed to different addresses for these tests.
- */
function _upgradeMainnetContracts() public virtual {
cheats.startPrank(address(executorMultisig));
- ethPOSDeposit = new ETHPOSDepositMock();
- ETHPOSDepositAddress = address(ethPOSDeposit); // overwrite for upgrade checks later
-
// First, deploy the new contracts as empty contracts
emptyContract = new EmptyContract();
allocationManager = AllocationManager(
@@ -334,160 +266,165 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))
);
- // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs
- allocationManagerImplementation = new AllocationManager(delegationManager, eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, ALLOCATION_CONFIGURATION_DELAY);
- permissionControllerImplementation = new PermissionController();
- delegationManagerImplementation = new DelegationManager(strategyManager, eigenPodManager, allocationManager, eigenLayerPauserReg, permissionController, DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS);
- strategyManagerImplementation = new StrategyManager(delegationManager, eigenLayerPauserReg);
- rewardsCoordinatorImplementation = new RewardsCoordinator(
- delegationManager,
- strategyManager,
- allocationManager,
- eigenLayerPauserReg,
- permissionController,
- REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS,
- REWARDS_COORDINATOR_MAX_REWARDS_DURATION,
- REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH,
- REWARDS_COORDINATOR_MAX_FUTURE_LENGTH,
- REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP
- );
- avsDirectoryImplementation = new AVSDirectory(delegationManager, eigenLayerPauserReg);
- eigenPodManagerImplementation = new EigenPodManager(
- ethPOSDeposit,
- eigenPodBeacon,
- delegationManager,
- eigenLayerPauserReg
- );
- eigenPodImplementation = new EigenPod(ethPOSDeposit, eigenPodManager, GENESIS_TIME_MAINNET);
- strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg);
- baseStrategyImplementation = new StrategyBase(strategyManager, eigenLayerPauserReg);
+ emit log_named_uint("EPM pause status", eigenPodManager.paused());
- // Third, upgrade the proxy contracts to point to the implementations
-
- // Initialize the newly deployed contracts
- eigenLayerProxyAdmin.upgradeAndCall(
- ITransparentUpgradeableProxy(payable(address(allocationManager))),
- address(allocationManagerImplementation),
- abi.encodeWithSelector(
- AllocationManager.initialize.selector,
- executorMultisig,
- 0 // initialPausedStatus
- )
- );
- eigenLayerProxyAdmin.upgrade(
- ITransparentUpgradeableProxy(payable(address(permissionController))),
- address(permissionControllerImplementation)
- );
-
- // DelegationManager
- eigenLayerProxyAdmin.upgrade(
- ITransparentUpgradeableProxy(payable(address(delegationManager))), address(delegationManagerImplementation)
- );
- // StrategyManager
- eigenLayerProxyAdmin.upgrade(
- ITransparentUpgradeableProxy(payable(address(strategyManager))), address(strategyManagerImplementation)
- );
- // RewardsCoordinator
- eigenLayerProxyAdmin.upgrade(
- ITransparentUpgradeableProxy(payable(address(rewardsCoordinator))), address(rewardsCoordinatorImplementation)
- );
- // AVSDirectory
- eigenLayerProxyAdmin.upgrade(
- ITransparentUpgradeableProxy(payable(address(avsDirectory))), address(avsDirectoryImplementation)
- );
- // EigenPodManager
- eigenLayerProxyAdmin.upgrade(
- ITransparentUpgradeableProxy(payable(address(eigenPodManager))), address(eigenPodManagerImplementation)
- );
- // EigenPod
- eigenPodBeacon.upgradeTo(address(eigenPodImplementation));
- // StrategyFactory
- eigenLayerProxyAdmin.upgrade(
- ITransparentUpgradeableProxy(payable(address(strategyFactory))), address(strategyFactoryImplementation)
- );
- // Strategy Beacon
- strategyBeacon.upgradeTo(address(baseStrategyImplementation));
+ // Deploy new implementation contracts and upgrade all proxies to point to them
+ _deployImplementations();
+ _upgradeProxies();
- // Upgrade All deployed strategy contracts to new base strategy
- for (uint i = 0; i < numStrategiesDeployed; i++) {
- // Upgrade existing strategy
- eigenLayerProxyAdmin.upgrade(
- ITransparentUpgradeableProxy(payable(address(deployedStrategyArray[i]))),
- address(baseStrategyImplementation)
- );
- }
+ emit log_named_uint("EPM pause status", eigenPodManager.paused());
- // Third, unpause core contracts
- delegationManager.unpause(0);
- eigenPodManager.unpause(0);
- strategyManager.unpause(0);
+ // Initialize the newly-deployed proxy
+ allocationManager.initialize({
+ initialOwner: executorMultisig,
+ initialPausedStatus: 0
+ });
cheats.stopPrank();
ethStrats.push(BEACONCHAIN_ETH_STRAT);
allStrats.push(BEACONCHAIN_ETH_STRAT);
allTokens.push(NATIVE_ETH);
+ maxUniqueAssetsHeld = allStrats.length;
}
- /**
- * @notice deploy current implementation contracts and upgrade the existing proxy EigenLayer contracts
- * on Holesky. Setup for integration tests on Holesky fork.
- *
- * Note that beacon chain oracle and eth deposit contracts are mocked and pointed to different addresses for these tests.
- */
- function _upgradeHoleskyContracts() public virtual {
- cheats.startPrank(address(executorMultisig));
-
- ethPOSDeposit = new ETHPOSDepositMock();
- ETHPOSDepositAddress = address(ethPOSDeposit); // overwrite for upgrade checks later
-
- // Deploy EigenPod Contracts
- eigenPodImplementation = new EigenPod(ethPOSDeposit, eigenPodManager, 0);
- eigenPodBeacon.upgradeTo(address(eigenPodImplementation));
- // Deploy AVSDirectory, contract has not been deployed on mainnet yet
+ 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), ""))
+ );
+ eigenPodBeacon = new UpgradeableBeacon(address(emptyContract));
+ strategyBeacon = new UpgradeableBeacon(address(emptyContract));
+ }
- // First, deploy the *implementation* contracts, using the *proxy contracts* as inputs
- delegationManagerImplementation = new DelegationManager(strategyManager, eigenPodManager, allocationManager, eigenLayerPauserReg, permissionController, DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS);
- strategyManagerImplementation = new StrategyManager(delegationManager, eigenLayerPauserReg);
+ /// 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
+ );
+ permissionControllerImplementation = new PermissionController(version);
+ delegationManagerImplementation = new DelegationManager(
+ strategyManager,
+ eigenPodManager,
+ allocationManager,
+ eigenLayerPauserReg,
+ permissionController,
+ DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS,
+ version
+ );
+ strategyManagerImplementation = new StrategyManager(delegationManager, eigenLayerPauserReg, version);
+ rewardsCoordinatorImplementation = new RewardsCoordinator(
+ IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams({
+ delegationManager: delegationManager,
+ strategyManager: strategyManager,
+ allocationManager: allocationManager,
+ pauserRegistry: eigenLayerPauserReg,
+ permissionController: permissionController,
+ CALCULATION_INTERVAL_SECONDS: REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS,
+ MAX_REWARDS_DURATION: REWARDS_COORDINATOR_MAX_REWARDS_DURATION,
+ MAX_RETROACTIVE_LENGTH: REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH,
+ MAX_FUTURE_LENGTH: REWARDS_COORDINATOR_MAX_FUTURE_LENGTH,
+ GENESIS_REWARDS_TIMESTAMP: REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP,
+ version: version
+ })
+ );
+ avsDirectoryImplementation = new AVSDirectory(delegationManager, eigenLayerPauserReg, version);
eigenPodManagerImplementation = new EigenPodManager(
- ethPOSDeposit,
+ DEPOSIT_CONTRACT,
eigenPodBeacon,
delegationManager,
- eigenLayerPauserReg
+ eigenLayerPauserReg,
+ "v9.9.9"
);
- strategyManagerImplementation = new StrategyManager(delegationManager, eigenLayerPauserReg);
- eigenPodManagerImplementation = new EigenPodManager(ethPOSDeposit, eigenPodBeacon, delegationManager, eigenLayerPauserReg);
- avsDirectoryImplementation = new AVSDirectory(delegationManager, eigenLayerPauserReg);
+ strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg, "v9.9.9");
+
+ // Beacon implementations
+ eigenPodImplementation = new EigenPod(DEPOSIT_CONTRACT, eigenPodManager, BEACON_GENESIS_TIME, "v9.9.9");
+ baseStrategyImplementation = new StrategyBase(strategyManager, eigenLayerPauserReg, "v9.9.9");
- // Second, upgrade the proxy contracts to point to the implementations
+ // Pre-longtail StrategyBaseTVLLimits implementation
+ // TODO - need to update ExistingDeploymentParser
+ }
+
+ function _upgradeProxies() public noTracing {
// DelegationManager
eigenLayerProxyAdmin.upgrade(
- ITransparentUpgradeableProxy(payable(address(delegationManager))), address(delegationManagerImplementation)
+ ITransparentUpgradeableProxy(payable(address(delegationManager))),
+ address(delegationManagerImplementation)
);
+
// StrategyManager
eigenLayerProxyAdmin.upgrade(
- ITransparentUpgradeableProxy(payable(address(strategyManager))), address(strategyManagerImplementation)
+ ITransparentUpgradeableProxy(payable(address(strategyManager))),
+ address(strategyManagerImplementation)
);
+
// EigenPodManager
eigenLayerProxyAdmin.upgrade(
- ITransparentUpgradeableProxy(payable(address(eigenPodManager))), address(eigenPodManagerImplementation)
+ ITransparentUpgradeableProxy(payable(address(eigenPodManager))),
+ address(eigenPodManagerImplementation)
+ );
+
+ // RewardsCoordinator
+ eigenLayerProxyAdmin.upgrade(
+ ITransparentUpgradeableProxy(payable(address(rewardsCoordinator))),
+ address(rewardsCoordinatorImplementation)
);
- // AVSDirectory, upgrade and initialized
- eigenLayerProxyAdmin.upgradeAndCall(
+
+ // AVSDirectory
+ eigenLayerProxyAdmin.upgrade(
ITransparentUpgradeableProxy(payable(address(avsDirectory))),
- address(avsDirectoryImplementation),
- abi.encodeWithSelector(
- AVSDirectory.initialize.selector,
- executorMultisig,
- 0 // initialPausedStatus
- )
+ address(avsDirectoryImplementation)
+ );
+
+ // AllocationManager
+ eigenLayerProxyAdmin.upgrade(
+ ITransparentUpgradeableProxy(payable(address(allocationManager))),
+ address(allocationManagerImplementation)
+ );
+
+ // PermissionController
+ eigenLayerProxyAdmin.upgrade(
+ ITransparentUpgradeableProxy(payable(address(permissionController))),
+ address(permissionControllerImplementation)
);
- // Create base strategy implementation and deploy a few strategies
- baseStrategyImplementation = new StrategyBase(strategyManager, eigenLayerPauserReg);
+ // StrategyFactory
+ eigenLayerProxyAdmin.upgrade(
+ ITransparentUpgradeableProxy(payable(address(strategyFactory))),
+ address(strategyFactoryImplementation)
+ );
+
+ // EigenPod beacon
+ eigenPodBeacon.upgradeTo(address(eigenPodImplementation));
+
+ // StrategyBase Beacon
+ strategyBeacon.upgradeTo(address(baseStrategyImplementation));
// Upgrade All deployed strategy contracts to new base strategy
for (uint i = 0; i < numStrategiesDeployed; i++) {
@@ -497,17 +434,40 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
address(baseStrategyImplementation)
);
}
+ }
- // Third, unpause core contracts
- delegationManager.unpause(0);
- eigenPodManager.unpause(0);
- strategyManager.unpause(0);
-
- cheats.stopPrank();
-
- ethStrats.push(BEACONCHAIN_ETH_STRAT);
- allStrats.push(BEACONCHAIN_ETH_STRAT);
- allTokens.push(NATIVE_ETH);
+ function _initializeProxies() public noTracing {
+ delegationManager.initialize({
+ initialOwner: executorMultisig,
+ initialPausedStatus: 0
+ });
+
+ strategyManager.initialize({
+ initialOwner: executorMultisig,
+ initialStrategyWhitelister: address(strategyFactory),
+ initialPausedStatus: 0
+ });
+
+ eigenPodManager.initialize({
+ initialOwner: executorMultisig,
+ _initPausedStatus: 0
+ });
+
+ avsDirectory.initialize({
+ initialOwner: executorMultisig,
+ initialPausedStatus: 0
+ });
+
+ allocationManager.initialize({
+ initialOwner: executorMultisig,
+ initialPausedStatus: 0
+ });
+
+ strategyFactory.initialize({
+ _initialOwner: executorMultisig,
+ _initialPausedStatus: 0,
+ _strategyBeacon: strategyBeacon
+ });
}
/// @dev Deploy a strategy and its underlying token, push to global lists of tokens/strategies, and whitelist
@@ -518,7 +478,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
uint initialSupply,
address owner,
bool useFactory
- ) internal {
+ ) internal noTracing {
IERC20 underlyingToken = new ERC20PresetFixedSupply(tokenName, tokenSymbol, initialSupply, owner);
StrategyBase strategy;
@@ -541,15 +501,8 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
IStrategy[] memory strategies = new IStrategy[](1);
strategies[0] = strategy;
- if (forkType == MAINNET) {
- cheats.prank(strategyManager.strategyWhitelister());
- IStrategyManager_DeprecatedM1(address(strategyManager)).addStrategiesToDepositWhitelist(strategies);
- cheats.prank(eigenLayerPauserReg.unpauser());
- StrategyBaseTVLLimits(address(strategy)).setTVLLimits(type(uint).max, type(uint).max);
- } else {
- cheats.prank(strategyManager.strategyWhitelister());
- strategyManager.addStrategiesToDepositWhitelist(strategies);
- }
+ cheats.prank(strategyManager.strategyWhitelister());
+ strategyManager.addStrategiesToDepositWhitelist(strategies);
// Add to lstStrats and allStrats
lstStrats.push(strategy);
@@ -557,100 +510,33 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
allTokens.push(underlyingToken);
}
- function _configRand(uint24 _randomSeed, uint _assetTypes, uint _userTypes) internal {
+ function _configRand(uint24 _randomSeed, uint _assetTypes, uint _userTypes) private noTracing {
// Using uint24 for the seed type so that if a test fails, it's easier
// to manually use the seed to replay the same test.
random = _hash(_randomSeed);
// Convert flag bitmaps to bytes of set bits for easy use with _randUint
- assetTypes = _bitmapToBytes(_assetTypes);
- userTypes = _bitmapToBytes(_userTypes);
+ _configAssetTypes(_assetTypes);
+ _configUserTypes(_userTypes);
+ }
+ function _configAssetTypes(uint _assetTypes) internal {
+ assetTypes = _bitmapToBytes(_assetTypes);
assertTrue(assetTypes.length != 0, "_configRand: no asset types selected");
- assertTrue(userTypes.length != 0, "_configRand: no user types selected");
}
- /**
- * Depending on the forkType, either deploy contracts locally or parse existing contracts
- * from network.
- *
- * Note: for non-LOCAL forktypes, upgrade of contracts will be performed after user initialization.
- */
- function _deployOrFetchContracts() internal {
- if (forkType == LOCAL) {
- _setUpLocal();
- // Set Upgraded as local setup deploys most up to date contracts
- isUpgraded = true;
- } else if (forkType == MAINNET) {
- // cheats.selectFork(mainnetForkId);
- string memory deploymentInfoPath = "script/configs/mainnet/mainnet-addresses.config.json";
- _parseDeployedContracts(deploymentInfoPath);
- string memory existingDeploymentParams = "script/configs/mainnet.json";
- _parseParamsForIntegrationUpgrade(existingDeploymentParams);
-
- // Unpause to enable deposits and withdrawals for initializing random user state
- cheats.prank(eigenLayerPauserReg.unpauser());
- strategyManager.unpause(0);
-
- // Add deployed strategies to lstStrats and allStrats
- for (uint i; i < deployedStrategyArray.length; i++) {
- IStrategy strategy = IStrategy(deployedStrategyArray[i]);
-
- if (tokensNotTested[address(strategy.underlyingToken())]) {
- continue;
- }
-
- // Add to lstStrats and allStrats
- lstStrats.push(strategy);
- allStrats.push(strategy);
- allTokens.push(strategy.underlyingToken());
- }
-
- // Create time machine and mock beacon chain
- timeMachine = new TimeMachine();
- beaconChain = new BeaconChainMock(eigenPodManager, GENESIS_TIME_MAINNET);
- } else if (forkType == HOLESKY) {
- revert("_deployOrFetchContracts - holesky tests currently broken sorry");
- // // cheats.selectFork(holeskyForkId);
- // string memory deploymentInfoPath = "script/configs/holesky/Holesky_current_deployment.config.json";
- // _parseDeployedContracts(deploymentInfoPath);
-
- // // Add deployed strategies to lstStrats and allStrats
- // for (uint i; i < deployedStrategyArray.length; i++) {
- // IStrategy strategy = IStrategy(deployedStrategyArray[i]);
-
- // if (tokensNotTested[address(strategy.underlyingToken())]) {
- // continue;
- // }
-
- // // Add to lstStrats and allStrats
- // lstStrats.push(strategy);
- // allStrats.push(strategy);
- // allTokens.push(strategy.underlyingToken());
- // }
-
- // // Update deposit contract to be a mock
- // ethPOSDeposit = new ETHPOSDepositMock();
- // eigenPodImplementation = new EigenPod(
- // ethPOSDeposit,
- // eigenPodImplementation.delayedWithdrawalRouter(),
- // eigenPodImplementation.eigenPodManager(),
- // eigenPodImplementation.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR(),
- // 0
- // );
- // // Create time machine and set block timestamp forward so we can create EigenPod proofs in the past
- // timeMachine = new TimeMachine();
- // beaconChainOracle = new BeaconChainOracleMock();
- // // Create mock beacon chain / proof gen interface
- // beaconChain = new BeaconChainMock(timeMachine, beaconChainOracle, eigenPodManager);
-
- // cheats.startPrank(executorMultisig);
- // eigenPodBeacon.upgradeTo(address(eigenPodImplementation));
- // eigenPodManager.updateBeaconChainOracle(beaconChainOracle);
- // cheats.stopPrank();
- } else {
- revert("_deployOrFetchContracts: unimplemented forkType");
+ function _configAssetAmounts(uint _maxUniqueAssetsHeld) internal {
+ if (_maxUniqueAssetsHeld > allStrats.length) {
+ _maxUniqueAssetsHeld = allStrats.length;
}
+
+ maxUniqueAssetsHeld = _maxUniqueAssetsHeld;
+ require(maxUniqueAssetsHeld != 0, "_configAssetAmounts: invalid 0");
+ }
+
+ function _configUserTypes(uint _userTypes) internal {
+ userTypes = _bitmapToBytes(_userTypes);
+ assertTrue(userTypes.length != 0, "_configRand: no user types selected");
}
/**
@@ -660,7 +546,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
*/
function _randUser(
string memory name
- ) internal returns (User, IStrategy[] memory, uint[] memory) {
+ ) internal noTracing returns (User, IStrategy[] memory, uint[] memory) {
// For the new user, select what type of assets they'll have and whether
// they'll use `xWithSignature` methods.
//
@@ -682,7 +568,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
/// @dev Create a new user without native ETH. See _randUser above for standard usage
function _randUser_NoETH(
string memory name
- ) internal returns (User, IStrategy[] memory, uint[] memory) {
+ ) internal noTracing returns (User, IStrategy[] memory, uint[] memory) {
// For the new user, select what type of assets they'll have and whether
// they'll use `xWithSignature` methods.
//
@@ -709,9 +595,26 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
return (user, strategies, tokenBalances);
}
+ /// @dev Creates a new user without any assets
+ function _randUser_NoAssets(
+ string memory name
+ ) internal noTracing returns (User) {
+ // For the new user, select what type of assets they'll have and whether
+ // they'll use `xWithSignature` methods.
+ //
+ // The values selected here are in the ranges configured via `_configRand`
+ uint userType = _randUserType();
+
+ // Deploy new User contract
+ User user = _genRandUser(name, userType);
+
+ print.user(name, NO_ASSETS, userType, new IStrategy[](0), new uint[](0));
+ return user;
+ }
+
function _genRandUser(string memory name, uint userType) internal returns (User user) {
// Create User contract based on userType:
- if (forkType == LOCAL) {
+ if (forkType == LOCAL || (forkType == MAINNET && isUpgraded)) {
user = new User(name);
if (userType == DEFAULT) {
@@ -722,7 +625,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
} else {
revert("_randUser: unimplemented userType");
}
- } else if (forkType == MAINNET) {
+ } else if (forkType == MAINNET && !isUpgraded) {
if (userType == DEFAULT) {
user = User(new User_M2(name));
} else if (userType == ALT_METHODS) {
@@ -731,20 +634,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
} else {
revert("_randUser: unimplemented userType");
}
- } else if (forkType == HOLESKY) {
- // User deployment for Holesky is exact same as holesky.
- // Current Holesky deployment is up to date and no deprecated interfaces have been added.
-
- user = new User(name);
-
- if (userType == DEFAULT) {
- user = new User(name);
- } else if (userType == ALT_METHODS) {
- // User will use nonstandard methods like `depositIntoStrategyWithSignature`
- user = User(new User_AltMethods(name));
- } else {
- revert("_randUser: unimplemented userType");
- }
} else {
revert("_randUser: unimplemented forkType");
}
@@ -757,8 +646,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
avs = new AVS(name);
} else if (forkType == MAINNET) {
avs = new AVS(name);
- } else if (forkType == HOLESKY) {
- avs = new AVS(name);
} else {
revert("_genRandAVS: unimplemented forkType");
}
@@ -772,7 +659,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
/// `tokenBalances` will contain the user's eth balance
/// HOLDS_ALL - `strategies` will contain ALL initialized strategies AND BEACONCHAIN_ETH_STRAT, and
/// `tokenBalances` will contain random token/eth balances accordingly
- function _dealRandAssets(User user, uint assetType) internal returns (IStrategy[] memory, uint[] memory) {
+ function _dealRandAssets(User user, uint assetType) internal noTracing returns (IStrategy[] memory, uint[] memory) {
IStrategy[] memory strategies;
uint[] memory tokenBalances;
if (assetType == NO_ASSETS) {
@@ -781,7 +668,12 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
} else if (assetType == HOLDS_LST) {
assetType = HOLDS_LST;
// Select a random number of assets
- uint numAssets = _randUint({min: 1, max: lstStrats.length});
+ uint max = lstStrats.length;
+ if (max > maxUniqueAssetsHeld) {
+ max = maxUniqueAssetsHeld;
+ }
+ uint numAssets = _randUint({min: 1, max: max});
+
strategies = new IStrategy[](numAssets);
tokenBalances = new uint[](numAssets);
@@ -807,7 +699,8 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
strategies[0] = BEACONCHAIN_ETH_STRAT;
tokenBalances[0] = amount;
} else if (assetType == HOLDS_ALL || assetType == HOLDS_MAX) {
- uint numLSTs = assetType == HOLDS_MAX ? lstStrats.length : 5;
+ uint randHeld = _randUint({min: 1, max: maxUniqueAssetsHeld-1});
+ uint numLSTs = assetType == HOLDS_MAX ? lstStrats.length : randHeld;
strategies = new IStrategy[](numLSTs + 1);
tokenBalances = new uint[](numLSTs + 1);
@@ -837,30 +730,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
return (strategies, tokenBalances);
}
- /// @dev By default will have a assetType of HOLDS_LST
- function _dealRandAssets_M1(
- User user
- ) internal returns (IStrategy[] memory, uint[] memory) {
- // Select a random number of assets
- uint numAssets = _randUint({min: 1, max: lstStrats.length});
-
- IStrategy[] memory strategies = new IStrategy[](numAssets);
- uint[] memory tokenBalances = new uint[](numAssets);
-
- // For each asset, award the user a random balance of the underlying token
- for (uint i = 0; i < numAssets; i++) {
- IStrategy strat = lstStrats[i];
- IERC20 underlyingToken = strat.underlyingToken();
- uint balance = _randUint({min: MIN_BALANCE, max: MAX_BALANCE});
-
- StdCheats.deal(address(underlyingToken), address(user), balance);
- tokenBalances[i] = balance;
- strategies[i] = strat;
- }
-
- return (strategies, tokenBalances);
- }
-
/// @dev Uses `random` to return a random uint, with a range given by `min` and `max` (inclusive)
/// @return `min` <= result <= `max`
function _randUint(uint min, uint max) internal returns (uint) {
@@ -928,8 +797,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
for (uint i; i < numOpSets; ++i) {
IStrategy[] memory randomStrategies = _shuffle(allStrats);
-
- uint numStrategies = _randUint({ min: 1, max: allStrats.length });
+ uint numStrategies = _randUint({ min: 1, max: maxUniqueAssetsHeld });
// Modify the length of the array in memory (thus ignoring remaining elements).
assembly {
diff --git a/src/test/integration/TimeMachine.t.sol b/src/test/integration/TimeMachine.t.sol
index 506147bfb2..798abcd999 100644
--- a/src/test/integration/TimeMachine.t.sol
+++ b/src/test/integration/TimeMachine.t.sol
@@ -25,7 +25,7 @@ contract TimeMachine is Test, Logger {
// to warp so we don't accidentally prevent our own births.
assertTrue(pastExists(), "Global.warpToPast: invalid usage, past does not exist");
uint256 last = lastSnapshot();
- print.method("travelToLast", cheats.toString(last));
+ // print.method("travelToLast", cheats.toString(last));
currentSnapshot = createSnapshot();
cheats.revertToState(last);
}
@@ -33,7 +33,7 @@ contract TimeMachine is Test, Logger {
function travel(
uint256 snapshot
) public {
- print.method("travel", cheats.toString(snapshot));
+ // print.method("travel", cheats.toString(snapshot));
cheats.revertToState(snapshot);
}
diff --git a/src/test/integration/TypeImporter.t.sol b/src/test/integration/TypeImporter.t.sol
new file mode 100644
index 0000000000..0364da6f24
--- /dev/null
+++ b/src/test/integration/TypeImporter.t.sol
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "src/contracts/interfaces/IAllocationManager.sol";
+import "src/contracts/interfaces/IAVSDirectory.sol";
+import "src/contracts/interfaces/IDelegationManager.sol";
+import "src/contracts/interfaces/IEigenPod.sol";
+import "src/contracts/interfaces/IEigenPodManager.sol";
+import "src/contracts/interfaces/IStrategyManager.sol";
+
+
+/// @dev A master interface contract that imports types defined in our
+/// contract interfaces so they can be used without needing to refer to
+/// the interface, e.g:
+///
+/// `AllocateParams memory params;`
+/// vs
+/// `IAllocationManagerTypes.AllocateParams memory params;`
+interface TypeImporter is
+ IAllocationManagerTypes,
+ IAVSDirectoryTypes,
+ IDelegationManagerTypes,
+ IEigenPodManagerTypes,
+ IEigenPodTypes
+{
+}
\ No newline at end of file
diff --git a/src/test/integration/UpgradeTest.t.sol b/src/test/integration/UpgradeTest.t.sol
new file mode 100644
index 0000000000..eed86ead6c
--- /dev/null
+++ b/src/test/integration/UpgradeTest.t.sol
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "src/test/integration/IntegrationDeployer.t.sol";
+import "src/test/integration/IntegrationChecks.t.sol";
+
+abstract contract UpgradeTest is IntegrationCheckUtils {
+
+ /// Only run upgrade tests on mainnet forks
+ function setUp() public virtual override {
+ if (!isForktest()) {
+ cheats.skip(true);
+ } else {
+ isUpgraded = false;
+ super.setUp();
+ }
+ }
+
+ /// Deploy current implementation contracts and upgrade existing proxies
+ function _upgradeEigenLayerContracts() public virtual {
+ require(forkType == MAINNET, "_upgradeEigenLayerContracts: somehow running upgrade test locally");
+ require(!isUpgraded, "_upgradeEigenLayerContracts: already performed upgrade");
+
+ emit log("_upgradeEigenLayerContracts: upgrading mainnet to slashing");
+
+ _upgradeMainnetContracts();
+
+ // Bump block.timestamp forward to allow verifyWC proofs for migrated pods
+ emit log("advancing block time to start of next epoch:");
+
+ beaconChain.advanceEpoch_NoRewards();
+
+ emit log("======");
+
+ isUpgraded = true;
+ emit log("_upgradeEigenLayerContracts: slashing upgrade complete");
+ }
+}
\ No newline at end of file
diff --git a/src/test/integration/deprecatedInterfaces/mainnet/IDelegationManager.sol b/src/test/integration/deprecatedInterfaces/mainnet/IDelegationManager.sol
index 5f041668c5..3fafbeaf4e 100644
--- a/src/test/integration/deprecatedInterfaces/mainnet/IDelegationManager.sol
+++ b/src/test/integration/deprecatedInterfaces/mainnet/IDelegationManager.sol
@@ -3,7 +3,7 @@ pragma solidity ^0.8.27;
import "src/contracts/interfaces/IStrategy.sol";
import "src/contracts/interfaces/IPausable.sol";
-import "src/contracts/interfaces/ISignatureUtils.sol";
+import "src/contracts/interfaces/ISignatureUtilsMixin.sol";
/**
* @notice M2 DEPRECATED INTERFACE at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/426f461c59b4f0e16f8becdffd747075edcaded8
@@ -11,7 +11,7 @@ import "src/contracts/interfaces/ISignatureUtils.sol";
* @author Layr Labs, Inc.
* @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
*/
-interface IDelegationManager_DeprecatedM2 is IPausable, ISignatureUtils {
+interface IDelegationManager_DeprecatedM2 is IPausable, ISignatureUtilsMixin {
// @notice Struct used for storing information about a single operator who has registered with EigenLayer
struct OperatorDetails {
/// @notice DEPRECATED -- this field is no longer used, payments are handled in PaymentCoordinator.sol
diff --git a/src/test/integration/mocks/BeaconChainMock.t.sol b/src/test/integration/mocks/BeaconChainMock.t.sol
index 414d18b666..4f93f54739 100644
--- a/src/test/integration/mocks/BeaconChainMock.t.sol
+++ b/src/test/integration/mocks/BeaconChainMock.t.sol
@@ -7,6 +7,7 @@ import "src/contracts/libraries/BeaconChainProofs.sol";
import "src/contracts/libraries/Merkle.sol";
import "src/contracts/pods/EigenPodManager.sol";
+import "src/test/mocks/ETHDepositMock.sol";
import "src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol";
import "src/test/utils/Logger.t.sol";
@@ -79,6 +80,7 @@ contract BeaconChainMock is Logger {
uint64 public nextTimestamp;
EigenPodManager eigenPodManager;
+ IETHPOSDeposit constant DEPOSIT_CONTRACT = IETHPOSDeposit(0x00000000219ab540356cBB839Cbe05303d7705Fa);
EIP_4788_Oracle_Mock constant EIP_4788_ORACLE = EIP_4788_Oracle_Mock(0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02);
/**
@@ -126,6 +128,7 @@ contract BeaconChainMock is Logger {
eigenPodManager = _eigenPodManager;
// Create mock 4788 oracle
+ cheats.etch(address(DEPOSIT_CONTRACT), type(ETHPOSDepositMock).runtimeCode);
cheats.etch(address(EIP_4788_ORACLE), type(EIP_4788_Oracle_Mock).runtimeCode);
// Calculate nodes of empty merkle tree
@@ -286,6 +289,11 @@ contract BeaconChainMock is Logger {
_advanceEpoch();
}
+ function advanceEpoch_NoWithdrawNoRewards() public {
+ print.method("advanceEpoch_NoWithdrawNoRewards");
+ _advanceEpoch();
+ }
+
/// @dev Iterate over all validators. If the validator is still active,
/// add CONSENSUS_REWARD_AMOUNT_GWEI to its current balance
function _generateRewards() internal {
diff --git a/src/test/integration/tests/ALM_Multi.t.sol b/src/test/integration/tests/ALM_Multi.t.sol
new file mode 100644
index 0000000000..12c47fd137
--- /dev/null
+++ b/src/test/integration/tests/ALM_Multi.t.sol
@@ -0,0 +1,431 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "src/test/integration/IntegrationChecks.t.sol";
+
+contract Integration_ALM_Multi is IntegrationCheckUtils {
+
+ using StdStyle for *;
+
+ enum Action {
+ REGISTER,
+ DEREGISTER,
+ INCR_ALLOC,
+ INCR_ALLOC_FULL,
+ DECR_ALLOC,
+ DECR_ALLOC_FULL
+ }
+
+ enum State {
+ NONE,
+ REGISTERED,
+ ALLOCATED,
+ FULLY_ALLOCATED,
+ REG_ALLOC,
+ REG_FULLY_ALLOC
+ }
+
+ AVS avs;
+ OperatorSet operatorSet;
+
+ IStrategy[] strategies;
+
+ /// iteration idx -> list of operators in each state
+ mapping(uint => mapping(State => User[])) operators;
+
+ /// operator -> list of strategies they have delegated assets in
+ mapping(User => IStrategy[]) allocatedStrats;
+ /// Last modifyAllocations params made by the operator
+ mapping(User => AllocateParams) lastModifyParams;
+
+ uint constant NUM_UNIQUE_ASSETS = 3;
+ uint constant NUM_OPERATORS = 5;
+ uint constant NUM_ITERATIONS = 20;
+
+ function _init() internal virtual override {
+ _configAssetAmounts(NUM_UNIQUE_ASSETS);
+
+ (avs,) = _newRandomAVS();
+ operatorSet = avs.createOperatorSet(allStrats);
+
+ for (uint i = 0; i < NUM_OPERATORS; i++) {
+ (User staker, IStrategy[] memory _strategies, uint[] memory initTokenBalances)
+ = _newRandomStaker();
+
+ User operator = _newRandomOperator_NoAssets();
+
+ // 1. Deposit into strategies
+ staker.depositIntoEigenlayer(_strategies, initTokenBalances);
+ uint[] memory initDepositShares = _calculateExpectedShares(_strategies, initTokenBalances);
+ check_Deposit_State(staker, _strategies, initDepositShares);
+
+ // 2. Delegate to operator
+ staker.delegateTo(operator);
+ check_Delegation_State(staker, operator, _strategies, initDepositShares);
+
+ allocatedStrats[operator] = _strategies;
+ // Add operator to NONE state for the 0th iteration
+ operators[0][State.NONE].push(operator);
+ }
+ }
+
+ /// Reduce fuzz runs because this test is thiccc:
+ ///
+ /// forge-config: default.fuzz.runs = 10
+ /// forge-config: forktest.fuzz.runs = 3
+ function test_Multi(uint24 _r) public rand(_r) {
+ // Do 20 iterations
+ for (uint i = 1; i <= NUM_ITERATIONS; i++) {
+ console.log("%s: %d", "iter".green().italic(), i-1);
+
+ _dispatchNone(i);
+ _dispatchRegistered(i);
+ _dispatchAllocated(i);
+ _dispatchFullyAllocated(i);
+ _dispatchRegAlloc(i);
+ _dispatchRegFullyAlloc(i);
+
+ // Ensure all pending actions are completed for the next iteration
+ _rollForward_DeallocationDelay();
+ }
+ }
+
+ /// @dev NONE operators can:
+ /// [REGISTER, INCR_ALLOC, INCR_ALLOC_FULL]
+ function _dispatchNone(uint iter) internal {
+ // Fetch all NONE operators from previous iteration
+ User[] memory _operators = operators[iter - 1][State.NONE];
+ Action[3] memory actions = [
+ Action.REGISTER,
+ Action.INCR_ALLOC,
+ Action.INCR_ALLOC_FULL
+ ];
+
+ if (_operators.length == 0) {
+ return;
+ }
+
+ console.log("%s: %d operators", "_dispatchNone".green(), _operators.length);
+
+ for (uint i = 0; i < _operators.length; i++) {
+ // Get operator and allocated strategies
+ User operator = _operators[i];
+ IStrategy[] memory _strats = allocatedStrats[operator];
+
+ // Get action
+ uint aI = _randUint(0, actions.length-1);
+ Action action = actions[aI];
+
+ // Process action
+ if (action == Action.REGISTER) {
+ operator.registerForOperatorSet(operatorSet);
+ check_Registration_State_NoAllocation(operator, operatorSet, allStrats);
+
+ operators[iter][State.REGISTERED].push(operator);
+ } else if (action == Action.INCR_ALLOC) {
+ AllocateParams memory params = _genAllocation_HalfAvailable(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_IncrAlloc_State_NotSlashable(operator, params);
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.ALLOCATED].push(operator);
+ } else if (action == Action.INCR_ALLOC_FULL) {
+ AllocateParams memory params = _genAllocation_AllAvailable(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_IncrAlloc_State_NotSlashable(operator, params);
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.FULLY_ALLOCATED].push(operator);
+ }
+ }
+ }
+
+ /// @dev REGISTERED operators can:
+ /// [DEREGISTER, INCR_ALLOC, INCR_ALLOC_FULL]
+ function _dispatchRegistered(uint iter) internal {
+ // Fetch all REGISTERED operators from previous iteration
+ User[] memory _operators = operators[iter - 1][State.REGISTERED];
+ Action[3] memory actions = [
+ Action.DEREGISTER,
+ Action.INCR_ALLOC,
+ Action.INCR_ALLOC_FULL
+ ];
+
+ if (_operators.length == 0) {
+ return;
+ }
+
+ console.log("%s: %d operators", "_dispatchRegistered".green(), _operators.length);
+
+ for (uint i = 0; i < _operators.length; i++) {
+ // Get operator
+ User operator = _operators[i];
+ IStrategy[] memory _strats = allocatedStrats[operator];
+
+ // Get action
+ uint aI = _randUint(0, actions.length-1);
+ Action action = actions[aI];
+
+ // Process action
+ if (action == Action.DEREGISTER) {
+ operator.deregisterFromOperatorSet(operatorSet);
+ check_Deregistration_State_NoAllocation(operator, operatorSet);
+
+ operators[iter][State.NONE].push(operator);
+ } else if (action == Action.INCR_ALLOC) {
+ AllocateParams memory params = _genAllocation_HalfAvailable(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_IncrAlloc_State_Slashable(operator, params);
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.REG_ALLOC].push(operator);
+ } else if (action == Action.INCR_ALLOC_FULL) {
+ AllocateParams memory params = _genAllocation_AllAvailable(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_IncrAlloc_State_Slashable(operator, params);
+ // check_FullyAllocated_State(operator, operatorSet, params.strategies); TODO
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.REG_FULLY_ALLOC].push(operator);
+ }
+ }
+ }
+
+ /// @dev ALLOCATED operators can:
+ /// [REGISTER, INCR_ALLOC, INCR_ALLOC_FULL, DECR_ALLOC, DECR_ALLOC_FULL]
+ function _dispatchAllocated(uint iter) internal {
+ // Fetch all ALLOCATED operators from previous iteration
+ User[] memory _operators = operators[iter - 1][State.ALLOCATED];
+ Action[5] memory actions = [
+ Action.REGISTER,
+ Action.INCR_ALLOC,
+ Action.INCR_ALLOC_FULL,
+ Action.DECR_ALLOC,
+ Action.DECR_ALLOC_FULL
+ ];
+
+ if (_operators.length == 0) {
+ return;
+ }
+
+ console.log("%s: %d operators", "_dispatchAllocated".green(), _operators.length);
+
+ for (uint i = 0; i < _operators.length; i++) {
+ // Get operator
+ User operator = _operators[i];
+ IStrategy[] memory _strats = allocatedStrats[operator];
+
+ // Get action
+ uint aI = _randUint(0, actions.length-1);
+ Action action = actions[aI];
+
+ // Process action
+ if (action == Action.REGISTER) {
+ operator.registerForOperatorSet(operatorSet);
+ check_Registration_State_ActiveAllocation(operator, lastModifyParams[operator]);
+
+ operators[iter][State.REG_ALLOC].push(operator);
+ } else if (action == Action.INCR_ALLOC) {
+ AllocateParams memory params = _genAllocation_HalfAvailable(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_IncrAlloc_State_NotSlashable(operator, params);
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.ALLOCATED].push(operator);
+ } else if (action == Action.INCR_ALLOC_FULL) {
+ AllocateParams memory params = _genAllocation_AllAvailable(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_IncrAlloc_State_NotSlashable(operator, params);
+ // check_FullyAllocated_State(operator); TODO
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.FULLY_ALLOCATED].push(operator);
+ } else if (action == Action.DECR_ALLOC) {
+ AllocateParams memory params = _genDeallocation_HalfRemaining(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_DecrAlloc_State_NotSlashable(operator, params);
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.ALLOCATED].push(operator);
+ } else if (action == Action.DECR_ALLOC_FULL) {
+ AllocateParams memory params = _genDeallocation_Full(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_DecrAlloc_State_NotSlashable(operator, params);
+ // check_FullyDeallocated_State(operator); TODO
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.NONE].push(operator);
+ }
+ }
+ }
+
+ /// @dev FULLY_ALLOCATED operators can:
+ /// [REGISTER, DECR_ALLOC, DECR_ALLOC_FULL]
+ function _dispatchFullyAllocated(uint iter) internal {
+ // Fetch all FULLY_ALLOCATED operators from previous iteration
+ User[] memory _operators = operators[iter - 1][State.FULLY_ALLOCATED];
+ Action[3] memory actions = [
+ Action.REGISTER,
+ Action.DECR_ALLOC,
+ Action.DECR_ALLOC_FULL
+ ];
+
+ if (_operators.length == 0) {
+ return;
+ }
+
+ console.log("%s: %d operators", "_dispatchFullyAllocated".green(), _operators.length);
+
+ for (uint i = 0; i < _operators.length; i++) {
+ // Get operator
+ User operator = _operators[i];
+ IStrategy[] memory _strats = allocatedStrats[operator];
+
+ // Get action
+ uint aI = _randUint(0, actions.length-1);
+ Action action = actions[aI];
+
+ // Process action
+ if (action == Action.REGISTER) {
+ operator.registerForOperatorSet(operatorSet);
+ check_Registration_State_ActiveAllocation(operator, lastModifyParams[operator]);
+
+ operators[iter][State.REG_FULLY_ALLOC].push(operator);
+ } else if (action == Action.DECR_ALLOC) {
+ AllocateParams memory params = _genDeallocation_HalfRemaining(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_DecrAlloc_State_NotSlashable(operator, params);
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.ALLOCATED].push(operator);
+ } else if (action == Action.DECR_ALLOC_FULL) {
+ AllocateParams memory params = _genDeallocation_Full(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_DecrAlloc_State_NotSlashable(operator, params);
+ // check_FullyDeallocated_State(operator); TODO
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.NONE].push(operator);
+ }
+ }
+ }
+
+ /// @dev REG_ALLOC operators can:
+ /// [DEREGISTER, INCR_ALLOC, INCR_ALLOC_FULL, DECR_ALLOC, DECR_ALLOC_FULL]
+ function _dispatchRegAlloc(uint iter) internal {
+ // Fetch all REG_ALLOC operators from previous iteration
+ User[] memory _operators = operators[iter - 1][State.REG_ALLOC];
+ Action[5] memory actions = [
+ Action.DEREGISTER,
+ Action.INCR_ALLOC,
+ Action.INCR_ALLOC_FULL,
+ Action.DECR_ALLOC,
+ Action.DECR_ALLOC_FULL
+ ];
+
+ if (_operators.length == 0) {
+ return;
+ }
+
+ console.log("%s: %d operators", "_dispatchRegAlloc".green(), _operators.length);
+
+ for (uint i = 0; i < _operators.length; i++) {
+ // Get operator
+ User operator = _operators[i];
+ IStrategy[] memory _strats = allocatedStrats[operator];
+
+ // Get action
+ uint aI = _randUint(0, actions.length-1);
+ Action action = actions[aI];
+
+ // Process action
+ if (action == Action.DEREGISTER) {
+ operator.deregisterFromOperatorSet(operatorSet);
+ check_Deregistration_State_ActiveAllocation(operator, operatorSet);
+
+ operators[iter][State.ALLOCATED].push(operator);
+ } else if (action == Action.INCR_ALLOC) {
+ AllocateParams memory params = _genAllocation_HalfAvailable(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_IncrAlloc_State_Slashable(operator, params);
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.REG_ALLOC].push(operator);
+ } else if (action == Action.INCR_ALLOC_FULL) {
+ AllocateParams memory params = _genAllocation_AllAvailable(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_IncrAlloc_State_Slashable(operator, params);
+ // check_FullyAllocated_State(operator); TODO
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.REG_FULLY_ALLOC].push(operator);
+ } else if (action == Action.DECR_ALLOC) {
+ AllocateParams memory params = _genDeallocation_HalfRemaining(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_DecrAlloc_State_Slashable(operator, params);
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.REG_ALLOC].push(operator);
+ } else if (action == Action.DECR_ALLOC_FULL) {
+ AllocateParams memory params = _genDeallocation_Full(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_DecrAlloc_State_Slashable(operator, params);
+ // check_FullyDeallocated_State(operator); TODO
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.REGISTERED].push(operator);
+ }
+ }
+ }
+
+ /// @dev REG_FULLY_ALLOC operators can:
+ /// [DEREGISTER, DECR_ALLOC, DECR_ALLOC_FULL]
+ function _dispatchRegFullyAlloc(uint iter) internal {
+ // Fetch all REG_FULLY_ALLOC operators from previous iteration
+ User[] memory _operators = operators[iter - 1][State.REG_FULLY_ALLOC];
+ Action[3] memory actions = [
+ Action.DEREGISTER,
+ Action.DECR_ALLOC,
+ Action.DECR_ALLOC_FULL
+ ];
+
+ if (_operators.length == 0) {
+ return;
+ }
+
+ console.log("%s: %d operators", "_dispatchRegFullyAlloc".green(), _operators.length);
+
+ for (uint i = 0; i < _operators.length; i++) {
+ // Get operator
+ User operator = _operators[i];
+ IStrategy[] memory _strats = allocatedStrats[operator];
+
+ // Get action
+ uint aI = _randUint(0, actions.length-1);
+ Action action = actions[aI];
+
+ // Process action
+ if (action == Action.DEREGISTER) {
+ operator.deregisterFromOperatorSet(operatorSet);
+ check_Deregistration_State_ActiveAllocation(operator, operatorSet);
+
+ operators[iter][State.FULLY_ALLOCATED].push(operator);
+ } else if (action == Action.DECR_ALLOC) {
+ AllocateParams memory params = _genDeallocation_HalfRemaining(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_DecrAlloc_State_Slashable(operator, params);
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.REG_ALLOC].push(operator);
+ } else if (action == Action.DECR_ALLOC_FULL) {
+ AllocateParams memory params = _genDeallocation_Full(operator, operatorSet, _strats);
+ operator.modifyAllocations(params);
+ check_DecrAlloc_State_Slashable(operator, params);
+ // check_FullyDeallocated_State(operator); TODO
+
+ lastModifyParams[operator] = params;
+ operators[iter][State.REGISTERED].push(operator);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/integration/tests/ALM_RegisterAndModify.t.sol b/src/test/integration/tests/ALM_RegisterAndModify.t.sol
new file mode 100644
index 0000000000..65a4592a2f
--- /dev/null
+++ b/src/test/integration/tests/ALM_RegisterAndModify.t.sol
@@ -0,0 +1,221 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "src/test/integration/IntegrationChecks.t.sol";
+
+contract Integration_ALMBase is IntegrationCheckUtils {
+
+ AVS avs;
+ OperatorSet operatorSet;
+
+ User operator;
+ AllocateParams allocateParams;
+
+ User staker;
+ IStrategy[] strategies;
+ uint[] initTokenBalances;
+ uint[] initDepositShares;
+
+ /// Shared setup:
+ ///
+ /// 1. Generate staker with deposited assets, operator, and AVS
+ /// 2. Deposit asssets and delegate to operator
+ /// 3. AVS creates an operator set containing the strategies held by the staker
+ function _init() internal virtual override {
+ (staker, strategies, initTokenBalances) = _newRandomStaker();
+ operator = _newRandomOperator_NoAssets();
+ (avs,) = _newRandomAVS();
+
+ // 1. Deposit Into Strategies
+ staker.depositIntoEigenlayer(strategies, initTokenBalances);
+ initDepositShares = _calculateExpectedShares(strategies, initTokenBalances);
+ check_Deposit_State(staker, strategies, initDepositShares);
+
+ // 2. Delegate to an operator
+ staker.delegateTo(operator);
+ check_Delegation_State(staker, operator, strategies, initDepositShares);
+
+ // 3. Create an operator set containing the strategies held by the staker
+ operatorSet = avs.createOperatorSet(strategies);
+ }
+}
+
+contract Integration_InitRegistered is Integration_ALMBase {
+
+ /// @dev Integration test variants that start with the operator being registered
+ /// for the operator set
+ function _init() internal virtual override {
+ super._init();
+
+ // Register for operator set before allocating to any strategies
+ operator.registerForOperatorSet(operatorSet);
+ check_Registration_State_NoAllocation(operator, operatorSet, allStrats);
+ }
+
+ function testFuzz_allocate_deallocate_deregister(uint24 _r) public rand(_r) {
+ // 1. Allocate to the operator set
+ allocateParams = _genAllocation_Rand(operator, operatorSet);
+ operator.modifyAllocations(allocateParams);
+ check_IncrAlloc_State_Slashable(operator, allocateParams);
+
+ // 2. Roll to the allocation's effect block
+ _rollForward_AllocationDelay(operator);
+
+ // 3. Deallocate fully from the operator set
+ AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet);
+ operator.modifyAllocations(deallocateParams);
+ check_DecrAlloc_State_Slashable(operator, deallocateParams);
+
+ // 4. Deregister from operator set
+ operator.deregisterFromOperatorSet(operatorSet);
+ check_Deregistration_State_PendingAllocation(operator, operatorSet);
+
+ // 5. Check the operator is fully deallocated after the deallocation delay
+ _rollForward_DeallocationDelay();
+ check_FullyDeallocated_State(operator, allocateParams, deallocateParams);
+ }
+
+ function testFuzz_allocate_deallocate_waitDeallocate_deregister(uint24 _r) public rand(_r) {
+ // 1. Allocate to the operator set
+ allocateParams = _genAllocation_Rand(operator, operatorSet);
+ operator.modifyAllocations(allocateParams);
+ check_IncrAlloc_State_Slashable(operator, allocateParams);
+
+ // 2. Roll to the allocation's effect block
+ _rollForward_AllocationDelay(operator);
+
+ // 3. Deallocate fully from the operator set
+ AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet);
+ operator.modifyAllocations(deallocateParams);
+ check_DecrAlloc_State_Slashable(operator, deallocateParams);
+
+ // 4. Check the operator is fully deallocated after the deallocation delay
+ _rollForward_DeallocationDelay();
+ check_FullyDeallocated_State(operator, allocateParams, deallocateParams);
+
+ // 5. Deregister from operator set
+ operator.deregisterFromOperatorSet(operatorSet);
+ check_Deregistration_State_NoAllocation(operator, operatorSet);
+ }
+
+ function testFuzz_deregister_waitDeregister_allocate_deallocate(uint24 _r) public rand(_r) {
+ // 1. Deregister from operator set
+ operator.deregisterFromOperatorSet(operatorSet);
+ check_Deregistration_State_NoAllocation(operator, operatorSet);
+
+ // 2. Wait for deallocation delay. Operator is no longer slashable
+ _rollForward_DeallocationDelay();
+
+ // 3. Allocate to operator set
+ allocateParams = _genAllocation_Rand(operator, operatorSet);
+ operator.modifyAllocations(allocateParams);
+ check_IncrAlloc_State_NotSlashable(operator, allocateParams);
+
+ // 3. Wait for allocation delay
+ _rollForward_AllocationDelay(operator);
+
+ // 4. Deallocate operator from operator set
+ AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet);
+ operator.modifyAllocations(deallocateParams);
+ check_DecrAlloc_State_NotSlashable(operator, deallocateParams);
+ check_FullyDeallocated_State(operator, allocateParams, deallocateParams);
+ }
+
+ function testFuzz_deregister_allocate_waitAllocate_deallocate(uint24 _r) public rand(_r) {
+ // 1. Deregister from operator set
+ operator.deregisterFromOperatorSet(operatorSet);
+ check_Deregistration_State_NoAllocation(operator, operatorSet);
+
+ // 2. Before deregistration is complete, allocate to operator set
+ // The operator should be slashable after the allocation delay
+ allocateParams = _genAllocation_Rand(operator, operatorSet);
+ operator.modifyAllocations(allocateParams);
+ check_IncrAlloc_State_Slashable(operator, allocateParams);
+
+ // 3. Wait for allocation delay. Operator remains slashable
+ _rollForward_AllocationDelay(operator);
+
+ // 4. Deallocate operator from operator set
+ AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet);
+ operator.modifyAllocations(deallocateParams);
+ check_DecrAlloc_State_Slashable(operator, deallocateParams);
+
+ // 5. Check the operator is fully deallocated after the deallocation delay
+ _rollForward_DeallocationDelay();
+ check_FullyDeallocated_State(operator, allocateParams, deallocateParams);
+ }
+
+ function testFuzz_deregister_allocate_waitDeregister_deallocate(uint24 _r) public rand(_r) {
+ // 1. Deregister from operator set
+ operator.deregisterFromOperatorSet(operatorSet);
+ check_Deregistration_State_NoAllocation(operator, operatorSet);
+
+ // 2. Before deregistration is complete, allocate to operator set
+ // The operator should be slashable after the allocation delay
+ allocateParams = _genAllocation_Rand(operator, operatorSet);
+ operator.modifyAllocations(allocateParams);
+ check_IncrAlloc_State_Slashable(operator, allocateParams);
+
+ // 3. Wait for deallocation delay so operator is no longer slashable
+ _rollForward_DeallocationDelay();
+
+ // 4. Instant-deallocate operator from operator set
+ AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet);
+ operator.modifyAllocations(deallocateParams);
+ check_DecrAlloc_State_NotSlashable(operator, deallocateParams);
+ check_FullyDeallocated_State(operator, allocateParams, deallocateParams);
+ }
+}
+
+contract Integration_InitAllocated is Integration_ALMBase {
+
+ /// @dev Integration test variants that start with the operator being allocated
+ /// for the operator set
+ function _init() internal virtual override {
+ super._init();
+
+ // Allocate fully to operator set
+ allocateParams = _genAllocation_AllAvailable(operator, operatorSet);
+ operator.modifyAllocations(allocateParams);
+ check_IncrAlloc_State_NotSlashable(operator, allocateParams);
+ }
+
+ function testFuzz_register_deallocate_deregister(uint24 _r) public rand(_r) {
+ // 1. Register for the operator set
+ operator.registerForOperatorSet(operatorSet);
+ check_Registration_State_PendingAllocation(operator, allocateParams);
+
+ // 2. Roll to the allocation's effect block
+ _rollForward_AllocationDelay(operator);
+
+ // 3. Deallocate fully from the operator set
+ AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet);
+ operator.modifyAllocations(deallocateParams);
+ check_DecrAlloc_State_Slashable(operator, deallocateParams);
+
+ // 4. Deregister from operator set
+ operator.deregisterFromOperatorSet(operatorSet);
+ check_Deregistration_State_PendingAllocation(operator, operatorSet);
+
+ // 5. Roll forward to the deallocation's effect block and check the operator is fully deallocated
+ _rollForward_DeallocationDelay();
+ check_FullyDeallocated_State(operator, allocateParams, deallocateParams);
+ }
+
+ function testFuzz_waitAllocation_register_deallocate(uint24 _r) public rand(_r) {
+ _rollForward_AllocationDelay(operator);
+
+ // 1. Register for the operator set. The allocation immediately becomes slashable
+ operator.registerForOperatorSet(operatorSet);
+ check_Registration_State_ActiveAllocation(operator, allocateParams);
+
+ // 2. Deallocate fully from the operator set
+ AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet);
+ operator.modifyAllocations(deallocateParams);
+ check_DecrAlloc_State_Slashable(operator, deallocateParams);
+
+ // 3. Roll forward to the deallocation's effect block and check the operator is fully deallocated
+ _rollForward_DeallocationDelay();
+ check_FullyDeallocated_State(operator, allocateParams, deallocateParams);
+ }
+}
\ No newline at end of file
diff --git a/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol b/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol
index 0ef86e4b04..b58269e028 100644
--- a/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol
+++ b/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol
@@ -5,13 +5,8 @@ import "src/test/integration/IntegrationChecks.t.sol";
import "src/test/integration/users/User.t.sol";
contract Integration_Delegate_Deposit_Queue_Complete is IntegrationCheckUtils {
- function testFuzz_delegate_deposit_queue_completeAsShares(uint24 _random) public {
- // Configure the random parameters for the test
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
+
+ function testFuzz_delegate_deposit_queue_completeAsShares(uint24 _random) public rand(_random) {
// Create a staker and an operator with a nonzero balance and corresponding strategies
(User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
(User operator, ,) = _newRandomOperator();
@@ -29,13 +24,10 @@ contract Integration_Delegate_Deposit_Queue_Complete is IntegrationCheckUtils {
assert_Snap_Added_OperatorShares(operator, strategies, shares, "operator should have received shares");
// 3. Queue Withdrawal
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
check_QueuedWithdrawal_State(staker, operator, strategies, shares, withdrawals, withdrawalRoots);
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
-
// 4. Complete Queued Withdrawal
_rollBlocksForCompleteWithdrawals(withdrawals);
for (uint i = 0; i < withdrawals.length; i++) {
@@ -44,14 +36,7 @@ contract Integration_Delegate_Deposit_Queue_Complete is IntegrationCheckUtils {
}
}
- function testFuzz_delegate_deposit_queue_completeAsTokens(uint24 _random) public {
- // Configure the random parameters for the test
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_delegate_deposit_queue_completeAsTokens(uint24 _random) public rand(_random) {
// Create a staker and an operator with a nonzero balance and corresponding strategies
(User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
(User operator, ,) = _newRandomOperator();
@@ -63,23 +48,20 @@ contract Integration_Delegate_Deposit_Queue_Complete is IntegrationCheckUtils {
// 2. Deposit into strategy
staker.depositIntoEigenlayer(strategies, tokenBalances);
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ uint[] memory expectedTokens = _calculateExpectedTokens(strategies, shares);
// Check that the deposit increased operator shares the staker is delegated to
check_Deposit_State(staker, strategies, shares);
assert_Snap_Added_OperatorShares(operator, strategies, shares, "operator should have received shares");
// 3. Queue Withdrawal
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
check_QueuedWithdrawal_State(staker, operator, strategies, shares, withdrawals, withdrawalRoots);
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
-
// 4. Complete Queued Withdrawal
_rollBlocksForCompleteWithdrawals(withdrawals);
for (uint i = 0; i < withdrawals.length; i++) {
- uint[] memory expectedTokens = _calculateExpectedTokens(strategies, shares);
IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[i]);
check_Withdrawal_AsTokens_State(staker, operator, withdrawals[i], strategies, shares, tokens, expectedTokens);
}
diff --git a/src/test/integration/tests/Deposit_Delegate_Allocate.t.sol b/src/test/integration/tests/Deposit_Delegate_Allocate.t.sol
deleted file mode 100644
index 03f9ede012..0000000000
--- a/src/test/integration/tests/Deposit_Delegate_Allocate.t.sol
+++ /dev/null
@@ -1,465 +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";
-
-// TODO: move randomness from tests
-
-contract Integration_Deposit_Delegate_Allocate is IntegrationCheckUtils {
- function testFuzz_deposit_delegate_allocate(
- uint24 _random
- ) public {
- // Configure the random parameters for the test
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
- _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local
-
- (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker();
- (User operator,,) = _newRandomOperator();
- (AVS avs,) = _newRandomAVS();
-
- // 1. Deposit Into Strategies
- staker.depositIntoEigenlayer(strategies, tokenBalances);
-
- // 2. Delegate to an operator
- staker.delegateTo(operator);
-
- // Create an operator set and register an operator.
- OperatorSet memory operatorSet = avs.createOperatorSet(strategies);
- operator.registerForOperatorSet(operatorSet);
-
- // 3. Allocate to operator set.
- IAllocationManagerTypes.AllocateParams memory allocateParams =
- operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length}));
- assert_Snap_Allocations_Modified(
- operator, allocateParams, false, "operator allocations should be updated before delay"
- );
- _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
- assert_Snap_Allocations_Modified(
- operator, allocateParams, true, "operator allocations should be updated after delay"
- );
- }
-
- function testFuzz_deposit_delegate_upgrade_allocate(
- uint24 _random
- ) public {
- // Configure the random parameters for the test
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
- (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker();
- (User operator,,) = _newRandomOperator();
-
- // 1. Deposit Into Strategies
- staker.depositIntoEigenlayer(strategies, tokenBalances);
-
- // 2. Delegate to an operator
- staker.delegateTo(operator);
-
- _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local
- (AVS avs,) = _newRandomAVS();
-
- // 3. Set allocation delay for operator
- operator.setAllocationDelay(1);
- rollForward({blocks: ALLOCATION_CONFIGURATION_DELAY});
-
- // 4. Create an operator set and register an operator.
- OperatorSet memory operatorSet = avs.createOperatorSet(strategies);
- operator.registerForOperatorSet(operatorSet);
-
- // 5. Allocate to operator set.
- IAllocationManagerTypes.AllocateParams memory allocateParams =
- operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length}));
- assert_Snap_Allocations_Modified(
- operator, allocateParams, false, "operator allocations should be updated before delay"
- );
- _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
- assert_Snap_Allocations_Modified(
- operator, allocateParams, true, "operator allocations should be updated after delay"
- );
- }
-
- function testFuzz_deposit_delegate_allocate_slash_undelegate_completeAsTokens(
- uint24 _random
- ) public {
- _configRand({_randomSeed: _random, _assetTypes: HOLDS_ALL, _userTypes: DEFAULT});
- _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local
-
- (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker();
- (User operator,,) = _newRandomOperator();
- (AVS avs,) = _newRandomAVS();
-
- // 1. Deposit Into Strategies
- staker.depositIntoEigenlayer(strategies, tokenBalances);
-
- // 2. Delegate to an operator
- staker.delegateTo(operator);
-
- // Create an operator set and register an operator.
- OperatorSet memory operatorSet = avs.createOperatorSet(strategies);
- operator.registerForOperatorSet(operatorSet);
-
- // 3. Allocate to operator set.
- IAllocationManagerTypes.AllocateParams memory allocateParams =
- operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length}));
- assert_Snap_Allocations_Modified(
- operator, allocateParams, false, "operator allocations should be updated before delay"
- );
- _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
- assert_Snap_Allocations_Modified(
- operator, allocateParams, true, "operator allocations should be updated after delay"
- );
-
- // 4. Slash operator
- IAllocationManagerTypes.SlashingParams memory slashingParams;
- {
- (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) =
- _randStrategiesAndWadsToSlash(operatorSet);
- slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash);
- assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
- assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing");
- assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed");
- }
-
- // 5. Undelegate from an operator
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate();
- bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
-
- // 6. Complete withdrawal
- _rollBlocksForCompleteWithdrawals(withdrawals);
- for (uint256 i = 0; i < withdrawals.length; ++i) {
- uint256[] memory expectedTokens =
- _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares);
- staker.completeWithdrawalAsTokens(withdrawals[i]);
- check_Withdrawal_AsTokens_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams, expectedTokens);
- }
-
- // Check Final State
- assert_HasNoDelegatableShares(staker, "staker should have withdrawn all shares");
- assert_HasUnderlyingTokenBalances_AfterSlash(
- staker,
- allocateParams,
- slashingParams,
- tokenBalances,
- "staker should once again have original token tokenBalances minus slashed"
- );
- assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
- }
-
- function testFuzz_deposit_delegate_allocate_slash_undelegate_completeAsShares(
- uint24 _random
- ) public {
- _configRand({_randomSeed: _random, _assetTypes: HOLDS_ALL, _userTypes: DEFAULT});
- _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local
-
- (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker();
- (User operator,,) = _newRandomOperator();
- (AVS avs,) = _newRandomAVS();
-
-
- // 1. Deposit Into Strategies
- staker.depositIntoEigenlayer(strategies, tokenBalances);
- // TODO - post-deposit and post-delegate checks?
-
- // 2. Delegate to an operator
- staker.delegateTo(operator);
-
- // Create an operator set and register an operator.
- OperatorSet memory operatorSet = avs.createOperatorSet(strategies);
- operator.registerForOperatorSet(operatorSet);
-
- // 3. Allocate to operator set.
- IAllocationManagerTypes.AllocateParams memory allocateParams =
- operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length}));
- assert_Snap_Allocations_Modified(
- operator, allocateParams, false, "operator allocations should be updated before delay"
- );
- _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
- assert_Snap_Allocations_Modified(
- operator, allocateParams, true, "operator allocations should be updated after delay"
- );
-
- // 4. Slash operator
- IAllocationManagerTypes.SlashingParams memory slashingParams;
- {
- (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) =
- _randStrategiesAndWadsToSlash(operatorSet);
- slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash);
- assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
- assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing");
- assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed");
- }
-
- // 5. Undelegate from an operator
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate();
- bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
-
- // 4. Complete withdrawal
- // Fast forward to when we can complete the withdrawal
- _rollBlocksForCompleteWithdrawals(withdrawals);
-
- for (uint256 i = 0; i < withdrawals.length; ++i) {
- staker.completeWithdrawalAsShares(withdrawals[i]);
- check_Withdrawal_AsShares_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams);
- }
-
- // Check final state:
- assert_HasNoUnderlyingTokenBalance(staker, strategies, "staker not have any underlying tokens");
- assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
- }
-
- function testFuzz_deposit_delegate_allocate_queue_slash_completeAsTokens(
- uint24 _random
- ) public {
- _configRand({_randomSeed: _random, _assetTypes: HOLDS_ALL, _userTypes: DEFAULT});
- _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local
-
- (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker();
- (User operator,,) = _newRandomOperator();
- (AVS avs,) = _newRandomAVS();
-
- // 1. Deposit Into Strategies
- staker.depositIntoEigenlayer(strategies, tokenBalances);
- // 2. Delegate to an operator
- staker.delegateTo(operator);
-
- // Create an operator set and register an operator.
- OperatorSet memory operatorSet = avs.createOperatorSet(strategies);
- operator.registerForOperatorSet(operatorSet);
-
- // 3. Allocate to operator set.
- IAllocationManagerTypes.AllocateParams memory allocateParams =
- operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length}));
- assert_Snap_Allocations_Modified(
- operator, allocateParams, false, "operator allocations should be updated before delay"
- );
- _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
- assert_Snap_Allocations_Modified(
- operator, allocateParams, true, "operator allocations should be updated after delay"
- );
-
- // 4. Queue withdrawal
- IDelegationManagerTypes.Withdrawal[] memory withdrawals =
- staker.queueWithdrawals(strategies, _calculateExpectedShares(strategies, tokenBalances));
- bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
-
- // 5. Slash operator
- IAllocationManagerTypes.SlashingParams memory slashingParams;
- {
- (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) =
- _randStrategiesAndWadsToSlash(operatorSet);
- slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash);
- assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
- assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing");
- assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed");
- }
-
- // 6. Complete withdrawal
- _rollBlocksForCompleteWithdrawals(withdrawals);
- for (uint256 i = 0; i < withdrawals.length; ++i) {
- uint256[] memory expectedTokens =
- _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares);
- staker.completeWithdrawalAsTokens(withdrawals[i]);
- check_Withdrawal_AsTokens_State_AfterSlash(
- staker, operator, withdrawals[i], allocateParams, slashingParams, expectedTokens
- );
- }
-
- // Check Final State
- assert_HasNoDelegatableShares(staker, "staker should have withdrawn all shares");
- assert_HasUnderlyingTokenBalances_AfterSlash(
- staker,
- allocateParams,
- slashingParams,
- tokenBalances,
- "staker should once again have original token tokenBalances minus slashed"
- );
- assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
- }
-
- function testFuzz_deposit_delegate_allocate_queue_slash_completeAsShares(
- uint24 _random
- ) public {
- _configRand({_randomSeed: _random, _assetTypes: HOLDS_ALL, _userTypes: DEFAULT});
- _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local
-
- (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker();
- (User operator,,) = _newRandomOperator();
- (AVS avs,) = _newRandomAVS();
-
- // 1. Deposit Into Strategies
- staker.depositIntoEigenlayer(strategies, tokenBalances);
- // 2. Delegate to an operator
- staker.delegateTo(operator);
-
- // Create an operator set and register an operator.
- OperatorSet memory operatorSet = avs.createOperatorSet(strategies);
- operator.registerForOperatorSet(operatorSet);
- operator.setAllocationDelay(1);
-
- // 3. Allocate to operator set.
- IAllocationManagerTypes.AllocateParams memory allocateParams =
- operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length}));
- assert_Snap_Allocations_Modified(
- operator, allocateParams, false, "operator allocations should be updated before delay"
- );
- _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
- assert_Snap_Allocations_Modified(
- operator, allocateParams, true, "operator allocations should be updated after delay"
- );
-
- // 4. Queue withdrawal
- IDelegationManagerTypes.Withdrawal[] memory withdrawals =
- staker.queueWithdrawals(strategies, _calculateExpectedShares(strategies, tokenBalances));
- bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
-
- // 5. Slash operator
- IAllocationManagerTypes.SlashingParams memory slashingParams;
- {
- (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) =
- _randStrategiesAndWadsToSlash(operatorSet);
- slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash);
- assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
- assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing");
- assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed");
- }
-
- // 4. Complete withdrawal
- // Fast forward to when we can complete the withdrawal
- _rollBlocksForCompleteWithdrawals(withdrawals);
-
- for (uint256 i = 0; i < withdrawals.length; ++i) {
- staker.completeWithdrawalAsShares(withdrawals[i]);
- check_Withdrawal_AsShares_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams);
- }
-
- // Check final state:
- assert_HasNoUnderlyingTokenBalance(staker, strategies, "staker not have any underlying tokens");
- assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
- }
-
- function testFuzz_deposit_delegate_allocate_deallocate_slash_queue_completeAsTokens(
- uint24 _random
- ) public {
- _configRand({_randomSeed: _random, _assetTypes: HOLDS_ALL, _userTypes: DEFAULT});
- _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local
-
- (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker();
- (User operator,,) = _newRandomOperator();
- (AVS avs,) = _newRandomAVS();
-
- // 1. Deposit Into Strategies
- staker.depositIntoEigenlayer(strategies, tokenBalances);
- // 2. Delegate to an operator
- staker.delegateTo(operator);
-
- // Create an operator set and register an operator.
- OperatorSet memory operatorSet = avs.createOperatorSet(strategies);
- operator.registerForOperatorSet(operatorSet);
- operator.setAllocationDelay(1);
-
- console.log("block allocated", block.number);
- // 3. Allocate to operator set.
- IAllocationManagerTypes.AllocateParams memory allocateParams =
- operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length}));
- assert_Snap_Allocations_Modified(
- operator, allocateParams, false, "operator allocations should be updated before delay"
- );
- _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
- assert_Snap_Allocations_Modified(
- operator, allocateParams, true, "operator allocations should be updated after delay"
- );
-
- // 4. Deallocate all.
- IAllocationManagerTypes.AllocateParams memory deallocateParams = operator.deallocateAll(operatorSet);
- _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
-
- // 5. Slash operator
- IAllocationManagerTypes.SlashingParams memory slashingParams;
- {
- (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) =
- _randStrategiesAndWadsToSlash(operatorSet);
- slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash);
- assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
- assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing");
- assert_Snap_StakerWithdrawableShares_AfterSlash(staker, deallocateParams, slashingParams, "staker deposit shares should be slashed");
- }
-
- // 6. Queue withdrawals
- IDelegationManagerTypes.Withdrawal[] memory withdrawals =
- staker.queueWithdrawals(strategies, _calculateExpectedShares(strategies, tokenBalances));
- bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
-
- // 7. Complete withdrawal
- _rollBlocksForCompleteWithdrawals(withdrawals);
- for (uint256 i = 0; i < withdrawals.length; ++i) {
- uint256[] memory expectedTokens =
- _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares);
- staker.completeWithdrawalAsTokens(withdrawals[i]);
- check_Withdrawal_AsTokens_State_AfterSlash(
- staker, operator, withdrawals[i], allocateParams, slashingParams, expectedTokens
- );
- }
-
- // Check Final State
- assert_HasUnderlyingTokenBalances(
- staker,
- allocateParams.strategies,
- tokenBalances,
- "staker should have withdrawn all shares"
- );
- assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
- }
-
- function testFuzz_deposit_delegate_allocate_deregister_slash(
- uint24 _random
- ) public {
- _configRand({_randomSeed: _random, _assetTypes: HOLDS_ALL, _userTypes: DEFAULT});
- _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local
-
- (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker();
- (User operator,,) = _newRandomOperator();
- (AVS avs,) = _newRandomAVS();
-
- // 1. Deposit Into Strategies
- staker.depositIntoEigenlayer(strategies, tokenBalances);
- // 2. Delegate to an operator
- staker.delegateTo(operator);
-
- // Create an operator set and register an operator.
- OperatorSet memory operatorSet = avs.createOperatorSet(strategies);
- operator.registerForOperatorSet(operatorSet);
-
- // 3. Allocate to operator set.
- IAllocationManagerTypes.AllocateParams memory allocateParams =
- operator.modifyAllocations(operatorSet, _randMagnitudes({sum: 1 ether, len: strategies.length}));
- assert_Snap_Allocations_Modified(
- operator, allocateParams, false, "operator allocations should be updated before delay"
- );
- _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
- assert_Snap_Allocations_Modified(
- operator, allocateParams, true, "operator allocations should be updated after delay"
- );
-
- // 4. Deregister.
- operator.deregisterFromOperatorSet(operatorSet);
-
- // 5. Slash operator
- IAllocationManagerTypes.SlashingParams memory slashingParams;
- {
- (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) =
- _randStrategiesAndWadsToSlash(operatorSet);
- slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash);
- assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
- assert_Snap_Unchanged_StakerDepositShares(staker, "staker deposit shares should be unchanged after slashing");
- assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed");
- }
- }
-}
diff --git a/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol b/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol
new file mode 100644
index 0000000000..e38bc43ecb
--- /dev/null
+++ b/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol
@@ -0,0 +1,179 @@
+// 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_Queue_Redeposit is IntegrationCheckUtils {
+
+ AVS avs;
+ OperatorSet operatorSet;
+
+ User operator;
+ AllocateParams allocateParams;
+
+ User staker;
+ IStrategy[] strategies;
+ uint[] initTokenBalances;
+ uint[] initDepositShares;
+
+ uint[] numTokensRemaining;
+
+ function _init() internal override {
+ // TODO: Partial deposits don't work when beacon chain eth balance is initialized to < 64 ETH, need to write _newRandomStaker variant that ensures beacon chain ETH balance
+ // greater than or equal to 64
+ _configAssetTypes(HOLDS_LST);
+ _configUserTypes(DEFAULT);
+
+ (staker, strategies, initTokenBalances) = _newRandomStaker();
+ (operator,,) = _newRandomOperator();
+ (avs,) = _newRandomAVS();
+
+ uint256[] memory tokensToDeposit = new uint256[](initTokenBalances.length);
+ numTokensRemaining = new uint256[](initTokenBalances.length);
+ for (uint256 i = 0; i < initTokenBalances.length; i++) {
+ if (strategies[i] == BEACONCHAIN_ETH_STRAT) {
+ tokensToDeposit[i] = initTokenBalances[i];
+ continue;
+ }
+
+ tokensToDeposit[i] = initTokenBalances[i]/2;
+ numTokensRemaining[i] = initTokenBalances[i] - tokensToDeposit[i];
+ }
+
+ uint256[] memory shares = _calculateExpectedShares(strategies, tokensToDeposit);
+
+ // 1. Deposit Into Strategies
+ staker.depositIntoEigenlayer(strategies, tokensToDeposit);
+ check_Deposit_State_PartialDeposit(staker, strategies, shares, numTokensRemaining);
+
+ // 2. Delegate to operator
+ staker.delegateTo(operator);
+ check_Delegation_State(staker, operator, strategies, shares);
+
+ // Create operator set and register operator
+ operatorSet = avs.createOperatorSet(strategies);
+ operator.registerForOperatorSet(operatorSet);
+ check_Registration_State_NoAllocation(operator, operatorSet, allStrats);
+
+ // 3. Allocate to operator set
+ allocateParams = _genAllocation_AllAvailable(operator, operatorSet);
+ operator.modifyAllocations(allocateParams);
+ check_IncrAlloc_State_Slashable(operator, allocateParams);
+
+ _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
+ }
+
+ function testFuzz_fullSlash_queue_complete_redeposit(
+ uint24 _random
+ ) public rand(_random) {
+ // 4. Fully slash operator
+ SlashingParams memory slashingParams;
+ {
+ (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) =
+ _strategiesAndWadsForFullSlash(operatorSet);
+
+ slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash);
+ assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing");
+ assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed");
+ }
+
+ // 5. Undelegate from an operator
+ Withdrawal[] memory withdrawals = staker.undelegate();
+ bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
+
+ // 6. Complete withdrawal
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint256 i = 0; i < withdrawals.length; ++i) {
+ uint256[] memory expectedTokens =
+ _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares);
+ staker.completeWithdrawalAsTokens(withdrawals[i]);
+ check_Withdrawal_AsTokens_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams, expectedTokens);
+ }
+
+ // 7. Redeposit
+ uint[] memory shares = _calculateExpectedShares(strategies, numTokensRemaining);
+ staker.depositIntoEigenlayer(strategies, numTokensRemaining);
+ check_Deposit_State(staker, strategies, shares);
+
+ // Final state checks
+ assert_HasExpectedShares(staker, strategies, shares, "staker should have expected shares after redeposit");
+ assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
+ }
+
+ function testFuzz_undelegate_fullSlash_complete_redeposit(
+ uint24 _random
+ ) public rand(_random) {
+ // 4. Undelegate from an operator
+ Withdrawal[] memory withdrawals = staker.undelegate();
+ bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
+
+ // 5. Fully slash operator
+ SlashingParams memory slashingParams;
+ {
+ (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) =
+ _strategiesAndWadsForFullSlash(operatorSet);
+
+ slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash);
+ assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing");
+ assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed");
+ }
+
+ // 6. Complete withdrawal
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint256 i = 0; i < withdrawals.length; ++i) {
+ uint256[] memory expectedTokens =
+ _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares);
+ staker.completeWithdrawalAsTokens(withdrawals[i]);
+ check_Withdrawal_AsTokens_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams, expectedTokens);
+ }
+
+ // 7. Redeposit
+ uint[] memory shares = _calculateExpectedShares(strategies, numTokensRemaining);
+ staker.depositIntoEigenlayer(strategies, numTokensRemaining);
+ check_Deposit_State(staker, strategies, shares);
+
+ // Final state checks
+ assert_HasExpectedShares(staker, strategies, shares, "staker should have expected shares after redeposit");
+ assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
+ }
+
+ function testFuzz_depositFull_fullSlash_undelegate_completeAsShares(
+ uint24 _random
+ ) public rand(_random) {
+ uint[] memory shares = _calculateExpectedShares(strategies, numTokensRemaining);
+ staker.depositIntoEigenlayer(strategies, numTokensRemaining);
+ check_Deposit_State(staker, strategies, shares);
+
+ // 4. Fully slash random proper subset of operators strategies
+ SlashingParams memory slashingParams;
+ {
+ (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) =
+ _strategiesAndWadsForRandFullSlash(operatorSet);
+ slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash);
+ assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing");
+ assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed");
+ }
+
+ // 5. Undelegate from an operator
+ Withdrawal[] memory withdrawals = staker.undelegate();
+ bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
+
+ // 6. Complete withdrawal as shares
+ // Fast forward to when we can complete the withdrawal
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+
+ for (uint256 i = 0; i < withdrawals.length; ++i) {
+ staker.completeWithdrawalAsShares(withdrawals[i]);
+ check_Withdrawal_AsShares_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams);
+ }
+
+ // Check final state:
+ assert_HasNoUnderlyingTokenBalance(staker, slashingParams.strategies, "staker not have any underlying tokens");
+ assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
+ }
+}
\ No newline at end of file
diff --git a/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol b/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol
index 8c2c4e086c..2245f53a90 100644
--- a/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol
+++ b/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol
@@ -16,14 +16,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils {
/// 2. delegates to an operator
/// 3. queues a withdrawal for a ALL shares
/// 4. completes the queued withdrawal as tokens
- function testFuzz_deposit_delegate_queue_completeAsTokens(uint24 _random) public {
- // When new Users are created, they will choose a random configuration from these params:
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_delegate_queue_completeAsTokens(uint24 _random) public rand(_random) {
/// 0. Create an operator and a staker with:
// - some nonzero underlying token balances
// - corresponding to a random subset of valid strategies (StrategyManager and/or EigenPodManager)
@@ -35,8 +28,6 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils {
uint[] memory tokenBalances
) = _newRandomStaker();
(User operator, ,) = _newRandomOperator();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
@@ -52,7 +43,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils {
check_Delegation_State(staker, operator, strategies, shares);
// 3. Queue Withdrawals
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
check_QueuedWithdrawal_State(staker, operator, strategies, shares, withdrawals, withdrawalRoots);
@@ -78,14 +69,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils {
/// 2. delegates to an operator
/// 3. queues a withdrawal for a ALL shares
/// 4. completes the queued withdrawal as shares
- function testFuzz_deposit_delegate_queue_completeAsShares(uint24 _random) public {
- // When new Users are created, they will choose a random configuration from these params:
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_delegate_queue_completeAsShares(uint24 _random) public rand(_random) {
/// 0. Create an operator and a staker with:
// - some nonzero underlying token balances
// - corresponding to a random subset of valid strategies (StrategyManager and/or EigenPodManager)
@@ -97,8 +81,6 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils {
uint[] memory tokenBalances
) = _newRandomStaker();
(User operator, ,) = _newRandomOperator();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
@@ -114,7 +96,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils {
check_Delegation_State(staker, operator, strategies, shares);
// 3. Queue Withdrawals
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
check_QueuedWithdrawal_State(staker, operator, strategies, shares, withdrawals, withdrawalRoots);
@@ -143,14 +125,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils {
/// 2. delegates to an operator
/// 3. queues a withdrawal for a random subset of shares
/// 4. completes the queued withdrawal as tokens
- function testFuzz_deposit_delegate_queueRand_completeAsTokens(uint24 _random) public {
- // When new Users are created, they will choose a random configuration from these params:
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_delegate_queueRand_completeAsTokens(uint24 _random) public rand(_random) {
/// 0. Create an operator and a staker with:
// - some nonzero underlying token balances
// - corresponding to a random subset of valid strategies (StrategyManager and/or EigenPodManager)
@@ -162,8 +137,6 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils {
uint[] memory tokenBalances
) = _newRandomStaker();
(User operator, ,) = _newRandomOperator();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
@@ -185,7 +158,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils {
uint[] memory withdrawShares
) = _randWithdrawal(strategies, shares);
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(withdrawStrats, withdrawShares);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(withdrawStrats, withdrawShares);
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
check_QueuedWithdrawal_State(staker, operator, withdrawStrats, withdrawShares, withdrawals, withdrawalRoots);
@@ -208,14 +181,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils {
/// 2. delegates to an operator
/// 3. queues a withdrawal for a random subset of shares
/// 4. completes the queued withdrawal as shares
- function testFuzz_deposit_delegate_queueRand_completeAsShares(uint24 _random) public {
- // When new Users are created, they will choose a random configuration from these params:
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_delegate_queueRand_completeAsShares(uint24 _random) public rand(_random) {
/// 0. Create an operator and a staker with:
// - some nonzero underlying token balances
// - corresponding to a random subset of valid strategies (StrategyManager and/or EigenPodManager)
@@ -227,8 +193,6 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils {
uint[] memory tokenBalances
) = _newRandomStaker();
(User operator, ,) = _newRandomOperator();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
@@ -250,7 +214,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils {
uint[] memory withdrawShares
) = _randWithdrawal(strategies, shares);
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(withdrawStrats, withdrawShares);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(withdrawStrats, withdrawShares);
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
check_QueuedWithdrawal_State(staker, operator, withdrawStrats, withdrawShares, withdrawals, withdrawalRoots);
@@ -280,12 +244,8 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils {
/// 2. delegates to an operator
///
/// ... we check that the final step fails
- function testFuzz_deposit_delegate_revert_alreadyDelegated(uint24 _random) public {
- _configRand({
- _randomSeed: _random,
- _assetTypes: NO_ASSETS | HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
+ function testFuzz_deposit_delegate_revert_alreadyDelegated(uint24 _random) public rand(_random) {
+ _configAssetTypes(NO_ASSETS | HOLDS_LST | HOLDS_ETH | HOLDS_ALL);
/// 0. Create a staker and operator
(
@@ -294,8 +254,6 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils {
uint[] memory tokenBalances
) = _newRandomStaker();
(User operator, ,) = _newRandomOperator();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
diff --git a/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol b/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol
index 7825645917..48b37cad8b 100644
--- a/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol
+++ b/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol
@@ -5,6 +5,8 @@ import "src/test/integration/users/User.t.sol";
import "src/test/integration/IntegrationChecks.t.sol";
contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUtils {
+ using ArrayLib for *;
+
/// Randomly generates a user with different held assets. Then:
/// 1. deposit into strategy
/// 2. delegate to an operator
@@ -13,14 +15,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
/// 5. delegate to a new operator
/// 5. queueWithdrawal
/// 7. complete their queued withdrawal as tokens
- function testFuzz_deposit_delegate_reDelegate_completeAsTokens(uint24 _random) public {
- // When new Users are created, they will choose a random configuration from these params:
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_delegate_reDelegate_completeAsTokens(uint24 _random) public rand(_random) {
/// 0. Create an operator and a staker with:
// - some nonzero underlying token balances
// - corresponding to a random number of strategies
@@ -34,10 +29,10 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
) = _newRandomStaker();
(User operator1, ,) = _newRandomOperator();
(User operator2, ,) = _newRandomOperator();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ //delegatable shares equals deposit shares here because no bc slashing
+ uint[] memory delegatableShares = shares;
assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing");
assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated");
@@ -51,9 +46,9 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
check_Delegation_State(staker, operator1, strategies, shares);
// 3. Undelegate from an operator
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate();
+ Withdrawal[] memory withdrawals = staker.undelegate();
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
- check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares);
+ check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares, delegatableShares);
// 4. Complete withdrawal as shares
// Fast forward to when we can complete the withdrawal
@@ -85,14 +80,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
}
}
- function testFuzz_deposit_delegate_reDelegate_completeAsShares(uint24 _random) public {
- // When new Users are created, they will choose a random configuration from these params:
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_delegate_reDelegate_completeAsShares(uint24 _random) public rand(_random) {
/// 0. Create an operator and a staker with:
// - some nonzero underlying token balances
// - corresponding to a random number of strategies
@@ -106,10 +94,10 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
) = _newRandomStaker();
(User operator1, ,) = _newRandomOperator();
(User operator2, ,) = _newRandomOperator();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ //delegatable shares equals deposit shares here because no bc slashing
+ uint[] memory delegatableShares = shares;
assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing");
assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated");
@@ -123,9 +111,9 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
check_Delegation_State(staker, operator1, strategies, shares);
// 3. Undelegate from an operator
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate();
+ Withdrawal[] memory withdrawals = staker.undelegate();
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
- check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares);
+ check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares, delegatableShares);
// 4. Complete withdrawal as shares
// Fast forward to when we can complete the withdrawal
@@ -170,13 +158,8 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
);
}
- function testFuzz_deposit_delegate_reDelegate_depositAfterRedelegate(uint24 _random) public {
- // When new Users are created, they will choose a random configuration from these params:
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST, // not holding ETH since we can only deposit 32 ETH multiples
- _userTypes: DEFAULT | ALT_METHODS
- });
+ function testFuzz_deposit_delegate_reDelegate_depositAfterRedelegate(uint24 _random) public rand(_random) {
+ _configAssetTypes(HOLDS_LST); // not holding ETH since we can only deposit 32 ETH multiples
/// 0. Create an operator and a staker with:
// - some nonzero underlying token balances
@@ -191,8 +174,6 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
) = _newRandomStaker();
(User operator1, ,) = _newRandomOperator();
(User operator2, ,) = _newRandomOperator();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
@@ -208,6 +189,8 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
numTokensRemaining[i] = tokenBalances[i] - numTokensToDeposit[i];
}
uint[] memory halfShares = _calculateExpectedShares(strategies, numTokensToDeposit);
+ //delegatable shares equals deposit shares here because no bc slashing
+ uint[] memory delegatableShares = halfShares;
/// 1. Deposit Into Strategies
staker.depositIntoEigenlayer(strategies, numTokensToDeposit);
@@ -218,9 +201,9 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
check_Delegation_State(staker, operator1, strategies, halfShares);
// 3. Undelegate from an operator
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate();
+ Withdrawal[] memory withdrawals = staker.undelegate();
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
- check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, halfShares);
+ check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, halfShares, delegatableShares);
// 4. Complete withdrawal as shares
// Fast forward to when we can complete the withdrawal
@@ -245,7 +228,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
{
// 7. Queue Withdrawal
shares = _calculateExpectedShares(strategies, tokenBalances);
- IDelegationManagerTypes.Withdrawal[] memory newWithdrawals = staker.queueWithdrawals(strategies, shares);
+ Withdrawal[] memory newWithdrawals = staker.queueWithdrawals(strategies, shares);
bytes32[] memory newWithdrawalRoots = _getWithdrawalHashes(newWithdrawals);
check_QueuedWithdrawal_State(staker, operator2, strategies, shares, newWithdrawals, newWithdrawalRoots);
@@ -262,13 +245,8 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
}
}
- function testFuzz_deposit_delegate_reDelegate_depositBeforeRedelegate(uint24 _random) public {
- // When new Users are created, they will choose a random configuration from these params:
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST, // not holding ETH since we can only deposit 32 ETH multiples
- _userTypes: DEFAULT | ALT_METHODS
- });
+ function testFuzz_deposit_delegate_reDelegate_depositBeforeRedelegate(uint24 _random) public rand(_random) {
+ _configAssetTypes(HOLDS_LST); // not holding ETH since we can only deposit 32 ETH multiples
/// 0. Create an operator and a staker with:
// - some nonzero underlying token balances
@@ -283,10 +261,8 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
) = _newRandomStaker();
(User operator1, ,) = _newRandomOperator();
(User operator2, ,) = _newRandomOperator();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
- uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ uint[] memory totalShares = new uint[](strategies.length);
assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing");
assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated");
@@ -295,51 +271,59 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
// Divide shares by 2 in new array to do deposits after redelegate
uint[] memory numTokensToDeposit = new uint[](tokenBalances.length);
uint[] memory numTokensRemaining = new uint[](tokenBalances.length);
- for (uint i = 0; i < shares.length; i++) {
+ for (uint i = 0; i < strategies.length; i++) {
numTokensToDeposit[i] = tokenBalances[i] / 2;
numTokensRemaining[i] = tokenBalances[i] - numTokensToDeposit[i];
}
- uint[] memory halfShares = _calculateExpectedShares(strategies, numTokensToDeposit);
-
- /// 1. Deposit Into Strategies
- staker.depositIntoEigenlayer(strategies, numTokensToDeposit);
- check_Deposit_State_PartialDeposit(staker, strategies, halfShares, numTokensRemaining);
-
- // 2. Delegate to an operator
- staker.delegateTo(operator1);
- check_Delegation_State(staker, operator1, strategies, halfShares);
-
- // 3. Undelegate from an operator
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate();
- bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
- check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, halfShares);
-
- // 4. Complete withdrawal as shares
- // Fast forward to when we can complete the withdrawal
- _rollBlocksForCompleteWithdrawals(withdrawals);
- for (uint256 i = 0; i < withdrawals.length; ++i) {
- staker.completeWithdrawalAsShares(withdrawals[i]);
- check_Withdrawal_AsShares_Undelegated_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares);
+ {
+ uint[] memory sharesFromFirstDeposit = _calculateExpectedShares(strategies, numTokensToDeposit);
+ //delegatable shares equals deposit shares here because no bc slashing
+ uint[] memory delegatableShares = sharesFromFirstDeposit;
+
+ /// 1. Deposit Into Strategies
+ staker.depositIntoEigenlayer(strategies, numTokensToDeposit);
+ check_Deposit_State_PartialDeposit(staker, strategies, sharesFromFirstDeposit, numTokensRemaining);
+
+ // 2. Delegate to an operator
+ staker.delegateTo(operator1);
+ check_Delegation_State(staker, operator1, strategies, sharesFromFirstDeposit);
+
+ // 3. Undelegate from an operator
+ Withdrawal[] memory withdrawals = staker.undelegate();
+ bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
+ check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, sharesFromFirstDeposit, delegatableShares);
+
+ // 4. Complete withdrawal as shares
+ // Fast forward to when we can complete the withdrawal
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint256 i = 0; i < withdrawals.length; ++i) {
+ staker.completeWithdrawalAsShares(withdrawals[i]);
+ check_Withdrawal_AsShares_Undelegated_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares);
+ }
+
+ // 5. Deposit into Strategies
+ uint[] memory sharesFromSecondDeposit = _calculateExpectedShares(strategies, numTokensRemaining);
+ for (uint i = 0; i < strategies.length; i++) {
+ totalShares[i] = sharesFromFirstDeposit[i] + sharesFromSecondDeposit[i];
+ }
+
+ staker.depositIntoEigenlayer(strategies, numTokensRemaining);
+ tokenBalances = _calculateExpectedTokens(strategies, totalShares);
+ check_Deposit_State(staker, strategies, sharesFromSecondDeposit);
}
- // 5. Deposit into Strategies
- uint[] memory sharesAdded = _calculateExpectedShares(strategies, numTokensRemaining);
- staker.depositIntoEigenlayer(strategies, numTokensRemaining);
- tokenBalances = _calculateExpectedTokens(strategies, shares);
- check_Deposit_State(staker, strategies, sharesAdded);
-
// 6. Delegate to a new operator
staker.delegateTo(operator2);
- check_Delegation_State(staker, operator2, strategies, shares);
+ check_Delegation_State(staker, operator2, strategies, totalShares);
assertNotEq(address(operator1), delegationManager.delegatedTo(address(staker)), "staker should not be delegated to operator1");
}
{
// 7. Queue Withdrawal
- shares = _calculateExpectedShares(strategies, tokenBalances);
- IDelegationManagerTypes.Withdrawal[] memory newWithdrawals = staker.queueWithdrawals(strategies, shares);
+ totalShares = _calculateExpectedShares(strategies, tokenBalances);
+ Withdrawal[] memory newWithdrawals = staker.queueWithdrawals(strategies, totalShares);
bytes32[] memory newWithdrawalRoots = _getWithdrawalHashes(newWithdrawals);
- check_QueuedWithdrawal_State(staker, operator2, strategies, shares, newWithdrawals, newWithdrawalRoots);
+ check_QueuedWithdrawal_State(staker, operator2, strategies, totalShares, newWithdrawals, newWithdrawalRoots);
// 8. Complete withdrawal
// Fast forward to when we can complete the withdrawal
@@ -349,19 +333,12 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
for (uint i = 0; i < newWithdrawals.length; i++) {
uint[] memory expectedTokens = _calculateExpectedTokens(newWithdrawals[i].strategies, newWithdrawals[i].scaledShares);
IERC20[] memory tokens = staker.completeWithdrawalAsTokens(newWithdrawals[i]);
- check_Withdrawal_AsTokens_State(staker, operator2, newWithdrawals[i], strategies, shares, tokens, expectedTokens);
+ check_Withdrawal_AsTokens_State(staker, operator2, newWithdrawals[i], strategies, totalShares, tokens, expectedTokens);
}
}
}
- function testFuzz_deposit_delegate_undelegate_withdrawAsTokens_reDelegate_completeAsTokens(uint24 _random) public {
- // When new Users are created, they will choose a random configuration from these params:
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_delegate_undelegate_withdrawAsTokens_reDelegate_completeAsTokens(uint24 _random) public rand(_random) {
/// 0. Create operators and a staker
(
User staker,
@@ -370,10 +347,10 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
) = _newRandomStaker();
(User operator1, ,) = _newRandomOperator();
(User operator2, ,) = _newRandomOperator();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ //delegatable shares equals deposit shares here because no bc slashing
+ uint[] memory delegatableShares = shares;
assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing");
assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated");
@@ -388,9 +365,9 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
check_Delegation_State(staker, operator1, strategies, shares);
// 3. Undelegate from an operator
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate();
+ Withdrawal[] memory withdrawals = staker.undelegate();
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
- check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares);
+ check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares, delegatableShares);
// 4. Complete withdrawal as tokens
// Fast forward to when we can complete the withdrawal
@@ -428,14 +405,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
}
}
- function testFuzz_deposit_delegate_undelegate_withdrawAsTokens_reDelegate_completeAsShares(uint24 _random) public {
- // When new Users are created, they will choose a random configuration from these params:
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_delegate_undelegate_withdrawAsTokens_reDelegate_completeAsShares(uint24 _random) public rand(_random) {
/// 0. Create operators and a staker
(
User staker,
@@ -444,10 +414,10 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
) = _newRandomStaker();
(User operator1, ,) = _newRandomOperator();
(User operator2, ,) = _newRandomOperator();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ //delegatable shares equals deposit shares here because no bc slashing
+ uint[] memory delegatableShares = shares;
assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing");
assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated");
@@ -462,9 +432,9 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
check_Delegation_State(staker, operator1, strategies, shares);
// 3. Undelegate from an operator
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate();
+ Withdrawal[] memory withdrawals = staker.undelegate();
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
- check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares);
+ check_Undelegate_State(staker, operator1, withdrawals, withdrawalRoots, strategies, shares, delegatableShares);
// 4. Complete withdrawal as Tokens
// Fast forward to when we can complete the withdrawal
@@ -475,7 +445,8 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti
check_Withdrawal_AsTokens_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares, tokens, expectedTokens);
}
- //5. Deposit into Strategies
+ // 5. Deposit into Strategies
+ shares = _calculateExpectedShares(strategies, withdrawnTokenBalances);
staker.depositIntoEigenlayer(strategies, withdrawnTokenBalances);
check_Deposit_State(staker, strategies, shares);
diff --git a/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol b/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol
index ab157f0ced..4979ee1672 100644
--- a/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol
+++ b/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol
@@ -10,14 +10,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti
/// 2. delegate to an operator
/// 3. undelegates from the operator
/// 4. complete their queued withdrawal as tokens
- function testFuzz_deposit_undelegate_completeAsTokens(uint24 _random) public {
- // When new Users are created, they will choose a random configuration from these params:
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_undelegate_completeAsTokens(uint24 _random) public rand(_random) {
/// 0. Create an operator and a staker with:
// - some nonzero underlying token balances
// - corresponding to a random number of strategies
@@ -30,10 +23,10 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti
uint[] memory tokenBalances
) = _newRandomStaker();
(User operator, ,) = _newRandomOperator();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ //delegatable shares equals deposit shares here because no bc slashing
+ uint[] memory delegatableShares = shares;
assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing");
assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated");
@@ -47,9 +40,9 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti
check_Delegation_State(staker, operator, strategies, shares);
// 3. Undelegate from an operator
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate();
+ Withdrawal[] memory withdrawals = staker.undelegate();
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
- check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares);
+ check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares, delegatableShares);
// 4. Complete withdrawal
// Fast forward to when we can complete the withdrawal
@@ -73,14 +66,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti
/// 2. delegate to an operator
/// 3. undelegates from the operator
/// 4. complete their queued withdrawal as shares
- function testFuzz_deposit_undelegate_completeAsShares(uint24 _random) public {
- // When new Users are created, they will choose a random configuration from these params:
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_undelegate_completeAsShares(uint24 _random) public rand(_random) {
/// 0. Create an operator and a staker with:
// - some nonzero underlying token balances
// - corresponding to a random number of strategies
@@ -93,10 +79,10 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti
uint[] memory tokenBalances
) = _newRandomStaker();
(User operator, ,) = _newRandomOperator();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ //delegatable shares equals deposit shares here because no bc slashing
+ uint[] memory delegatableShares = shares;
assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing");
assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated");
@@ -110,9 +96,9 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti
check_Delegation_State(staker, operator, strategies, shares);
// 3. Undelegate from an operator
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate();
+ Withdrawal[] memory withdrawals = staker.undelegate();
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
- check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares);
+ check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares, delegatableShares);
// 4. Complete withdrawal
// Fast forward to when we can complete the withdrawal
@@ -129,14 +115,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti
assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
}
- function testFuzz_deposit_delegate_forceUndelegate_completeAsTokens(uint24 _random) public {
- // When new Users are created, they will choose a random configuration from these params:
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_delegate_forceUndelegate_completeAsTokens(uint24 _random) public rand(_random) {
/// 0. Create an operator and a staker with:
// - some nonzero underlying token balances
// - corresponding to a random number of strategies
@@ -149,10 +128,11 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti
uint[] memory tokenBalances
) = _newRandomStaker();
(User operator, ,) = _newRandomOperator();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ //delegatable shares equals deposit shares here because no bc slashing
+ uint[] memory delegatableShares = shares;
+
assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing");
assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated");
@@ -166,9 +146,9 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti
check_Delegation_State(staker, operator, strategies, shares);
// 3. Force undelegate
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = operator.forceUndelegate(staker);
+ Withdrawal[] memory withdrawals = operator.forceUndelegate(staker);
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
- check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares);
+ check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares, delegatableShares);
// 4. Complete withdrawal
// Fast forward to when we can complete the withdrawal
@@ -186,14 +166,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti
assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
}
- function testFuzz_deposit_delegate_forceUndelegate_completeAsShares(uint24 _random) public {
- // When new Users are created, they will choose a random configuration from these params:
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_delegate_forceUndelegate_completeAsShares(uint24 _random) public rand(_random) {
/// 0. Create an operator and a staker with:
// - some nonzero underlying token balances
// - corresponding to a random number of strategies
@@ -206,10 +179,10 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti
uint[] memory tokenBalances
) = _newRandomStaker();
(User operator, ,) = _newRandomOperator();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ //delegatable shares equals deposit shares here because no bc slashing
+ uint[] memory delegatableShares = shares;
assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing");
assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated");
@@ -223,9 +196,9 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti
check_Delegation_State(staker, operator, strategies, shares);
// 3. Force undelegate
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = operator.forceUndelegate(staker);
+ Withdrawal[] memory withdrawals = operator.forceUndelegate(staker);
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
- check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares);
+ check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares, delegatableShares);
// 4. Complete withdrawal
// Fast forward to when we can complete the withdrawal
@@ -243,9 +216,8 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti
function testFuzz_deposit_delegate_undelegate_completeAsTokens_Max_Strategies(
uint24 _random
- ) public {
- _configRand({_randomSeed: _random, _assetTypes: HOLDS_MAX, _userTypes: DEFAULT});
- _upgradeEigenLayerContracts(); // Upgrade contracts if forkType is not local
+ ) public rand(_random) {
+ _configAssetTypes(HOLDS_MAX);
(User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker();
(User operator,,) = _newRandomOperator();
@@ -253,6 +225,8 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti
if (forkType == LOCAL) assertEq(strategies.length, 33, "sanity");
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ //delegatable shares equals deposit shares here because no bc slashing
+ uint[] memory delegatableShares = shares;
assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing");
assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated");
@@ -266,9 +240,9 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti
check_Delegation_State(staker, operator, strategies, shares);
// 3. Undelegate from an operator
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate();
+ Withdrawal[] memory withdrawals = staker.undelegate();
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
- check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares);
+ check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, shares, delegatableShares);
// 4. Complete withdrawal
// Fast forward to when we can complete the withdrawal
diff --git a/src/test/integration/tests/Deposit_Delegate_UpdateBalance.t.sol b/src/test/integration/tests/Deposit_Delegate_UpdateBalance.t.sol
index bcbdd6d86b..359ed44d06 100644
--- a/src/test/integration/tests/Deposit_Delegate_UpdateBalance.t.sol
+++ b/src/test/integration/tests/Deposit_Delegate_UpdateBalance.t.sol
@@ -43,7 +43,7 @@ contract Integration_Deposit_Delegate_UpdateBalance is IntegrationCheckUtils {
// check_Delegation_State(staker, operator, strategies, shares);
// /// 3. Queue withdrawals for ALL shares
- // IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+ // Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
// bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
// check_QueuedWithdrawal_State(staker, operator, strategies, shares, withdrawals, withdrawalRoots);
diff --git a/src/test/integration/tests/Deposit_Queue_Complete.t.sol b/src/test/integration/tests/Deposit_Queue_Complete.t.sol
index 748b2bfa24..3fb7eab532 100644
--- a/src/test/integration/tests/Deposit_Queue_Complete.t.sol
+++ b/src/test/integration/tests/Deposit_Queue_Complete.t.sol
@@ -9,18 +9,9 @@ contract Integration_Deposit_QueueWithdrawal_Complete is IntegrationCheckUtils {
/// 1. deposit into strategy
/// 2. queueWithdrawal
/// 3. completeQueuedWithdrawal"
- function testFuzz_deposit_queueWithdrawal_completeAsTokens(uint24 _random) public {
- // Configure the random parameters for the test
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_queueWithdrawal_completeAsTokens(uint24 _random) public rand(_random) {
// Create a staker with a nonzero balance and corresponding strategies
(User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
// 1. Deposit into strategy
staker.depositIntoEigenlayer(strategies, tokenBalances);
@@ -31,7 +22,7 @@ contract Integration_Deposit_QueueWithdrawal_Complete is IntegrationCheckUtils {
assertFalse(delegationManager.isDelegated(address(staker)), "Staker should not be delegated after deposit");
// 2. Queue Withdrawal
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
// 3. Complete Queued Withdrawal
_rollBlocksForCompleteWithdrawals(withdrawals);
@@ -45,18 +36,9 @@ contract Integration_Deposit_QueueWithdrawal_Complete is IntegrationCheckUtils {
assertFalse(delegationManager.isDelegated(address(staker)), "Staker should still not be delegated after withdrawal");
}
- function testFuzz_deposit_queueWithdrawal_completeAsShares(uint24 _random) public {
- // Configure the random parameters for the test
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_queueWithdrawal_completeAsShares(uint24 _random) public rand(_random) {
// Create a staker with a nonzero balance and corresponding strategies
(User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
// 1. Deposit into strategy
staker.depositIntoEigenlayer(strategies, tokenBalances);
@@ -67,7 +49,7 @@ contract Integration_Deposit_QueueWithdrawal_Complete is IntegrationCheckUtils {
assertFalse(delegationManager.isDelegated(address(staker)), "Staker should not be delegated after deposit");
// 2. Queue Withdrawal
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
// 3. Complete Queued Withdrawal
_rollBlocksForCompleteWithdrawals(withdrawals);
diff --git a/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol b/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol
index b0482c8551..20c4ccbcaf 100644
--- a/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol
+++ b/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol
@@ -5,18 +5,9 @@ import "src/test/integration/users/User.t.sol";
import "src/test/integration/IntegrationChecks.t.sol";
contract Integration_Deposit_Register_QueueWithdrawal_Complete is IntegrationCheckUtils {
- function testFuzz_deposit_registerOperator_queueWithdrawal_completeAsShares(uint24 _random) public {
- // Configure the random parameters for the test
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_registerOperator_queueWithdrawal_completeAsShares(uint24 _random) public rand(_random) {
// Create a staker with a nonzero balance and corresponding strategies
(User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
// 1. Staker deposits into strategy
staker.depositIntoEigenlayer(strategies, tokenBalances);
@@ -28,7 +19,7 @@ contract Integration_Deposit_Register_QueueWithdrawal_Complete is IntegrationChe
assertTrue(delegationManager.isOperator(address(staker)), "Staker should be registered as an operator");
// 3. Queue Withdrawal
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
check_QueuedWithdrawal_State(staker, staker, strategies, shares, withdrawals, withdrawalRoots);
@@ -40,19 +31,9 @@ contract Integration_Deposit_Register_QueueWithdrawal_Complete is IntegrationChe
}
}
- function testFuzz_deposit_registerOperator_queueWithdrawal_completeAsTokens(uint24 _random) public {
- // Configure the random parameters for the test
- _configRand({
- _randomSeed: _random,
- _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
- _userTypes: DEFAULT | ALT_METHODS
- });
-
+ function testFuzz_deposit_registerOperator_queueWithdrawal_completeAsTokens(uint24 _random) public rand(_random) {
// Create a staker with a nonzero balance and corresponding strategies
(User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
- // Upgrade contracts if forkType is not local
- _upgradeEigenLayerContracts();
-
// 1. Staker deposits into strategy
staker.depositIntoEigenlayer(strategies, tokenBalances);
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
@@ -63,7 +44,7 @@ contract Integration_Deposit_Register_QueueWithdrawal_Complete is IntegrationChe
assertTrue(delegationManager.isOperator(address(staker)), "Staker should be registered as an operator");
// 3. Queue Withdrawal
- IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
check_QueuedWithdrawal_State(staker, staker, strategies, shares, withdrawals, withdrawalRoots);
diff --git a/src/test/integration/tests/Slashed_Eigenpod.t.sol b/src/test/integration/tests/Slashed_Eigenpod.t.sol
new file mode 100644
index 0000000000..c98990ab19
--- /dev/null
+++ b/src/test/integration/tests/Slashed_Eigenpod.t.sol
@@ -0,0 +1,307 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "src/test/integration/IntegrationChecks.t.sol";
+
+contract Integration_SlashedEigenpod is IntegrationCheckUtils {
+ using ArrayLib for *;
+
+ AVS avs;
+ OperatorSet operatorSet;
+
+ User operator;
+ IAllocationManagerTypes.AllocateParams allocateParams;
+
+ User staker;
+ IStrategy[] strategies;
+ uint[] initTokenBalances;
+ uint64 slashedGwei;
+
+ function _init() internal override {
+ _configAssetTypes(HOLDS_ETH);
+ (staker, strategies, initTokenBalances) = _newRandomStaker();
+ (operator,,) = _newRandomOperator();
+ (avs,) = _newRandomAVS();
+
+ cheats.assume(initTokenBalances[0] >= 64 ether);
+
+ //Slash on Beacon chain
+ (uint40[] memory validators,) = staker.startValidators();
+ beaconChain.advanceEpoch_NoRewards();
+ staker.verifyWithdrawalCredentials(validators);
+
+ uint[] memory shares = _calculateExpectedShares(strategies, initTokenBalances);
+ check_Deposit_State(staker, strategies, shares);
+
+ uint40[] memory slashedValidators = _choose(validators);
+ slashedGwei = beaconChain.slashValidators(slashedValidators);
+ console.log(slashedGwei);
+ beaconChain.advanceEpoch_NoWithdrawNoRewards();
+
+ staker.startCheckpoint();
+ staker.completeCheckpoint();
+ check_CompleteCheckpoint_WithSlashing_HandleRoundDown_State(staker, slashedValidators, slashedGwei);
+ }
+
+ function testFuzz_delegateSlashedStaker_dsfWad(uint24 _random) public rand(_random) {
+
+ uint256[] memory initDelegatableShares = _getWithdrawableShares(staker, strategies);
+ uint256[] memory initDepositShares = _getStakerDepositShares(staker, strategies);
+
+ // Delegate to an operator
+ staker.delegateTo(operator);
+ check_Delegation_State(staker, operator, strategies, initDepositShares);
+
+ // Create an operator set and register an operator.
+ operatorSet = avs.createOperatorSet(strategies);
+ operator.registerForOperatorSet(operatorSet);
+ check_Registration_State_NoAllocation(operator, operatorSet, strategies);
+
+ // Allocate to operator set
+ allocateParams = _genAllocation_AllAvailable(operator, operatorSet, strategies);
+ operator.modifyAllocations(allocateParams);
+ check_IncrAlloc_State_Slashable(operator, allocateParams);
+ _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
+
+ (uint256[] memory withdrawableSharesBefore, ) = delegationManager.getWithdrawableShares(address(staker), strategies);
+
+ // Undelegate from an operator
+ IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate();
+ bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
+ check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, initDepositShares, initDelegatableShares);
+
+ // Complete withdrawal as shares
+ // Fast forward to when we can complete the withdrawal
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint256 i = 0; i < withdrawals.length; ++i) {
+ staker.completeWithdrawalAsShares(withdrawals[i]);
+ check_Withdrawal_AsShares_Undelegated_State(staker, operator, withdrawals[i], withdrawals[i].strategies, initDelegatableShares);
+ }
+
+ (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) = delegationManager.getWithdrawableShares(address(staker), strategies);
+ assertEq(depositSharesAfter[0], initDelegatableShares[0], "Deposit shares should reset to reflect slash(es)");
+ assertApproxEqAbs(withdrawableSharesAfter[0], depositSharesAfter[0], 100, "Withdrawable shares should equal deposit shares after withdrawal");
+ }
+
+ function testFuzz_delegateSlashedStaker_dsfNonWad(uint24 _random) public rand(_random) {
+
+ //Additional deposit on beacon chain so dsf is nonwad
+ uint amount = 32 ether * _randUint({min: 1, max: 5});
+ cheats.deal(address(staker), amount);
+ (uint40[] memory validators,) = staker.startValidators();
+ beaconChain.advanceEpoch_NoWithdrawNoRewards();
+ staker.verifyWithdrawalCredentials(validators);
+
+ staker.startCheckpoint();
+ staker.completeCheckpoint();
+
+
+ uint256[] memory initDelegatableShares = _getWithdrawableShares(staker, strategies);
+ uint256[] memory initDepositShares = _getStakerDepositShares(staker, strategies);
+ // Delegate to an operator
+ staker.delegateTo(operator);
+ check_Delegation_State(staker, operator, strategies, initDepositShares);
+
+ uint256[] memory withdrawableSharesAfterDelegation = _getWithdrawableShares(staker, strategies);
+
+ // Create an operator set and register an operator.
+ operatorSet = avs.createOperatorSet(strategies);
+ operator.registerForOperatorSet(operatorSet);
+ check_Registration_State_NoAllocation(operator, operatorSet, strategies);
+
+ // Allocate to operator set
+ allocateParams = _genAllocation_AllAvailable(operator, operatorSet, strategies);
+ operator.modifyAllocations(allocateParams);
+ check_IncrAlloc_State_Slashable(operator, allocateParams);
+ _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
+
+ (uint256[] memory withdrawableSharesBefore, ) = delegationManager.getWithdrawableShares(address(staker), strategies);
+ // Undelegate from an operator
+ IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate();
+ bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
+ check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, initDepositShares, initDelegatableShares);
+
+ // Complete withdrawal as shares
+ // Fast forward to when we can complete the withdrawal
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint256 i = 0; i < withdrawals.length; ++i) {
+ staker.completeWithdrawalAsShares(withdrawals[i]);
+ check_Withdrawal_AsShares_Undelegated_State(staker, operator, withdrawals[i], withdrawals[i].strategies, initDelegatableShares);
+ }
+
+ (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) = delegationManager.getWithdrawableShares(address(staker), strategies);
+ assertEq(depositSharesAfter[0], initDelegatableShares[0], "Deposit shares should reset to reflect slash(es)");
+ assertApproxEqAbs(withdrawableSharesAfter[0], depositSharesAfter[0], 100, "Withdrawable shares should equal deposit shares after withdrawal");
+ }
+
+ // TODO: Fix this test
+ // function testFuzz_delegateSlashedStaker_slashedOperator(uint24 _random) public rand(_random) {
+
+
+ // (User staker2,,) = _newRandomStaker();
+ // (uint40[] memory validators2,) = staker2.startValidators();
+ // beaconChain.advanceEpoch_NoWithdrawNoRewards();
+ // staker2.verifyWithdrawalCredentials(validators2);
+ // staker2.startCheckpoint();
+ // staker2.completeCheckpoint();
+ // staker2.delegateTo(operator);
+
+ // //randomize additional deposit to eigenpod
+ // if(_randBool()){
+ // uint amount = 32 ether * _randUint({min: 1, max: 5});
+ // cheats.deal(address(staker), amount);
+ // (uint40[] memory validators,) = staker.startValidators();
+ // beaconChain.advanceEpoch_NoWithdrawNoRewards();
+ // staker.verifyWithdrawalCredentials(validators);
+
+ // staker.startCheckpoint();
+ // staker.completeCheckpoint();
+ // }
+
+ // // Create an operator set and register an operator.
+ // operatorSet = avs.createOperatorSet(strategies);
+ // operator.registerForOperatorSet(operatorSet);
+ // check_Registration_State_NoAllocation(operator, operatorSet, strategies);
+
+ // // Allocate to operator set
+ // allocateParams = _genAllocation_AllAvailable(operator, operatorSet, strategies);
+ // operator.modifyAllocations(allocateParams);
+ // check_IncrAlloc_State_Slashable(operator, allocateParams);
+ // _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
+
+ // //Slash operator before delegation
+ // IAllocationManagerTypes.SlashingParams memory slashingParams;
+ // uint wadToSlash = _randWadToSlash();
+ // slashingParams = avs.slashOperator(operator, operatorSet.id, strategies, wadToSlash.toArrayU256());
+ // assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
+
+ // uint256[] memory initDelegatableShares = _getWithdrawableShares(staker, strategies);
+ // uint256[] memory initDepositShares = _getStakerDepositShares(staker, strategies);
+
+ // // Delegate to an operator
+ // staker.delegateTo(operator);
+ // (uint256[] memory delegatedShares, ) = delegationManager.getWithdrawableShares(address(staker), strategies);
+ // check_Delegation_State(staker, operator, strategies, initDepositShares);
+
+ // // Undelegate from an operator
+ // IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.undelegate();
+ // bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
+ // check_Undelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, initDepositShares, delegatedShares);
+
+ // // Complete withdrawal as shares
+ // // Fast forward to when we can complete the withdrawal
+ // _rollBlocksForCompleteWithdrawals(withdrawals);
+ // for (uint256 i = 0; i < withdrawals.length; ++i) {
+ // staker.completeWithdrawalAsShares(withdrawals[i]);
+ // check_Withdrawal_AsShares_Undelegated_State(staker, operator, withdrawals[i], withdrawals[i].strategies, delegatedShares);
+ // }
+
+ // (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) = delegationManager.getWithdrawableShares(address(staker), strategies);
+ // assertEq(depositSharesAfter[0], delegatedShares[0], "Deposit shares should reset to reflect slash(es)");
+ // assertApproxEqAbs(withdrawableSharesAfter[0], depositSharesAfter[0], 100, "Withdrawable shares should equal deposit shares after withdrawal");
+ // }
+
+ function testFuzz_delegateSlashedStaker_redelegate_complete(uint24 _random) public rand(_random){
+
+ (User operator2, ,) = _newRandomOperator();
+
+ //Additional deposit on beacon chain so dsf is nonwad
+ uint amount = 32 ether * _randUint({min: 1, max: 5});
+ cheats.deal(address(staker), amount);
+ (uint40[] memory validators,) = staker.startValidators();
+ beaconChain.advanceEpoch_NoWithdrawNoRewards();
+ staker.verifyWithdrawalCredentials(validators);
+
+ staker.startCheckpoint();
+ staker.completeCheckpoint();
+
+
+ uint256[] memory initDepositShares = _getStakerDepositShares(staker, strategies);
+
+ // Delegate to an operator
+ staker.delegateTo(operator);
+ check_Delegation_State(staker, operator, strategies, initDepositShares);
+ (uint256[] memory delegatedShares, ) = delegationManager.getWithdrawableShares(address(staker), strategies);
+
+ // Create an operator set and register an operator.
+ operatorSet = avs.createOperatorSet(strategies);
+ operator.registerForOperatorSet(operatorSet);
+ check_Registration_State_NoAllocation(operator, operatorSet, strategies);
+
+ // Allocate to operator set
+ allocateParams = _genAllocation_AllAvailable(operator, operatorSet, strategies);
+ operator.modifyAllocations(allocateParams);
+ check_IncrAlloc_State_Slashable(operator, allocateParams);
+ _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
+
+ // Undelegate from an operator
+ IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.redelegate(operator2);
+ bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
+ check_Redelegate_State(staker, operator, withdrawals, withdrawalRoots, strategies, initDepositShares, delegatedShares);
+
+ // Complete withdrawal as shares
+ // Fast forward to when we can complete the withdrawal
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint256 i = 0; i < withdrawals.length; ++i) {
+ staker.completeWithdrawalAsShares(withdrawals[i]);
+ check_Withdrawal_AsShares_Redelegated_State(staker, operator, operator2, withdrawals[i], withdrawals[i].strategies, delegatedShares);
+ }
+
+ (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) = delegationManager.getWithdrawableShares(address(staker), strategies);
+ assertEq(depositSharesAfter[0], delegatedShares[0], "Deposit shares should reset to reflect slash(es)");
+ assertApproxEqAbs(withdrawableSharesAfter[0], depositSharesAfter[0], 100, "Withdrawable shares should equal deposit shares after withdrawal");
+ }
+
+
+ function testFuzz_delegateSlashedStaker_slashedOperator_withdrawAllShares_complete(uint24 _random) public rand(_random){
+ //Additional deposit on beacon chain so dsf is nonwad
+ uint amount = 32 ether * _randUint({min: 1, max: 5});
+ cheats.deal(address(staker), amount);
+ (uint40[] memory validators,) = staker.startValidators();
+ beaconChain.advanceEpoch_NoWithdrawNoRewards();
+ staker.verifyWithdrawalCredentials(validators);
+
+ staker.startCheckpoint();
+ staker.completeCheckpoint();
+
+ uint256[] memory initDepositShares = _getStakerDepositShares(staker, strategies);
+
+ // Create an operator set and register an operator.
+ operatorSet = avs.createOperatorSet(strategies);
+ operator.registerForOperatorSet(operatorSet);
+ check_Registration_State_NoAllocation(operator, operatorSet, strategies);
+
+ //Slash operator before delegation
+ IAllocationManagerTypes.SlashingParams memory slashingParams;
+ uint wadToSlash = _randWadToSlash();
+ slashingParams = avs.slashOperator(operator, operatorSet.id, strategies, wadToSlash.toArrayU256());
+ assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
+
+ // Delegate to an operator
+ staker.delegateTo(operator);
+ check_Delegation_State(staker, operator, strategies, initDepositShares);
+ (uint256[] memory delegatedShares, ) = delegationManager.getWithdrawableShares(address(staker), strategies);
+
+ // Allocate to operator set
+ allocateParams = _genAllocation_AllAvailable(operator, operatorSet, strategies);
+ operator.modifyAllocations(allocateParams);
+ check_IncrAlloc_State_Slashable(operator, allocateParams);
+ _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
+
+ //Withdraw all shares
+ IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, initDepositShares);
+ bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
+
+ // Complete withdrawal as shares
+ // Fast forward to when we can complete the withdrawal
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint256 i = 0; i < withdrawals.length; ++i) {
+ staker.completeWithdrawalAsShares(withdrawals[i]);
+ }
+
+ (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) = delegationManager.getWithdrawableShares(address(staker), strategies);
+ assertEq(depositSharesAfter[0], delegatedShares[0], "Deposit shares should reset to reflect slash(es)");
+ assertApproxEqAbs(withdrawableSharesAfter[0], depositSharesAfter[0], 100, "Withdrawable shares should equal deposit shares after withdrawal");
+ }
+
+}
\ No newline at end of file
diff --git a/src/test/integration/tests/SlashingWithdrawals.t.sol b/src/test/integration/tests/SlashingWithdrawals.t.sol
new file mode 100644
index 0000000000..e0349aefcb
--- /dev/null
+++ b/src/test/integration/tests/SlashingWithdrawals.t.sol
@@ -0,0 +1,344 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "src/test/integration/IntegrationChecks.t.sol";
+
+contract Integration_ALMSlashBase is IntegrationCheckUtils {
+
+ AVS avs;
+ OperatorSet operatorSet;
+
+ User operator;
+ AllocateParams allocateParams;
+
+ User staker;
+ IStrategy[] strategies;
+ uint[] initTokenBalances;
+ uint[] initDepositShares;
+
+ /// Shared setup:
+ ///
+ /// 1. Generate staker, operator, and AVS
+ /// 2. Staker deposits and delegates to operator
+ /// 3. AVS creates an operator set containing the strategies held by the staker
+ /// 4. Operator allocates to operator set
+ /// 5. Operator registers for operator set
+ /// NOTE: Steps 4 and 5 are done in random order, as these should not have an outcome on the test
+ function _init() internal virtual override {
+ _configAssetTypes(HOLDS_LST);
+ // (staker, strategies, initTokenBalances) = _newRandomStaker();
+ // operator = _newRandomOperator_NoAssets();
+ // (avs,) = _newRandomAVS();
+
+ (staker, strategies, initTokenBalances) = _newBasicStaker();
+ operator = _newRandomOperator_NoAssets();
+ (avs,) = _newRandomAVS();
+
+ // 1. Deposit Into Strategies
+ staker.depositIntoEigenlayer(strategies, initTokenBalances);
+ initDepositShares = _calculateExpectedShares(strategies, initTokenBalances);
+ check_Deposit_State(staker, strategies, initDepositShares);
+
+ // 2. Delegate to an operator
+ staker.delegateTo(operator);
+ check_Delegation_State(staker, operator, strategies, initDepositShares);
+
+ // 3. Create an operator set and register an operator.
+ operatorSet = avs.createOperatorSet(strategies);
+
+ // randomly choose between:
+ // register -> allocate / allocate -> register
+ if (_randBool()) {
+ // register -> allocate
+ operator.registerForOperatorSet(operatorSet);
+ check_Registration_State_NoAllocation(operator, operatorSet, allStrats);
+
+ allocateParams = _genAllocation_AllAvailable(operator, operatorSet);
+ operator.modifyAllocations(allocateParams);
+ check_IncrAlloc_State_Slashable(operator, allocateParams);
+ } else {
+ // allocate -> register
+ allocateParams = _genAllocation_AllAvailable(operator, operatorSet);
+ operator.modifyAllocations(allocateParams);
+ check_IncrAlloc_State_NotSlashable(operator, allocateParams);
+
+ operator.registerForOperatorSet(operatorSet);
+ check_Registration_State_PendingAllocation(operator, allocateParams);
+ }
+
+ _rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
+ }
+}
+
+contract Integration_InitSlash is Integration_ALMSlashBase {
+
+ SlashingParams slashParams;
+
+ function testFuzz_slashSingle(uint24 _r) public rand(_r) {
+ slashParams = _genSlashing_Rand(operator, operatorSet);
+ avs.slashOperator(slashParams);
+ check_Base_Slashing_State(operator, allocateParams, slashParams);
+ }
+
+ function testFuzz_slashMulti_WithdrawTokens(uint24 _r) public rand(_r) {
+ for (uint i = 0; i < 25; i++) {
+ slashParams = _genSlashing_Rand(operator, operatorSet);
+ avs.slashOperator(slashParams);
+ check_Base_Slashing_State(operator, allocateParams, slashParams);
+ }
+
+ // undelegate
+ uint[] memory shares = _getStakerWithdrawableShares(staker, strategies);
+ Withdrawal[] memory withdrawals = staker.undelegate();
+ bytes32[] memory roots = _getWithdrawalHashes(withdrawals);
+ check_Undelegate_State(staker, operator, withdrawals, roots, strategies, initDepositShares, shares);
+
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+
+ // try withdrawing as tokens:
+ IERC20[] memory tokens = _getUnderlyingTokens(strategies);
+ uint[] memory expectedTokens = _calculateExpectedTokens(strategies, shares);
+
+ staker.completeWithdrawalsAsTokens(withdrawals);
+ for (uint i = 0; i < withdrawals.length; i++) {
+ check_Withdrawal_AsTokens_State(staker, operator, withdrawals[i], strategies, shares, tokens, expectedTokens);
+ }
+ }
+
+ function testFuzz_slashMulti_WithdrawShares(uint24 _r) public rand(_r) {
+ for (uint i = 0; i < 25; i++) {
+ slashParams = _genSlashing_Rand(operator, operatorSet);
+ avs.slashOperator(slashParams);
+ check_Base_Slashing_State(operator, allocateParams, slashParams);
+ }
+
+ // undelegate
+ uint[] memory shares = _getStakerWithdrawableShares(staker, strategies);
+ Withdrawal[] memory withdrawals = staker.undelegate();
+ bytes32[] memory roots = _getWithdrawalHashes(withdrawals);
+ check_Undelegate_State(staker, operator, withdrawals, roots, strategies, initDepositShares, shares);
+
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+
+ // try withdrawing as shares
+ staker.completeWithdrawalsAsShares(withdrawals);
+ for (uint i = 0; i < withdrawals.length; i++) {
+ check_Withdrawal_AsShares_Undelegated_State(staker, operator, withdrawals[i], strategies, shares);
+ }
+ }
+}
+
+contract Integration_SlashingWithdrawals is Integration_ALMSlashBase {
+
+ function testFuzz_slash_undelegate_completeAsTokens(
+ uint24 _random
+ ) public rand(_random) {
+ // 4. Slash operator
+ SlashingParams memory slashingParams;
+ {
+ (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) =
+ _randStrategiesAndWadsToSlash(operatorSet);
+ slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash);
+ assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing");
+ assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed");
+ }
+
+ // 5. Undelegate from an operator
+ Withdrawal[] memory withdrawals = staker.undelegate();
+ bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
+
+ // 6. Complete withdrawal
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint256 i = 0; i < withdrawals.length; ++i) {
+ uint256[] memory expectedTokens =
+ _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares);
+ staker.completeWithdrawalAsTokens(withdrawals[i]);
+ check_Withdrawal_AsTokens_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams, expectedTokens);
+ }
+
+ // Check Final State
+ assert_HasNoDelegatableShares(staker, "staker should have withdrawn all shares");
+ assert_HasUnderlyingTokenBalances_AfterSlash(
+ staker,
+ allocateParams,
+ slashingParams,
+ initTokenBalances,
+ "staker should once again have original token initTokenBalances minus slashed"
+ );
+ assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
+ }
+
+ function testFuzz_slash_undelegate_completeAsShares(
+ uint24 _random
+ ) public rand(_random) {
+ // 4. Slash operator
+ SlashingParams memory slashingParams;
+ {
+ (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) =
+ _randStrategiesAndWadsToSlash(operatorSet);
+ slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash);
+ assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing");
+ assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed");
+ }
+
+ // 5. Undelegate from an operator
+ Withdrawal[] memory withdrawals = staker.undelegate();
+ bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
+
+ // 4. Complete withdrawal
+ // Fast forward to when we can complete the withdrawal
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+
+ for (uint256 i = 0; i < withdrawals.length; ++i) {
+ staker.completeWithdrawalAsShares(withdrawals[i]);
+ check_Withdrawal_AsShares_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams);
+ }
+
+ // Check final state:
+ assert_HasNoUnderlyingTokenBalance(staker, strategies, "staker not have any underlying tokens");
+ assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
+ }
+
+ function testFuzz_queue_slash_completeAsTokens(
+ uint24 _random
+ ) public rand(_random) {
+ // 4. Queue withdrawal
+ Withdrawal[] memory withdrawals =
+ staker.queueWithdrawals(strategies, _calculateExpectedShares(strategies, initTokenBalances));
+ bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
+
+ // 5. Slash operator
+ SlashingParams memory slashingParams;
+ {
+ (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) =
+ _randStrategiesAndWadsToSlash(operatorSet);
+ slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash);
+ assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing");
+ assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed");
+ }
+
+ // 6. Complete withdrawal
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint256 i = 0; i < withdrawals.length; ++i) {
+ uint256[] memory expectedTokens =
+ _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares);
+ staker.completeWithdrawalAsTokens(withdrawals[i]);
+ check_Withdrawal_AsTokens_State_AfterSlash(
+ staker, operator, withdrawals[i], allocateParams, slashingParams, expectedTokens
+ );
+ }
+
+ // Check Final State
+ assert_HasNoDelegatableShares(staker, "staker should have withdrawn all shares");
+ assert_HasUnderlyingTokenBalances_AfterSlash(
+ staker,
+ allocateParams,
+ slashingParams,
+ initTokenBalances,
+ "staker should once again have original token initTokenBalances minus slashed"
+ );
+ assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
+ }
+
+ function testFuzz_queue_slash_completeAsShares(
+ uint24 _random
+ ) public rand(_random) {
+ // 4. Queue withdrawal
+ Withdrawal[] memory withdrawals =
+ staker.queueWithdrawals(strategies, _calculateExpectedShares(strategies, initTokenBalances));
+ bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
+
+ // 5. Slash operator
+ SlashingParams memory slashingParams;
+ {
+ (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) =
+ _randStrategiesAndWadsToSlash(operatorSet);
+ slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash);
+ assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing");
+ assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed");
+ }
+
+ // 4. Complete withdrawal
+ // Fast forward to when we can complete the withdrawal
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+
+ for (uint256 i = 0; i < withdrawals.length; ++i) {
+ staker.completeWithdrawalAsShares(withdrawals[i]);
+ check_Withdrawal_AsShares_State_AfterSlash(staker, operator, withdrawals[i], allocateParams, slashingParams);
+ }
+
+ // Check final state:
+ assert_HasNoUnderlyingTokenBalance(staker, strategies, "staker not have any underlying tokens");
+ assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
+ }
+
+ function testFuzz_deallocate_slash_queue_completeAsTokens(
+ uint24 _random
+ ) public rand(_random) {
+ // 4. Deallocate all.
+ AllocateParams memory deallocateParams = _genDeallocation_Full(operator, operatorSet);
+ operator.modifyAllocations(deallocateParams);
+ check_DecrAlloc_State_Slashable(operator, deallocateParams);
+
+ _rollForward_DeallocationDelay();
+
+ // 5. Slash operator
+ SlashingParams memory slashingParams;
+ {
+ (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) =
+ _randStrategiesAndWadsToSlash(operatorSet);
+ slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash);
+ assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing");
+ assert_Snap_StakerWithdrawableShares_AfterSlash(staker, deallocateParams, slashingParams, "staker deposit shares should be slashed");
+ }
+
+ // 6. Queue withdrawals
+ Withdrawal[] memory withdrawals =
+ staker.queueWithdrawals(strategies, _calculateExpectedShares(strategies, initTokenBalances));
+ bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
+
+ // 7. Complete withdrawal
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint256 i = 0; i < withdrawals.length; ++i) {
+ uint256[] memory expectedTokens =
+ _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares);
+ staker.completeWithdrawalAsTokens(withdrawals[i]);
+ check_Withdrawal_AsTokens_State_AfterSlash(
+ staker, operator, withdrawals[i], allocateParams, slashingParams, expectedTokens
+ );
+ }
+
+ // Check Final State
+ assert_HasUnderlyingTokenBalances(
+ staker,
+ allocateParams.strategies,
+ initTokenBalances,
+ "staker should have withdrawn all shares"
+ );
+ assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
+ }
+
+ function testFuzz_deregister_slash(
+ uint24 _random
+ ) public rand(_random) {
+ // 4. Deregister.
+ operator.deregisterFromOperatorSet(operatorSet);
+ check_Deregistration_State_PendingAllocation(operator, operatorSet);
+
+ // 5. Slash operator
+ SlashingParams memory slashingParams;
+ {
+ (IStrategy[] memory strategiesToSlash, uint256[] memory wadsToSlash) =
+ _randStrategiesAndWadsToSlash(operatorSet);
+ slashingParams = avs.slashOperator(operator, operatorSet.id, strategiesToSlash, wadsToSlash);
+ assert_Snap_Allocations_Slashed(slashingParams, operatorSet, true, "operator allocations should be slashed");
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing");
+ assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashingParams, "staker deposit shares should be slashed");
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol
index 2c425d3a5d..e72a39a0cb 100644
--- a/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol
+++ b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol
@@ -6,19 +6,14 @@ import "src/test/integration/users/User.t.sol";
contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
- modifier r(uint24 _rand) {
- _configRand({
- _randomSeed: _rand,
- _assetTypes: HOLDS_ETH,
- _userTypes: DEFAULT
- });
-
- _;
+ function _init() internal override {
+ _configAssetTypes(HOLDS_ETH);
+ _configUserTypes(DEFAULT);
}
- function test_GasMetering() public r(0) {
+ function test_GasMetering() public rand(0) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
+
// Deal user 20 full stakers worth of ETH
emit log_named_string("Dealing 20 * 32 ETH to", staker.NAME());
cheats.deal(address(staker), 32 ether * 20);
@@ -81,9 +76,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 2. start a checkpoint
/// 3. complete a checkpoint
/// => no change in shares between 1 and 3
- function test_VerifyWC_StartCP_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
@@ -101,9 +95,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 1. Verify validators' withdrawal credentials
/// 2. Verify validators' withdrawal credentials again
/// => This should fail
- function test_VerifyWC_VerifyWC_Fails(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_VerifyWC_Fails(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
@@ -119,9 +112,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 2. start a checkpoint
/// 3. start a checkpoint again
/// => This should fail
- function test_VerifyWC_StartCP_StartCP_Fails(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_StartCP_StartCP_Fails(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
@@ -141,9 +133,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 3. complete a checkpoint
/// 4. start a checkpoint without advancing a block
/// => this should fail
- function test_VerifyWC_StartCP_CompleteCP_StartCP_Fails(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_StartCP_CompleteCP_StartCP_Fails(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
@@ -166,9 +157,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 2. start a checkpoint
/// 3. complete a checkpoint
/// => no change in shares between 1 and 3
- function test_VerifyWC_Advance_StartCP_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_Advance_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
@@ -191,9 +181,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// -- move forward 1 or more epochs
/// 3. complete a checkpoint
/// => no change in shares between 1 and 3
- function test_VerifyWC_StartCP_Advance_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_StartCP_Advance_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
@@ -219,9 +208,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// -- Fully exit validators before verifying withdrawal credentials
/// 1. Verify validators' withdrawal credentials
/// => This should fail
- function test_ExitValidators_VerifyWC_Fails(uint24 _rand) public r(_rand) {
+ function test_ExitValidators_VerifyWC_Fails(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, ) = staker.startValidators();
staker.exitValidators(validators);
@@ -236,9 +224,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 2. start a checkpoint
/// 3. complete a checkpoint
/// => no change in shares between 1 and 3
- function test_VerifyWC_ExitValidators_StartCP_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_ExitValidators_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
@@ -267,9 +254,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 4. start a checkpoint
/// 5. complete a checkpoint
/// => exited balance should be reflected in 4 and 5
- function test_VerifyWC_StartCP_ExitValidators_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_StartCP_ExitValidators_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
@@ -303,9 +289,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// -- get slashed on beacon chain
/// 1. Try to verify validators' withdrawal credentials
/// => this should fail
- function test_SlashToPod_VerifyWC_Fails(uint24 _rand) public r(_rand) {
+ function test_SlashToPod_VerifyWC_Fails(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, ) = staker.startValidators();
beaconChain.slashValidators(validators);
@@ -321,9 +306,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 2. start a checkpoint
/// 3. complete a checkpoint
/// => after 3, shares should decrease by slashed amount
- function test_VerifyWC_SlashToPod_StartCP_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_SlashToPod_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
// Advance epoch without generating rewards
@@ -351,9 +335,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 4. start a checkpoint
/// 5. complete a checkpoint
/// => slashed balance should be reflected in 4 and 5
- function test_VerifyWC_StartCP_SlashToPod_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_StartCP_SlashToPod_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
// Advance epoch without generating rewards
@@ -384,9 +367,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 4. verify withdrawal credentials for another validator while checkpoint in progress
/// 5. complete a checkpoint
/// => Increase in shares between 1 and 4 should reflect the new validator, less the slashed amount
- function test_VerifyWC_Slash_StartCP_VerifyWC_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_Slash_StartCP_VerifyWC_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
@@ -422,9 +404,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 2. start a checkpoint
/// 3. complete a checkpoint
/// => after 3, shares should decrease by slashed amount
- function test_VerifyWC_SlashToPod_VerifyStale_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_SlashToPod_VerifyStale_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
// Advance epoch without generating rewards
@@ -448,9 +429,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 2. start a checkpoint
/// 3. complete a checkpoint
/// => after 3, shares should decrease by slashed amount
- function test_VerifyWC_SlashToCL_VerifyStale_CompleteCP_SlashAgain(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_SlashToCL_VerifyStale_CompleteCP_SlashAgain(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
// Advance epoch without generating rewards
@@ -489,9 +469,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 4. start a checkpoint
/// 5. complete a checkpoint
/// => slashed balance should be reflected in 4 and 5
- function test_VerifyWC_StartCP_SlashToPod_CompleteCP_VerifyStale(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_StartCP_SlashToPod_CompleteCP_VerifyStale(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
// Advance epoch without generating rewards
@@ -526,9 +505,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 2. start a checkpoint
/// 3. complete a checkpoint
/// => after 3, shares increase by rewards earned on beacon chain
- function test_EarnOnBeacon_VerifyWC_StartCP_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_EarnOnBeacon_VerifyWC_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
// Advance epoch and generate consensus rewards, but don't withdraw to pod
@@ -550,9 +528,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 2. start a checkpoint
/// 3. complete a checkpoint
/// => after 3, shares increase by rewards earned on beacon chain
- function test_VerifyWC_EarnOnBeacon_StartCP_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_EarnOnBeacon_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
@@ -576,9 +553,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// -- earn rewards on beacon chain (not withdrawn to pod)
/// 3. complete a checkpoint
/// => no change in shares between 1 and 3
- function test_VerifyWC_StartCP_EarnOnBeacon_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_StartCP_EarnOnBeacon_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
@@ -606,9 +582,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 2. start a checkpoint
/// 3. complete a checkpoint
/// => after 3, shares increase by rewards withdrawn to pod
- function test_EarnToPod_VerifyWC_StartCP_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_EarnToPod_VerifyWC_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
// Advance epoch, generating consensus rewards and withdrawing anything over 32 ETH
@@ -630,9 +605,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 2. start a checkpoint
/// 3. complete a checkpoint
/// => after 3, shares increase by rewards withdrawn to pod
- function test_VerifyWC_EarnToPod_StartCP_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_EarnToPod_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
@@ -656,9 +630,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// -- earn rewards on beacon chain (withdrawn to pod)
/// 3. complete a checkpoint
/// => no change in shares between 1 and 3
- function test_VerifyWC_StartCP_EarnToPod_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_StartCP_EarnToPod_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
@@ -689,9 +662,9 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// -- Pod receives native ETH via fallback
/// 1. start a checkpoint
/// => checkpoint should auto-complete, awarding shares for ETH in pod
- function test_NativeETH_StartCP(uint24 _rand) public r(_rand) {
+ function test_NativeETH_StartCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
+
// Send a random amount of ETH to staker's fallback
(uint64 gweiSent, ) = _sendRandomETH(address(staker.pod()));
@@ -708,9 +681,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 2. start a checkpoint
/// 3. complete a checkpoint
/// => after 3, shares should account for native ETH
- function test_NativeETH_VerifyWC_StartCP_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_NativeETH_VerifyWC_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
@@ -736,9 +708,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// 2. start a checkpoint
/// 3. complete a checkpoint
/// => after 3, shares should account for native ETH
- function test_VerifyWC_NativeETH_StartCP_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_NativeETH_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
@@ -764,9 +735,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
/// -- Pod receives native ETH via fallback
/// 3. complete a checkpoint
/// => no change in shares between 1 and 3
- function test_VerifyWC_StartCP_NativeETH_CompleteCP(uint24 _rand) public r(_rand) {
+ function test_VerifyWC_StartCP_NativeETH_CompleteCP(uint24 _rand) public rand(_rand) {
(User staker, ,) = _newRandomStaker();
- _upgradeEigenLayerContracts();
(uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators();
beaconChain.advanceEpoch_NoRewards();
diff --git a/src/test/integration/tests/upgrade/Complete_PreSlashing_Withdrawal.t.sol b/src/test/integration/tests/upgrade/Complete_PreSlashing_Withdrawal.t.sol
new file mode 100644
index 0000000000..17d839632a
--- /dev/null
+++ b/src/test/integration/tests/upgrade/Complete_PreSlashing_Withdrawal.t.sol
@@ -0,0 +1,107 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "src/test/integration/UpgradeTest.t.sol";
+
+contract Integration_Upgrade_Complete_PreSlashing_Withdrawal is UpgradeTest {
+
+ function testFuzz_deposit_queue_upgrade_completeAsShares(uint24 _random) public rand(_random) {
+ /// Pre-upgrade:
+ /// 1. Create staker with some assets
+ /// 2. Staker deposits into EigenLayer
+ /// 3. Staker queues a withdrawal
+ (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
+ User operator = User(payable(0));
+
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+ uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+
+ /// Upgrade to slashing contracts
+ _upgradeEigenLayerContracts();
+
+ // Complete pre-slashing withdrawals as shares
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint i = 0; i < withdrawals.length; i++) {
+ staker.completeWithdrawalAsShares(withdrawals[i]);
+ check_Withdrawal_AsShares_State(staker, operator, withdrawals[i], strategies, shares);
+ }
+ }
+
+ function testFuzz_delegate_deposit_queue_upgrade_completeAsShares(uint24 _random) public rand(_random) {
+ /// Pre-upgrade:
+ /// 1. Create staker and operator with some asset amounts
+ /// 2. Staker delegates to operator
+ /// 3. Staker deposits into EigenLayer
+ /// 4. Staker queues a withdrawal
+ (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
+ (User operator, ,) = _newRandomOperator();
+
+ staker.delegateTo(operator);
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+ uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+
+ /// Upgrade to slashing contracts
+ _upgradeEigenLayerContracts();
+
+ // Complete pre-slashing withdrawals as shares
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint i = 0; i < withdrawals.length; i++) {
+ staker.completeWithdrawalAsShares(withdrawals[i]);
+ check_Withdrawal_AsShares_State(staker, operator, withdrawals[i], strategies, shares);
+ }
+ }
+
+ function testFuzz_deposit_queue_upgrade_completeAsTokens(uint24 _random) public rand(_random) {
+ /// Pre-upgrade:
+ /// 1. Create staker with some assets
+ /// 2. Staker deposits into EigenLayer
+ /// 3. Staker queues a withdrawal
+ (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
+ User operator = User(payable(0));
+
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+ uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ uint[] memory expectedTokens = _calculateExpectedTokens(strategies, shares);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+
+ /// Upgrade to slashing contracts
+ _upgradeEigenLayerContracts();
+
+ // Complete pre-slashing withdrawals as tokens
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint i = 0; i < withdrawals.length; i++) {
+ IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[i]);
+ check_Withdrawal_AsTokens_State(staker, operator, withdrawals[i], strategies, shares, tokens, expectedTokens);
+ }
+ }
+
+ function testFuzz_delegate_deposit_queue_upgrade_completeAsTokens(uint24 _random) public rand(_random) {
+ /// Pre-upgrade:
+ /// 1. Create staker and operator with some asset amounts
+ /// 2. Staker delegates to operator
+ /// 3. Staker deposits into EigenLayer
+ /// 4. Staker queues a withdrawal
+ (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
+ (User operator, ,) = _newRandomOperator();
+
+ staker.delegateTo(operator);
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+ uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ uint[] memory expectedTokens = _calculateExpectedTokens(strategies, shares);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+
+ /// Upgrade to slashing contracts
+ _upgradeEigenLayerContracts();
+
+ // Complete pre-slashing withdrawals as tokens
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint i = 0; i < withdrawals.length; i++) {
+ IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[i]);
+ check_Withdrawal_AsTokens_State(staker, operator, withdrawals[i], strategies, shares, tokens, expectedTokens);
+ }
+ }
+
+ /// TODO - complete pre-upgrade withdrawal after earliest possible operator slashing
+}
diff --git a/src/test/integration/tests/upgrade/Delegate_Upgrade_Allocate.t.sol b/src/test/integration/tests/upgrade/Delegate_Upgrade_Allocate.t.sol
new file mode 100644
index 0000000000..8d878beec9
--- /dev/null
+++ b/src/test/integration/tests/upgrade/Delegate_Upgrade_Allocate.t.sol
@@ -0,0 +1,40 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "src/test/integration/UpgradeTest.t.sol";
+
+contract Integration_Upgrade_Deposit_Delegate_Allocate is UpgradeTest {
+
+ function testFuzz_deposit_delegate_upgrade_allocate(uint24 _random) public rand(_random) {
+ (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker();
+ (User operator,,) = _newRandomOperator();
+
+ // Pre-upgrade:
+ // 1. Create staker and operator with assets, then deposit into EigenLayer
+ // 2. Delegate to operator
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+ staker.delegateTo(operator);
+
+ // Upgrade to slashing release
+ _upgradeEigenLayerContracts();
+ (AVS avs,) = _newRandomAVS();
+
+ // 3. Set allocation delay for operator
+ operator.setAllocationDelay(1);
+ rollForward({blocks: ALLOCATION_CONFIGURATION_DELAY + 1});
+
+ // 4. Create an operator set and register an operator.
+ OperatorSet memory operatorSet = avs.createOperatorSet(strategies);
+ operator.registerForOperatorSet(operatorSet);
+ check_Registration_State_NoAllocation(operator, operatorSet, allStrats);
+
+ // 5. Allocate to operator set.
+ AllocateParams memory allocateParams = AllocateParams({
+ operatorSet: operatorSet,
+ strategies: strategies,
+ newMagnitudes: _randMagnitudes({sum: 1 ether, len: strategies.length})
+ });
+ operator.modifyAllocations(allocateParams);
+ check_IncrAlloc_State_Slashable(operator, allocateParams);
+ }
+}
\ No newline at end of file
diff --git a/src/test/integration/tests/upgrade/EigenPod_Negative_Shares.t.sol b/src/test/integration/tests/upgrade/EigenPod_Negative_Shares.t.sol
new file mode 100644
index 0000000000..0897123c93
--- /dev/null
+++ b/src/test/integration/tests/upgrade/EigenPod_Negative_Shares.t.sol
@@ -0,0 +1,133 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "src/test/integration/UpgradeTest.t.sol";
+
+contract Integration_Upgrade_EigenPod_Negative_Shares is UpgradeTest {
+ function _init() internal override {
+ _configAssetTypes(HOLDS_ETH);
+ _configUserTypes(DEFAULT);
+ }
+
+ function testFuzz_deposit_delegate_updateBalance_upgrade_completeAsShares(
+ uint24 _rand
+ ) public rand(_rand) {
+ /// 0. Create an operator and staker with some underlying assets
+ (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker();
+ (User operator,,) = _newRandomOperator();
+ uint256[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+
+ /// 1. Deposit into strategies
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+
+ /// 2. Delegate to operator
+ staker.delegateTo(operator);
+
+ /// 3. Queue a withdrawal for all shares
+ IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+ IDelegationManagerTypes.Withdrawal memory withdrawal = withdrawals[0];
+
+ /// 4. Update balance randomly (can be positive or negative)
+ (int256[] memory tokenDeltas, int256[] memory balanceUpdateShareDelta,) = _randBalanceUpdate(staker, strategies);
+ staker.updateBalances(strategies, tokenDeltas);
+
+ /// 5. Upgrade contracts
+ _upgradeEigenLayerContracts();
+
+ /// 6. Complete the withdrawal as shares
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ staker.completeWithdrawalAsShares(withdrawal);
+
+ // Manually complete checks since we could still negative shares prior to the upgrade, causing a revert in the share check
+ (uint256[] memory expectedOperatorShareDelta, int256[] memory expectedStakerShareDelta) =
+ _getPostWithdrawalExpectedShareDeltas(balanceUpdateShareDelta[0], withdrawal);
+ assert_WithdrawalNotPending(delegationManager.calculateWithdrawalRoot(withdrawal), "staker withdrawal should no longer be pending");
+ assert_Snap_Unchanged_TokenBalances(staker, "staker should not have any change in underlying token balances");
+ assert_Snap_Added_OperatorShares(operator, withdrawal.strategies, expectedOperatorShareDelta, "operator should have received shares");
+ assert_Snap_Delta_StakerShares(staker, strategies, expectedStakerShareDelta, "staker should have received expected shares");
+ }
+
+ function testFuzz_deposit_delegate_updateBalance_upgrade_completeAsTokens(
+ uint24 _rand
+ ) public rand(_rand) {
+ /// 0. Create an operator and staker with some underlying assets
+ (User staker, IStrategy[] memory strategies, uint256[] memory tokenBalances) = _newRandomStaker();
+ (User operator,,) = _newRandomOperator();
+ uint256[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+
+ /// 1. Deposit into strategies
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+
+ /// 2. Delegate to operator
+ staker.delegateTo(operator);
+
+ /// 3. Queue a withdrawal for all shares
+ IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+ IDelegationManagerTypes.Withdrawal memory withdrawal = withdrawals[0];
+
+ /// 4. Update balance randomly (can be positive or negative)
+ (int256[] memory tokenDeltas, int256[] memory balanceUpdateShareDelta,) = _randBalanceUpdate(staker, strategies);
+ staker.updateBalances(strategies, tokenDeltas);
+
+ /// 5. Upgrade contracts
+ _upgradeEigenLayerContracts();
+
+ /// 6. Complete the withdrawal as shares
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawal);
+ uint256[] memory expectedTokens = _getPostWithdrawalExpectedTokenDeltas(balanceUpdateShareDelta[0], withdrawal);
+
+ // Manually complete checks since we could still negative shares prior to the upgrade, causing a revert in the share check
+ assert_WithdrawalNotPending(delegationManager.calculateWithdrawalRoot(withdrawal), "staker withdrawal should no longer be pending");
+ assert_Snap_Added_TokenBalances(staker, tokens, expectedTokens, "staker should have received expected tokens");
+ assert_Snap_Unchanged_OperatorShares(operator, "operator shares should not have changed");
+
+ // If we had a positive balance update, then the staker shares should not have changed
+ if (balanceUpdateShareDelta[0] > 0) {
+ assert_Snap_Unchanged_Staker_DepositShares(staker, "staker shares should not have changed");
+ }
+ // Else, the staker shares should have increased by the magnitude of the negative share delta
+ else {
+ int256[] memory expectedStakerShareDelta = new int256[](1);
+ expectedStakerShareDelta[0] = -balanceUpdateShareDelta[0];
+ assert_Snap_Delta_StakerShares(staker, strategies, expectedStakerShareDelta, "staker should have received expected shares");
+ }
+ }
+
+
+
+ function _getPostWithdrawalExpectedShareDeltas(
+ int256 balanceUpdateShareDelta,
+ IDelegationManagerTypes.Withdrawal memory withdrawal
+ ) internal pure returns (uint256[] memory, int256[] memory) {
+ uint256[] memory operatorShareDelta = new uint256[](1);
+ int256[] memory stakerShareDelta = new int256[](1);
+ // The staker share delta is the withdrawal scaled shares since it can go from negative to positive
+ stakerShareDelta[0] = int256(withdrawal.scaledShares[0]);
+
+ if (balanceUpdateShareDelta > 0) {
+ // If balanceUpdateShareDelta is positive, then the operator delta is the withdrawal scaled shares
+ operatorShareDelta[0] = withdrawal.scaledShares[0];
+ } else {
+ // Operator shares never went negative, so we can just add the withdrawal scaled shares and the negative share delta
+ operatorShareDelta[0] = uint256(int256(withdrawal.scaledShares[0]) + balanceUpdateShareDelta);
+ }
+
+ return (operatorShareDelta, stakerShareDelta);
+ }
+
+ function _getPostWithdrawalExpectedTokenDeltas(
+ int256 balanceUpdateShareDelta,
+ IDelegationManagerTypes.Withdrawal memory withdrawal
+ ) internal pure returns (uint256[] memory) {
+ uint256[] memory expectedTokenDeltas = new uint256[](1);
+ if (balanceUpdateShareDelta > 0) {
+ // If we had a positive balance update, then the expected token delta is the withdrawal scaled shares
+ expectedTokenDeltas[0] = withdrawal.scaledShares[0];
+ } else {
+ // If we had a negative balance update, then the expected token delta is the withdrawal scaled shares plus the negative share delta
+ expectedTokenDeltas[0] = uint256(int256(withdrawal.scaledShares[0]) + balanceUpdateShareDelta);
+ }
+ return expectedTokenDeltas;
+ }
+}
diff --git a/src/test/integration/tests/eigenpod/EigenPod_Slashing_Migration.t.sol b/src/test/integration/tests/upgrade/EigenPod_Slashing_Migration.t.sol
similarity index 73%
rename from src/test/integration/tests/eigenpod/EigenPod_Slashing_Migration.t.sol
rename to src/test/integration/tests/upgrade/EigenPod_Slashing_Migration.t.sol
index 79a29826ca..f7ed80228e 100644
--- a/src/test/integration/tests/eigenpod/EigenPod_Slashing_Migration.t.sol
+++ b/src/test/integration/tests/upgrade/EigenPod_Slashing_Migration.t.sol
@@ -1,18 +1,13 @@
// 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 "src/test/integration/UpgradeTest.t.sol";
-contract Integration_EigenPod_Slashing_Migration is IntegrationCheckUtils, EigenPodPausingConstants {
- modifier r(uint24 _rand) {
- _configRand({
- _randomSeed: _rand,
- _assetTypes: HOLDS_ETH,
- _userTypes: DEFAULT
- });
-
- _;
+contract Integration_Upgrade_EigenPod_Slashing_Migration is UpgradeTest, EigenPodPausingConstants {
+
+ function _init() internal override {
+ _configAssetTypes(HOLDS_ETH);
+ _configUserTypes(DEFAULT);
}
/**
@@ -24,12 +19,7 @@ contract Integration_EigenPod_Slashing_Migration is IntegrationCheckUtils, Eigen
* 5. Upgrade EigenPod contracts
* 6. Exit subset of Validators
*/
- function test_upgrade_eigenpod_migration(uint24 _rand) public r(_rand) {
- // Only run this test as a fork test
- if (forkType == LOCAL) {
- return;
- }
-
+ function test_upgrade_eigenpod_migration(uint24 _rand) public rand(_rand) {
// Initialize state
(User staker, ,) = _newRandomStaker();
@@ -41,7 +31,6 @@ contract Integration_EigenPod_Slashing_Migration is IntegrationCheckUtils, Eigen
// Advance epoch, generating consensus rewards and withdrawing anything over 32 ETH
beaconChain.advanceEpoch();
- uint64 expectedWithdrawnGwei = uint64(validators.length) * beaconChain.CONSENSUS_REWARD_AMOUNT_GWEI();
// 2. Start a checkpoint
staker.startCheckpoint();
@@ -49,17 +38,19 @@ contract Integration_EigenPod_Slashing_Migration is IntegrationCheckUtils, Eigen
// 3. Pause checkpoint starting
cheats.prank(pauserMultisig);
eigenPodManager.pause(2 ** PAUSED_START_CHECKPOINT);
-
cheats.expectRevert("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager");
staker.startCheckpoint();
// 4. Complete in progress checkpoint
staker.completeCheckpoint();
- check_CompleteCheckpoint_WithPodBalance_State(staker, expectedWithdrawnGwei);
// 5. Upgrade Contracts for slashing
_upgradeEigenLayerContracts();
+ // Unpause EigenPodManager
+ cheats.prank(eigenLayerPauserReg.unpauser());
+ eigenPodManager.unpause(0);
+
// 6. Exit validators
// Fully exit one or more validators and advance epoch without generating rewards
uint40[] memory subset = _choose(validators);
diff --git a/src/test/integration/tests/upgrade/README.md b/src/test/integration/tests/upgrade/README.md
new file mode 100644
index 0000000000..c9844a3143
--- /dev/null
+++ b/src/test/integration/tests/upgrade/README.md
@@ -0,0 +1,45 @@
+## Upgrade Tests
+
+This folder contains specific tests we want to conduct to determine upgrade compatibility. Tests in this folder are only run if the `forktest` profile is selected, e.g:
+
+`env FOUNDRY_PROFILE=forktest forge t --mc Upgrade`
+
+#### How to Write
+
+Upgrade tests inherit from the `UpgradeTest` mixin, which imports everything you need for a standard integration test. A standard integration test automatically upgrades all contracts to the latest repo contracts, even when forking from mainnet.
+
+In contrast, the `UpgradeTest` mixin ensures that (when a test begins) the contracts we're working with are _not upgraded_. This allows the test writer to perform some initial setup actions before calling `_upgradeEigenLayerContracts()`, after which we can check that the upgrade correctly handles pre-upgrade state.
+
+#### Example
+
+Say we want to check that withdrawals initiated before the slashing upgrade are completable after the slashing upgrade. This example test shows how:
+
+```solidity
+contract Integration_Upgrade_Complete_PreSlashing_Withdrawal is UpgradeTest {
+
+ function testFuzz_deposit_queue_upgrade_completeAsShares(uint24 _random) public rand(_random) {
+ /// Pre-upgrade:
+ /// 1. Create staker with some assets
+ /// 2. Staker deposits into EigenLayer
+ /// 3. Staker queues a withdrawal
+ (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
+ User operator = User(payable(0));
+
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+ uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+
+ /// Upgrade to slashing contracts
+ _upgradeEigenLayerContracts();
+
+ // Complete pre-slashing withdrawals as shares
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint i = 0; i < withdrawals.length; i++) {
+ staker.completeWithdrawalAsShares(withdrawals[i]);
+ check_Withdrawal_AsShares_State(staker, operator, withdrawals[i], strategies, shares);
+ }
+ }
+}
+```
+
+**Note** how the initial staker actions are NOT followed by `check_X_State` methods. This is because, before calling `_upgradeEigenLayerContracts`, the test is being run on old contracts. Adding invariant checks to old state transitions is not the point of this test and would add a lot of maintenance overhead.
\ No newline at end of file
diff --git a/src/test/integration/users/AVS.t.sol b/src/test/integration/users/AVS.t.sol
index 2ef36433b5..b4899d65e5 100644
--- a/src/test/integration/users/AVS.t.sol
+++ b/src/test/integration/users/AVS.t.sol
@@ -71,6 +71,18 @@ contract AVS is Logger, IAllocationManagerTypes, IAVSRegistrar {
/// AllocationManager
/// -----------------------------------------------------------------------
+ function updateAVSMetadataURI(
+ string memory uri
+ ) public createSnapshot {
+ print.method("updateAVSMetadataURI");
+
+ console.log("Setting AVS metadata URI to: %s", uri);
+ _tryPrankAppointee_AllocationManager(IAllocationManager.updateAVSMetadataURI.selector);
+ allocationManager.updateAVSMetadataURI(address(this), uri);
+
+ print.gasUsed();
+ }
+
function createOperatorSets(
IStrategy[][] memory strategies
) public createSnapshot returns (OperatorSet[] memory operatorSets) {
@@ -108,9 +120,40 @@ contract AVS is Logger, IAllocationManagerTypes, IAVSRegistrar {
}
function slashOperator(
- User operator,
- uint32 operatorSetId,
- IStrategy[] memory strategies,
+ SlashingParams memory params
+ ) public createSnapshot {
+
+
+ for (uint256 i; i < params.strategies.length; ++i) {
+ string memory strategyName = params.strategies[i] == beaconChainETHStrategy ?
+ "Native ETH" :
+ IERC20Metadata(address(params.strategies[i].underlyingToken())).name();
+
+ print.method(
+ "slashOperator",
+ string.concat(
+ "{operator: ",
+ User(payable(params.operator)).NAME_COLORED(),
+ ", operatorSetId: ",
+ cheats.toString(params.operatorSetId),
+ ", strategy: ",
+ strategyName,
+ ", wadToSlash: ",
+ params.wadsToSlash[i].asWad(),
+ "}"
+ )
+ );
+ }
+
+ _tryPrankAppointee_AllocationManager(IAllocationManager.slashOperator.selector);
+ allocationManager.slashOperator(address(this), params);
+ print.gasUsed();
+ }
+
+ function slashOperator(
+ User operator,
+ uint32 operatorSetId,
+ IStrategy[] memory strategies,
uint256[] memory wadsToSlash
) public createSnapshot returns (SlashingParams memory p) {
p = SlashingParams({
diff --git a/src/test/integration/users/User.t.sol b/src/test/integration/users/User.t.sol
index f4a33b2b82..3cafc26648 100644
--- a/src/test/integration/users/User.t.sol
+++ b/src/test/integration/users/User.t.sol
@@ -48,6 +48,8 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes {
TimeMachine timeMachine;
BeaconChainMock beaconChain;
+ uint32 public allocationDelay = 1;
+
string _NAME;
// User's EigenPod and each of their validator indices within that pod
@@ -92,44 +94,35 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes {
/// @dev Allocates randomly across the operator set's strategies with a sum of `magnitudeSum`.
/// NOTE: Calling more than once will lead to deallocations...
function modifyAllocations(
- OperatorSet memory operatorSet,
- uint64[] memory magnitudes
- ) public virtual createSnapshot returns (AllocateParams memory) {
+ AllocateParams memory params
+ ) public virtual createSnapshot {
print.method(
"modifyAllocations",
string.concat(
"{avs: ",
- Logger(operatorSet.avs).NAME_COLORED(),
+ Logger(params.operatorSet.avs).NAME_COLORED(),
", operatorSetId: ",
- cheats.toString(operatorSet.id),
+ cheats.toString(params.operatorSet.id),
"}"
)
);
- IStrategy[] memory strategies = allocationManager().getStrategiesInOperatorSet(operatorSet);
-
- require(strategies.length == magnitudes.length, "User.modifyAllocations: length mismatch");
-
- AllocateParams[] memory allocateParams = AllocateParams({
- operatorSet: operatorSet,
- strategies: strategies,
- newMagnitudes: magnitudes
- }).toArray();
-
_tryPrankAppointee_AllocationManager(IAllocationManager.modifyAllocations.selector);
- allocationManager().modifyAllocations(address(this), allocateParams);
+ allocationManager().modifyAllocations(address(this), params.toArray());
print.gasUsed();
-
- return allocateParams[0];
}
function deallocateAll(
OperatorSet memory operatorSet
) public virtual returns (AllocateParams memory) {
- return modifyAllocations(
- operatorSet,
- new uint64[](allocationManager().getStrategiesInOperatorSet(operatorSet).length)
- );
+ AllocateParams memory params;
+ params.operatorSet = operatorSet;
+ params.strategies = allocationManager().getStrategiesInOperatorSet(operatorSet);
+ params.newMagnitudes = new uint64[](params.strategies.length);
+
+ modifyAllocations(params);
+
+ return params;
}
function registerForOperatorSets(
@@ -192,17 +185,17 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes {
_tryPrankAppointee_AllocationManager(IAllocationManager.setAllocationDelay.selector);
allocationManager().setAllocationDelay(address(this), delay);
print.gasUsed();
+
+ allocationDelay = delay;
}
/// -----------------------------------------------------------------------
/// Delegation Manager Methods
/// -----------------------------------------------------------------------
- uint32 withdrawalDelay = 1;
-
function registerAsOperator() public virtual createSnapshot {
print.method("registerAsOperator");
- delegationManager.registerAsOperator(address(0), withdrawalDelay, "metadata");
+ delegationManager.registerAsOperator(address(0), allocationDelay, "metadata");
print.gasUsed();
}
@@ -212,7 +205,7 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes {
) public virtual createSnapshot {
print.method("delegateTo", operator.NAME_COLORED());
- ISignatureUtils.SignatureWithExpiry memory emptySig;
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory emptySig;
delegationManager.delegateTo(address(operator), emptySig, bytes32(0));
print.gasUsed();
}
@@ -244,6 +237,34 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes {
return expectedWithdrawals;
}
+ /// @dev Redelegate to a new operator
+ function redelegate(
+ User newOperator
+ ) public virtual createSnapshot returns (Withdrawal[] memory) {
+ print.method("redelegate", newOperator.NAME_COLORED());
+ Withdrawal[] memory expectedWithdrawals = _getExpectedWithdrawalStructsForStaker(address(this));
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory emptySig;
+ _tryPrankAppointee_DelegationManager(IDelegationManager.redelegate.selector);
+ delegationManager.redelegate(address(newOperator), emptySig, bytes32(0));
+ print.gasUsed();
+
+ for (uint256 i = 0; i < expectedWithdrawals.length; i++) {
+ IStrategy strat = expectedWithdrawals[i].strategies[0];
+
+ string memory name = strat == beaconChainETHStrategy
+ ? "Native ETH"
+ : IERC20Metadata(address(strat.underlyingToken())).name();
+
+ console.log(
+ " Expecting withdrawal with nonce %s of %s for %s scaled shares.",
+ expectedWithdrawals[i].nonce,
+ name,
+ expectedWithdrawals[i].scaledShares[0]
+ );
+ }
+ return expectedWithdrawals;
+ }
+
/// @dev Force undelegate staker
function forceUndelegate(
User staker
@@ -275,6 +296,15 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes {
__deprecated_withdrawer: address(0)
});
+ uint256[] memory scaledSharesForWithdrawal = new uint256[](strategies.length);
+ for (uint256 i = 0; i < strategies.length; ++i) {
+ DepositScalingFactor memory dsf = DepositScalingFactor(
+ delegationManager.depositScalingFactor(address(this), strategies[i])
+ );
+
+ scaledSharesForWithdrawal[i] = dsf.scaleForQueueWithdrawal(depositShares[i]);
+ }
+
// Create Withdrawal struct using same info
Withdrawal[] memory withdrawals = new Withdrawal[](1);
withdrawals[0] = Withdrawal({
@@ -284,7 +314,7 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes {
nonce: nonce,
startBlock: uint32(block.number),
strategies: strategies,
- scaledShares: depositShares // TODO: convert depositShares to shares and then scale in withdrawal
+ scaledShares: scaledSharesForWithdrawal
});
bytes32[] memory withdrawalRoots = delegationManager.queueWithdrawals(params);
@@ -316,7 +346,7 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes {
function completeWithdrawalsAsShares(
Withdrawal[] memory withdrawals
) public virtual createSnapshot returns (IERC20[][] memory tokens) {
- print.method("completeWithdrawalAsShares");
+ print.method("completeWithdrawalsAsShares");
tokens = new IERC20[][](withdrawals.length);
for (uint256 i = 0; i < withdrawals.length; i++) {
tokens[i] = _completeQueuedWithdrawal(withdrawals[i], false);
@@ -465,9 +495,9 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes {
if (strat == BEACONCHAIN_ETH_STRAT) {
tokens[i] = NATIVE_ETH;
- // If we're withdrawing native ETH as tokens, stop ALL validators
- // and complete a checkpoint
- if (receiveAsTokens) {
+ // If we're withdrawing native ETH as tokens && do not have negative shares
+ // stop ALL validators and complete a checkpoint
+ if (receiveAsTokens && eigenPodManager.podOwnerDepositShares(address(this)) >= 0) {
console.log("- exiting all validators and completing checkpoint");
_exitValidators(getActiveValidators());
@@ -650,10 +680,6 @@ contract User is Logger, IDelegationManagerTypes, IAllocationManagerTypes {
uint256 scaledShares = dsf.scaleForQueueWithdrawal(depositShares[i]);
- if (strategies[i] == beaconChainETHStrategy) {
- scaledShares -= scaledShares % 1 gwei;
- }
-
expectedWithdrawals[i] = Withdrawal({
staker: staker,
delegatedTo: delegatedTo,
diff --git a/src/test/integration/users/User_M1.t.sol b/src/test/integration/users/User_M1.t.sol
index e0ebb17a91..86b6f34904 100644
--- a/src/test/integration/users/User_M1.t.sol
+++ b/src/test/integration/users/User_M1.t.sol
@@ -5,7 +5,7 @@ import "src/test/integration/deprecatedInterfaces/mainnet/IEigenPod.sol";
import "src/test/integration/deprecatedInterfaces/mainnet/IEigenPodManager.sol";
import "src/test/integration/deprecatedInterfaces/mainnet/IStrategyManager.sol";
import "src/test/integration/users/User.t.sol";
-import "src/contracts/mixins/SignatureUtils.sol";
+import "src/contracts/mixins/SignatureUtilsMixin.sol";
interface IUserM1MainnetForkDeployer {
function delegationManager() external view returns (DelegationManager);
@@ -70,11 +70,6 @@ contract User_M1 is User {
}
contract User_M1_AltMethods is User_M1 {
- /// @notice The EIP-712 typehash for the contract's domain.
- bytes32 internal constant EIP712_DOMAIN_TYPEHASH =
- keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
-
-
mapping(bytes32 => bool) public signedHashes;
constructor(string memory name) User_M1(name) {}
diff --git a/src/test/integration/users/User_M2.t.sol b/src/test/integration/users/User_M2.t.sol
index 3fd7d2c2b7..0afdf0211b 100644
--- a/src/test/integration/users/User_M2.t.sol
+++ b/src/test/integration/users/User_M2.t.sol
@@ -137,7 +137,7 @@ contract User_M2 is User {
// If any balance update has occurred, a checkpoint will pick it up
_startCheckpoint();
if (pod.activeValidatorCount() != 0) {
- _completeCheckpoint();
+ _completeCheckpoint_M2();
}
} else {
uint256 tokens = uint256(delta);
diff --git a/src/test/mocks/DelegationManagerMock.sol b/src/test/mocks/DelegationManagerMock.sol
index 0c9ed77411..9fc9cd28ce 100644
--- a/src/test/mocks/DelegationManagerMock.sol
+++ b/src/test/mocks/DelegationManagerMock.sol
@@ -52,7 +52,7 @@ contract DelegationManagerMock is Test {
}
}
- function delegateTo(address operator, ISignatureUtils.SignatureWithExpiry memory /*approverSignatureAndExpiry*/, bytes32 /*approverSalt*/) external {
+ function delegateTo(address operator, ISignatureUtilsMixinTypes.SignatureWithExpiry memory /*approverSignatureAndExpiry*/, bytes32 /*approverSalt*/) external {
delegatedTo[msg.sender] = operator;
}
@@ -89,11 +89,10 @@ contract DelegationManagerMock is Test {
function addShares(
IStrategyManager strategyManager,
address staker,
- IERC20 token,
IStrategy strategy,
uint256 shares
) external {
- strategyManager.addShares(staker, strategy, token, shares);
+ strategyManager.addShares(staker, strategy, shares);
}
function removeDepositShares(
diff --git a/src/test/mocks/EigenPodManagerMock.sol b/src/test/mocks/EigenPodManagerMock.sol
index ecf6028707..d9b5f29242 100644
--- a/src/test/mocks/EigenPodManagerMock.sol
+++ b/src/test/mocks/EigenPodManagerMock.sol
@@ -39,7 +39,6 @@ contract EigenPodManagerMock is Test, Pausable {
function addShares(
address podOwner,
IStrategy,
- IERC20,
uint256 shares
) external returns (uint256, uint256) {
uint256 existingDepositShares = uint256(podOwnerDepositShares[podOwner]);
@@ -51,8 +50,10 @@ contract EigenPodManagerMock is Test, Pausable {
address podOwner,
IStrategy, // strategy
uint256 shares
- ) external {
- podOwnerDepositShares[podOwner] -= int256(shares);
+ ) external returns (uint256) {
+ int256 updatedShares = podOwnerDepositShares[podOwner] - int256(shares);
+ podOwnerDepositShares[podOwner] = updatedShares;
+ return uint256(updatedShares);
}
function denebForkTimestamp() external pure returns (uint64) {
diff --git a/src/test/mocks/EigenPodMock.sol b/src/test/mocks/EigenPodMock.sol
index d1e12199f9..f74b966c4a 100644
--- a/src/test/mocks/EigenPodMock.sol
+++ b/src/test/mocks/EigenPodMock.sol
@@ -3,8 +3,10 @@ pragma solidity ^0.8.9;
import "forge-std/Test.sol";
import "../../contracts/interfaces/IEigenPod.sol";
+import "../../contracts/mixins/SemVerMixin.sol";
-contract EigenPodMock is IEigenPod, Test {
+contract EigenPodMock is IEigenPod, SemVerMixin, Test {
+ constructor() SemVerMixin("v9.9.9") {}
function nonBeaconChainETHBalanceWei() external view returns(uint256) {}
diff --git a/src/test/mocks/StrategyManagerMock.sol b/src/test/mocks/StrategyManagerMock.sol
index 57ffd5f520..74ec746fdb 100644
--- a/src/test/mocks/StrategyManagerMock.sol
+++ b/src/test/mocks/StrategyManagerMock.sol
@@ -83,9 +83,11 @@ contract StrategyManagerMock is Test {
function removeDepositShares(
address staker, IStrategy strategy, uint256 sharesToRemove
- ) external {
+ ) external returns (uint256) {
uint256 strategyIndex = _getStrategyIndex(staker, strategy);
- sharesToReturn[staker][strategyIndex] -= sharesToRemove;
+ uint256 updatedShares = sharesToReturn[staker][strategyIndex] - sharesToRemove;
+ sharesToReturn[staker][strategyIndex] = updatedShares;
+ return updatedShares;
}
function removeStrategiesFromDepositWhitelist(IStrategy[] calldata /*strategiesToRemoveFromWhitelist*/) external pure {}
@@ -102,8 +104,7 @@ contract StrategyManagerMock is Test {
function addShares(
address staker,
- IStrategy strategy,
- IERC20, // token
+ IStrategy strategy,
uint256 addedShares
) external returns (uint, uint) {
// Increase the staker's shares
diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol
index bd9e2b8b05..7a8694d4db 100644
--- a/src/test/unit/AVSDirectoryUnit.t.sol
+++ b/src/test/unit/AVSDirectoryUnit.t.sol
@@ -4,7 +4,7 @@ pragma solidity ^0.8.27;
import "src/contracts/core/AVSDirectory.sol";
import "src/test/utils/EigenLayerUnitTestSetup.sol";
-contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents, IAVSDirectoryErrors, ISignatureUtils {
+contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents, IAVSDirectoryErrors, ISignatureUtilsMixinTypes {
uint8 constant PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS = 0;
AVSDirectory avsDirectory;
@@ -39,7 +39,7 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents,
avsd = AVSDirectory(
address(
new TransparentUpgradeableProxy(
- address(new AVSDirectory(IDelegationManager(delegationManager), pauserRegistry)),
+ address(new AVSDirectory(IDelegationManager(delegationManager), pauserRegistry, "v9.9.9")),
address(eigenLayerProxyAdmin),
abi.encodeWithSelector(
AVSDirectory.initialize.selector,
@@ -51,7 +51,18 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents,
);
isExcludedFuzzAddress[address(avsd)] = true;
- assertTrue(avsd.domainSeparator() != bytes32(0), "sanity check");
+ bytes memory v = bytes(avsd.version());
+ bytes32 expectedDomainSeparator = keccak256(
+ abi.encode(
+ EIP712_DOMAIN_TYPEHASH,
+ keccak256(bytes("EigenLayer")),
+ keccak256(bytes.concat(v[0], v[1])),
+ block.chainid,
+ address(avsd)
+ )
+ );
+
+ assertEq(avsd.domainSeparator(), expectedDomainSeparator, "sanity check");
}
function _newOperatorRegistrationSignature(
@@ -110,7 +121,7 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents,
function test_registerOperatorToAVS_SignatureExpired() public {
defaultOperatorSignature.expiry = block.timestamp - 1;
- cheats.expectRevert(SignatureExpired.selector);
+ cheats.expectRevert(ISignatureUtilsMixinErrors.SignatureExpired.selector);
avsDirectory.registerOperatorToAVS(defaultOperator, defaultOperatorSignature);
}
diff --git a/src/test/unit/AllocationManagerUnit.t.sol b/src/test/unit/AllocationManagerUnit.t.sol
index a3302520bf..7f81cdfba4 100644
--- a/src/test/unit/AllocationManagerUnit.t.sol
+++ b/src/test/unit/AllocationManagerUnit.t.sol
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.27;
-import "src/contracts/core/AllocationManager.sol";
+import "src/test/harnesses/AllocationManagerHarness.sol";
import "src/test/utils/EigenLayerUnitTestSetup.sol";
import "src/test/mocks/MockAVSRegistrar.sol";
@@ -33,7 +33,7 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag
/// Mocks
/// -----------------------------------------------------------------------
- AllocationManager allocationManager;
+ AllocationManagerHarness allocationManager;
ERC20PresetFixedSupply tokenMock;
StrategyBase strategyMock;
@@ -62,7 +62,7 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag
strategyMock = StrategyBase(
address(
new TransparentUpgradeableProxy(
- address(new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry)),
+ address(new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry, "v9.9.9")),
address(eigenLayerProxyAdmin),
abi.encodeWithSelector(StrategyBase.initialize.selector, tokenMock)
)
@@ -71,6 +71,10 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag
defaultStrategies = strategyMock.toArray();
defaultOperatorSet = OperatorSet(defaultAVS, 0);
+ cheats.prank(defaultAVS);
+ allocationManager.updateAVSMetadataURI(defaultAVS, "https://example.com");
+
+
_createOperatorSet(defaultOperatorSet, defaultStrategies);
_registerOperator(defaultOperator);
_setAllocationDelay(defaultOperator, DEFAULT_OPERATOR_ALLOCATION_DELAY);
@@ -86,12 +90,12 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag
address _initialOwner,
IPauserRegistry _pauserRegistry,
uint256 _initialPausedStatus
- ) internal returns (AllocationManager) {
- return allocationManager = AllocationManager(
+ ) internal returns (AllocationManagerHarness) {
+ return allocationManager = AllocationManagerHarness(
address(
new TransparentUpgradeableProxy(
address(
- new AllocationManager(
+ new AllocationManagerHarness(
IDelegationManager(address(delegationManagerMock)),
_pauserRegistry,
IPermissionController(address(permissionController)),
@@ -225,7 +229,7 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag
assertEq(expectedAllocation.pendingDiff, allocation.pendingDiff, "pendingDiff != expected");
assertEq(expectedAllocation.effectBlock, allocation.effectBlock, "effectBlock != expected");
- uint256 encumberedMagnitude = allocationManager.encumberedMagnitude(operator, strategy);
+ uint256 encumberedMagnitude = allocationManager.getEncumberedMagnitude(operator, strategy);
uint256 maxMagnitude = allocationManager.getMaxMagnitudes(operator, strategy.toArray())[0];
uint256 allocatableMagnitude = allocationManager.getAllocatableMagnitude(operator, strategy);
@@ -254,6 +258,23 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag
console.log("Success!".green().bold());
}
+ /// @dev Check that the deallocation queue is in ascending order of effectBlocks
+ function _checkDeallocationQueueOrder(address operator, IStrategy strategy, uint256 numDeallocations) internal view {
+ uint32 lastEffectBlock = 0;
+
+ for (uint256 i = 0; i < numDeallocations; ++i) {
+ bytes32 operatorSetKey = allocationManager.deallocationQueueAtIndex(operator, strategy, i);
+ Allocation memory allocation = allocationManager.getAllocation(operator, OperatorSetLib.decode(operatorSetKey), strategy);
+
+ assertTrue(
+ lastEffectBlock <= allocation.effectBlock,
+ "Deallocation queue is not in ascending order of effectBlocks"
+ );
+
+ lastEffectBlock = allocation.effectBlock;
+ }
+ }
+
function _checkSlashableStake(
OperatorSet memory operatorSet,
address operator,
@@ -270,17 +291,17 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag
uint256 expectedSlashableStake,
uint256 futureBlock
) internal view {
- uint256[] memory slashableStake = allocationManager.getMinimumSlashableStake({
+ uint256[][] memory slashableStake = allocationManager.getMinimumSlashableStake({
operatorSet: operatorSet,
operators: operator.toArray(),
strategies: strategies,
futureBlock: uint32(futureBlock)
- })[0];
+ });
for (uint256 i = 0; i < strategies.length; i++) {
console.log("\nChecking Slashable Stake:".yellow());
- console.log(" slashableStake[%d] = %d", i, slashableStake[i]);
- assertEq(slashableStake[i], expectedSlashableStake, "slashableStake != expected");
+ console.log(" slashableStake[%d] = %d", i, slashableStake[0][i]);
+ assertEq(slashableStake[0][i], expectedSlashableStake, "slashableStake != expected");
}
console.log("Success!".green().bold());
@@ -678,7 +699,7 @@ contract AllocationManagerUnitTests_SlashOperator is AllocationManagerUnitTests
cheats.prank(defaultOperator);
allocationManager.modifyAllocations(defaultOperator, allocateParams);
- uint64 encumberedMagnitudeBefore = allocationManager.encumberedMagnitude(defaultOperator, strategyMock);
+ uint64 encumberedMagnitudeBefore = allocationManager.getEncumberedMagnitude(defaultOperator, strategyMock);
uint64 maxMagnitudeBefore = allocationManager.getMaxMagnitudes(defaultOperator, strategyMock.toArray())[0];
// The only slash event we expect is the OperatorSlashed. Validate the number
@@ -705,7 +726,7 @@ contract AllocationManagerUnitTests_SlashOperator is AllocationManagerUnitTests
// Assert encumberedMagnitude and maxMagnitude are unchanged
assertEq(
encumberedMagnitudeBefore,
- allocationManager.encumberedMagnitude(defaultOperator, strategyMock),
+ allocationManager.getEncumberedMagnitude(defaultOperator, strategyMock),
"encumberedMagnitude mutated"
);
@@ -1419,9 +1440,7 @@ contract AllocationManagerUnitTests_SlashOperator is AllocationManagerUnitTests
cheats.roll(block.number + DEFAULT_OPERATOR_ALLOCATION_DELAY);
// Get slashable shares for each operatorSet
- uint256 opset2SlashableSharesBefore = allocationManager.getMinimumSlashableStake(
- operatorSet2, defaultOperator.toArray(), defaultStrategies, uint32(block.number)
- )[0][0];
+ uint256[][] memory opset2SlashableSharesBefore = allocationManager.getMinimumSlashableStake(operatorSet2, defaultOperator.toArray(), defaultStrategies, uint32(block.number));
// Slash operator on operatorSet1 for 50%
SlashingParams memory slashingParams = SlashingParams({
operator: defaultOperator,
@@ -1476,11 +1495,10 @@ contract AllocationManagerUnitTests_SlashOperator is AllocationManagerUnitTests
);
// Assert that slashable stake is the same - we add slippage here due to rounding error from the slash itself
+ uint256[][] memory minSlashableStake = allocationManager.getMinimumSlashableStake(operatorSet2, defaultOperator.toArray(), defaultStrategies, uint32(block.number));
assertEq(
- opset2SlashableSharesBefore,
- allocationManager.getMinimumSlashableStake(
- operatorSet2, defaultOperator.toArray(), defaultStrategies, uint32(block.number)
- )[0][0] + 1,
+ opset2SlashableSharesBefore[0][0],
+ minSlashableStake[0][0] + 1,
"opSet2 slashable shares should be the same"
);
}
@@ -1921,6 +1939,194 @@ contract AllocationManagerUnitTests_ModifyAllocations is AllocationManagerUnitTe
allocationManager.modifyAllocations(defaultOperator, allocateParams);
}
+ /**
+ * @notice Regression tests for the bugfix where pending modifications were checked by
+ * require(allocation.pendingDiff == 0, ModificationAlreadyPending());
+ * which would overwrite the effectBlock, pendingDiff if a pendingDiff
+ * of a deallocation was slashed to become 0.
+ *
+ * This test checks that the effectBlock, pendingDiff are not overwritten even if the pendingDiff is 0
+ * when attempting to modify allocations again
+ */
+ function test_modifyAllocations_PendingDiffZero() public {
+ // Step 1: Allocate to the operator set
+ AllocateParams[] memory allocateParams = _newAllocateParams(defaultOperatorSet, 501);
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, allocateParams);
+
+ // Step 2: Roll blocks forward until the allocation effectBlock
+ cheats.roll(block.number + DEFAULT_OPERATOR_ALLOCATION_DELAY);
+
+ // Step 3: Deallocate from the operator set
+ AllocateParams[] memory deallocateParams = _newAllocateParams(defaultOperatorSet, 500);
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, deallocateParams);
+
+ Allocation memory allocation = allocationManager.getAllocation(defaultOperator, defaultOperatorSet, strategyMock);
+ uint32 originalEffectBlock = allocation.effectBlock;
+
+ // Step 4: Slash the operator to adjust pendingDiff to 0, slashing rounds up the amount of magnitude to slash
+ // so with an existing deallocation/pendingDiff of 1, it should result in a pendingDiff of 0
+ SlashingParams memory slashingParams = SlashingParams({
+ operator: defaultOperator,
+ operatorSetId: defaultOperatorSet.id,
+ strategies: defaultStrategies,
+ wadsToSlash: 5e17.toArrayU256(),
+ description: "Test slashing"
+ });
+ cheats.prank(defaultAVS);
+ allocationManager.slashOperator(defaultAVS, slashingParams);
+ allocation = allocationManager.getAllocation(defaultOperator, defaultOperatorSet, strategyMock);
+ assertEq(allocation.pendingDiff, 0, "Pending diff should be 0");
+ assertEq(allocation.effectBlock, originalEffectBlock, "Effect block should not have changed");
+
+ // Step 5: Modify allocations again (Should not be called)
+ AllocateParams[] memory newAllocateParams = _newAllocateParams(defaultOperatorSet, 1000);
+ cheats.prank(defaultOperator);
+ cheats.expectRevert(ModificationAlreadyPending.selector);
+ allocationManager.modifyAllocations(defaultOperator, newAllocateParams);
+
+ // Assert that the allocation was modified without reverting
+ allocation = allocationManager.getAllocation(defaultOperator, defaultOperatorSet, strategyMock);
+ assertEq(allocation.currentMagnitude, 250, "Allocation should be updated to 250 after slashing 50%");
+
+ // Note: These 2 assertions fail prior to the bugfix and if we kept the same
+ // require(allocation.pendingDiff == 0, ModificationAlreadyPending());
+ // in the code. The effectBlock, pendingDiff would get overwritten with the new modification
+ // but the deallocationQueue would now be unordered(in terms of effectBlocks) with this overwrite.
+ assertEq(allocation.effectBlock, originalEffectBlock, "Effect block should not have changed");
+ assertEq(allocation.pendingDiff, 0, "Pending diff should still be 0");
+ }
+
+ /**
+ * @notice Regression tests for the bugfix where pending modifications were checked by
+ * require(allocation.pendingDiff == 0, ModificationAlreadyPending());
+ * which would overwrite the effectBlock, pendingDiff if a pendingDiff
+ * of a deallocation was slashed to become 0.
+ *
+ * This test checks that the deallocationQueue is ascending ordered by effectBlocks
+ */
+ function test_modifyAllocations_PendingDiffZero_CheckOrderedDeallocationQueue() public {
+ // Step 1: Register the operator to multiple operator sets
+ OperatorSet memory operatorSet1 = OperatorSet(defaultAVS, 1);
+ OperatorSet memory operatorSet2 = OperatorSet(defaultAVS, 2);
+ _createOperatorSet(operatorSet1, defaultStrategies);
+ _createOperatorSet(operatorSet2, defaultStrategies);
+ _registerForOperatorSet(defaultOperator, operatorSet1);
+ _registerForOperatorSet(defaultOperator, operatorSet2);
+
+ // Step 2: Allocate to both operator sets
+ AllocateParams[] memory allocateParams1 = _newAllocateParams(operatorSet1, 1001);
+ AllocateParams[] memory allocateParams2 = _newAllocateParams(operatorSet2, 1000);
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, allocateParams1);
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, allocateParams2);
+
+ // Step 3: Roll blocks forward until the allocation effectBlock
+ cheats.roll(block.number + DEFAULT_OPERATOR_ALLOCATION_DELAY);
+
+ // Step 4: Deallocate from both operator sets
+ AllocateParams[] memory deallocateParams1 = _newAllocateParams(operatorSet1, 1000);
+ AllocateParams[] memory deallocateParams2 = _newAllocateParams(operatorSet2, 0);
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, deallocateParams1);
+ // roll blocks forward so that deallocations have different effectBlocks
+ cheats.roll(block.number + 100);
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, deallocateParams2);
+
+ // Step 5: Slash the first deallocation to adjust pendingDiff to 0
+ SlashingParams memory slashingParams1 = SlashingParams({
+ operator: defaultOperator,
+ operatorSetId: operatorSet1.id,
+ strategies: defaultStrategies,
+ wadsToSlash: 5e17.toArrayU256(),
+ description: "Test slashing"
+ });
+ cheats.prank(defaultAVS);
+ allocationManager.slashOperator(defaultAVS, slashingParams1);
+
+ // Step 6: Modify allocations again for operatorSet1 making another deallocation and
+ // overwriting/increasing the effectBlock
+ // roll blocks forward so that deallocations have different effectBlocks
+ cheats.roll(block.number + 100);
+ // Note: this should revert but previously it would not prior to the bugfix
+ AllocateParams[] memory newAllocateParams1 = _newAllocateParams(operatorSet1, 400);
+ cheats.prank(defaultOperator);
+ cheats.expectRevert(ModificationAlreadyPending.selector);
+ allocationManager.modifyAllocations(defaultOperator, newAllocateParams1);
+
+ // Assert that the deallocationQueue is unordered for the 2 deallocations in queue
+ _checkDeallocationQueueOrder(defaultOperator, defaultStrategies[0], 2);
+ }
+
+ /**
+ * @notice Regression tests for the bugfix where pending modifications were checked by
+ * require(allocation.pendingDiff == 0, ModificationAlreadyPending());
+ * which would overwrite the effectBlock, pendingDiff if a pendingDiff
+ * of a deallocation was slashed to become 0.
+ *
+ * This test checks that the deallocationQueue is ascending ordered by effectBlocks
+ * In this case the new modifyAllocations call is an allocation
+ * where the effectBlock is increased and the deallocationQueue is unordered as well because the operator
+ * allocationDelay configured to be long enough.
+ */
+ function test_modifyAllocations_PendingDiffZero_Allocation() public {
+ // Step 1: Register the operator to multiple operator sets
+ OperatorSet memory operatorSet1 = OperatorSet(defaultAVS, 1);
+ OperatorSet memory operatorSet2 = OperatorSet(defaultAVS, 2);
+ _createOperatorSet(operatorSet1, defaultStrategies);
+ _createOperatorSet(operatorSet2, defaultStrategies);
+ _registerForOperatorSet(defaultOperator, operatorSet1);
+ _registerForOperatorSet(defaultOperator, operatorSet2);
+
+ // Step 2: Allocate to both operator sets
+ AllocateParams[] memory allocateParams1 = _newAllocateParams(operatorSet1, 1001);
+ AllocateParams[] memory allocateParams2 = _newAllocateParams(operatorSet2, 1000);
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, allocateParams1);
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, allocateParams2);
+
+ // Step 3: Update operator allocation delay
+ cheats.prank(defaultOperator);
+ allocationManager.setAllocationDelay(defaultOperator, DEALLOCATION_DELAY + 10 days);
+ cheats.roll(block.number + ALLOCATION_CONFIGURATION_DELAY);
+
+ // Step 4: Deallocate from both operator sets
+ AllocateParams[] memory deallocateParams1 = _newAllocateParams(operatorSet1, 1000);
+ AllocateParams[] memory deallocateParams2 = _newAllocateParams(operatorSet2, 0);
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, deallocateParams1);
+ // roll blocks forward so that deallocations have different effectBlocks
+ cheats.roll(block.number + 100);
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, deallocateParams2);
+
+ // Step 5: Slash the first deallocation to adjust pendingDiff to 0
+ SlashingParams memory slashingParams1 = SlashingParams({
+ operator: defaultOperator,
+ operatorSetId: operatorSet1.id,
+ strategies: defaultStrategies,
+ wadsToSlash: 5e17.toArrayU256(),
+ description: "Test slashing"
+ });
+ cheats.prank(defaultAVS);
+ allocationManager.slashOperator(defaultAVS, slashingParams1);
+
+ // Step 6: Modify allocations again for operatorSet1 making an allocation and
+ // overwriting/increasing the effectBlock
+ // Note: this should revert but previously it would not prior to the bugfix
+ AllocateParams[] memory newAllocateParams1 = _newAllocateParams(operatorSet1, 5000);
+ cheats.prank(defaultOperator);
+ cheats.expectRevert(ModificationAlreadyPending.selector);
+ allocationManager.modifyAllocations(defaultOperator, newAllocateParams1);
+
+ // Assert that the deallocationQueue is unordered for the 2 deallocations in queue
+ _checkDeallocationQueueOrder(defaultOperator, defaultStrategies[0], 2);
+ }
+
function test_revert_allocateZeroMagnitude() public {
// Allocate exact same magnitude as initial allocation (0)
AllocateParams[] memory allocateParams = _randAllocateParams_DefaultOpSet();
@@ -1998,6 +2204,58 @@ contract AllocationManagerUnitTests_ModifyAllocations is AllocationManagerUnitTe
allocationManager.modifyAllocations(defaultOperator, allocateParams);
}
+ function test_revert_safeCastOverflow() public {
+ // setup additional operatorSets for tests
+ OperatorSet memory opSet1 = OperatorSet(defaultAVS, 1);
+ _createOperatorSet(opSet1, defaultStrategies);
+ _registerOperator(defaultOperator);
+ _setAllocationDelay(defaultOperator, DEFAULT_OPERATOR_ALLOCATION_DELAY);
+ _registerForOperatorSet(defaultOperator, opSet1);
+
+ OperatorSet memory opSet2 = OperatorSet(defaultAVS, 2);
+ _createOperatorSet(opSet2, defaultStrategies);
+ _registerOperator(defaultOperator);
+ _setAllocationDelay(defaultOperator, DEFAULT_OPERATOR_ALLOCATION_DELAY);
+ _registerForOperatorSet(defaultOperator, opSet2);
+
+ // 1. Allocate all available magnitude for the strategy (WAD)
+ AllocateParams[] memory allocateParams = _randAllocateParams_DefaultOpSet();
+ allocateParams[0].newMagnitudes[0] = WAD;
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, allocateParams);
+ assertEq(
+ allocationManager.getAllocatableMagnitude(defaultOperator, strategyMock),
+ 0,
+ "Allocatable magnitude should be 0"
+ );
+ assertEq(
+ allocationManager.getEncumberedMagnitude(defaultOperator, strategyMock),
+ WAD,
+ "Encumbered magnitude should be WAD"
+ );
+
+ // 2. allocate to another operatorSet for the same strategy to reset encumberedMagnitude back to 0
+ allocateParams[0].operatorSet = opSet1;
+ allocateParams[0].newMagnitudes[0] = type(uint64).max - WAD + 1;
+ cheats.prank(defaultOperator);
+ cheats.expectRevert("SafeCast: value doesn't fit in 64 bits");
+ allocationManager.modifyAllocations(defaultOperator, allocateParams);
+
+ // 3. after resetting encumberedMagnitude, attempt to allocate to opSet2 with WAD
+ allocateParams[0].operatorSet = opSet2;
+ allocateParams[0].newMagnitudes[0] = WAD;
+ cheats.prank(defaultOperator);
+ cheats.expectRevert(InsufficientMagnitude.selector);
+ allocationManager.modifyAllocations(defaultOperator, allocateParams);
+
+ // 4. after resetting encumberedMagnitude, attempt to allocate to opSet2 with 1
+ allocateParams[0].operatorSet = opSet2;
+ allocateParams[0].newMagnitudes[0] = 1;
+ cheats.prank(defaultOperator);
+ cheats.expectRevert(InsufficientMagnitude.selector);
+ allocationManager.modifyAllocations(defaultOperator, allocateParams);
+ }
+
/**
* @notice Tests edge cases around allocation delay:
* 1. Set allocation delay to a value greater than ALLOCATION_CONFIGURATION_DELAY
@@ -2330,7 +2588,7 @@ contract AllocationManagerUnitTests_ModifyAllocations is AllocationManagerUnitTe
for (uint256 i; i < numStrats; ++i) {
assertEq(
WAD,
- allocationManager.encumberedMagnitude(defaultOperator, strategies[i]),
+ allocationManager.getEncumberedMagnitude(defaultOperator, strategies[i]),
"encumberedMagnitude not max"
);
}
@@ -2406,7 +2664,7 @@ contract AllocationManagerUnitTests_ModifyAllocations is AllocationManagerUnitTe
operatorSet: defaultOperatorSet,
strategy: strategyMock,
expectedAllocation: Allocation({currentMagnitude: secondMod, pendingDiff: 0, effectBlock: 0}),
- expectedMagnitudes: Magnitudes({encumbered: firstMod, max: WAD, allocatable: WAD - secondMod})
+ expectedMagnitudes: Magnitudes({encumbered: secondMod, max: WAD, allocatable: WAD - secondMod})
});
// Check storage after clearing deallocation queue
@@ -2515,16 +2773,8 @@ contract AllocationManagerUnitTests_ModifyAllocations is AllocationManagerUnitTe
operator: defaultOperator,
operatorSet: defaultOperatorSet,
strategy: strategyMock,
- expectedAllocation: Allocation({
- currentMagnitude: deallocateParams[0].newMagnitudes[0],
- pendingDiff: 0,
- effectBlock: 0
- }),
- expectedMagnitudes: Magnitudes({
- encumbered: allocateParams[0].newMagnitudes[0],
- max: WAD,
- allocatable: WAD - deallocateParams[0].newMagnitudes[0]
- })
+ expectedAllocation: Allocation({currentMagnitude: deallocateParams[0].newMagnitudes[0], pendingDiff: 0, effectBlock: 0}),
+ expectedMagnitudes: Magnitudes({encumbered: deallocateParams[0].newMagnitudes[0], max: WAD, allocatable: WAD - deallocateParams[0].newMagnitudes[0]})
});
}
@@ -2898,7 +3148,7 @@ contract AllocationManagerUnitTests_ModifyAllocations is AllocationManagerUnitTe
effectBlock: 0
}),
expectedMagnitudes: Magnitudes({
- encumbered: allocateParams[i].newMagnitudes[j],
+ encumbered: deallocateParams[i].newMagnitudes[j],
max: WAD,
allocatable: WAD - deallocateParams[i].newMagnitudes[j]
})
@@ -3167,7 +3417,7 @@ contract AllocationManagerUnitTests_ClearDeallocationQueue is AllocationManagerU
// At this point, we should be able to allocate again to opSet1 AND have only 5e17 encumbered magnitude
assertEq(
5e17,
- allocationManager.encumberedMagnitude(defaultOperator, strategyMock),
+ allocationManager.getEncumberedMagnitude(defaultOperator, strategyMock),
"encumbered magnitude not correct"
);
AllocateParams[] memory thirdAllocation = _newAllocateParams(defaultOperatorSet, 5e17);
@@ -3610,6 +3860,13 @@ contract AllocationManagerUnitTests_createOperatorSets is AllocationManagerUnitT
);
}
+ function testRevert_createOperatorSets_NonexistentAVSMetadata(Randomness r) public rand(r) {
+ address avs = r.Address();
+ cheats.expectRevert(NonexistentAVSMetadata.selector);
+ cheats.prank(avs);
+ allocationManager.createOperatorSets(avs, CreateSetParams(defaultOperatorSet.id, defaultStrategies).toArray());
+ }
+
function testFuzz_createOperatorSets_Correctness(
Randomness r
) public rand(r) {
@@ -3617,6 +3874,9 @@ contract AllocationManagerUnitTests_createOperatorSets is AllocationManagerUnitT
uint256 numOpSets = r.Uint256(1, FUZZ_MAX_OP_SETS);
uint256 numStrategies = r.Uint256(1, FUZZ_MAX_STRATS);
+ cheats.prank(avs);
+ allocationManager.updateAVSMetadataURI(avs, "https://example.com");
+
CreateSetParams[] memory createSetParams = new CreateSetParams[](numOpSets);
for (uint256 i; i < numOpSets; ++i) {
@@ -3728,6 +3988,7 @@ contract AllocationManagerUnitTests_getStrategyAllocations is AllocationManagerU
contract AllocationManagerUnitTests_getSlashableStake is AllocationManagerUnitTests {
using SlashingLib for *;
+ using ArrayLib for *;
/**
* Allocates half of magnitude for a single strategy to an operatorSet. Then allocates again. Slashes 50%
@@ -3946,6 +4207,92 @@ contract AllocationManagerUnitTests_getSlashableStake is AllocationManagerUnitTe
expectedSlashableStake: expectedCurrentMagnitude - uint128(-expectedPendingDiff) - 1
});
}
+
+ function testFuzz_allocate_deregister(
+ Randomness r
+ ) public rand(r) {
+ AllocateParams[] memory allocateParams = _newAllocateParams(defaultOperatorSet, 5e17);
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, allocateParams);
+ cheats.roll(block.number + DEFAULT_OPERATOR_ALLOCATION_DELAY);
+
+ cheats.prank(defaultOperator);
+ allocationManager.deregisterFromOperatorSets(
+ DeregisterParams(defaultOperator, defaultOperatorSet.avs, defaultOperatorSet.id.toArrayU32())
+ );
+
+ // Check slashable stake right after deregistration
+ _checkSlashableStake({
+ operatorSet: allocateParams[0].operatorSet,
+ operator: defaultOperator,
+ strategies: allocateParams[0].strategies,
+ expectedSlashableStake: DEFAULT_OPERATOR_SHARES.mulWad(5e17)
+ });
+
+ // Assert slashable stake after deregistration delay is 0
+ cheats.roll(block.number + DEALLOCATION_DELAY + 1);
+ _checkSlashableStake({
+ operatorSet: allocateParams[0].operatorSet,
+ operator: defaultOperator,
+ strategies: allocateParams[0].strategies,
+ expectedSlashableStake: 0
+ });
+ }
+}
+
+contract AllocationManagerUnitTests_isOperatorSlashable is AllocationManagerUnitTests {
+ using SlashingLib for *;
+ using ArrayLib for *;
+
+ function test_registeredOperator() public {
+ assertEq(
+ allocationManager.isOperatorSlashable(defaultOperator, defaultOperatorSet),
+ true,
+ "registered operator should be slashable"
+ );
+ assertEq(
+ allocationManager.isMemberOfOperatorSet(defaultOperator, defaultOperatorSet),
+ true,
+ "operator should be member of set"
+ );
+ }
+
+ function test_deregisteredOperatorAndSlashable() public {
+ // 1. deregister defaultOperator from defaultOperator set
+ uint32 deregisterBlock = uint32(block.number);
+ cheats.prank(defaultOperator);
+ allocationManager.deregisterFromOperatorSets(
+ DeregisterParams(defaultOperator, defaultOperatorSet.avs, defaultOperatorSet.id.toArrayU32())
+ );
+ assertEq(
+ allocationManager.isMemberOfOperatorSet(defaultOperator, defaultOperatorSet),
+ false,
+ "operator should not be member of set"
+ );
+
+ // 2. assert operator is still slashable
+ assertEq(
+ allocationManager.isOperatorSlashable(defaultOperator, defaultOperatorSet),
+ true,
+ "deregistered operator should be slashable"
+ );
+
+ // 3. roll blocks forward to slashableUntil block assert still slashable
+ cheats.roll(deregisterBlock + DEALLOCATION_DELAY);
+ assertEq(
+ allocationManager.isOperatorSlashable(defaultOperator, defaultOperatorSet),
+ true,
+ "deregistered operator should be slashable"
+ );
+
+ // 4. roll 1 block forward and assert not slashable
+ cheats.roll(deregisterBlock + DEALLOCATION_DELAY + 1);
+ assertEq(
+ allocationManager.isOperatorSlashable(defaultOperator, defaultOperatorSet),
+ false,
+ "deregistered operator should not be slashable"
+ );
+ }
}
contract AllocationManagerUnitTests_getMaxMagnitudesAtBlock is AllocationManagerUnitTests {
@@ -4000,3 +4347,84 @@ contract AllocationManagerUnitTests_getMaxMagnitudesAtBlock is AllocationManager
);
}
}
+
+contract AllocationManagerUnitTests_getAllocatedStake is AllocationManagerUnitTests {
+ using ArrayLib for *;
+ using SlashingLib for *;
+
+ /**
+ * Allocates to `firstMod` magnitude and validates allocated stake is correct
+ */
+ function testFuzz_allocate(
+ Randomness r
+ ) public rand(r) {
+ // Generate allocation for `strategyMock`, we allocate half
+ AllocateParams[] memory allocateParams = _newAllocateParams(defaultOperatorSet, 5e17);
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, allocateParams);
+ cheats.roll(block.number + DEFAULT_OPERATOR_ALLOCATION_DELAY);
+
+ uint256[][] memory allocatedStake = allocationManager.getAllocatedStake(defaultOperatorSet, defaultOperator.toArray(), defaultStrategies);
+
+ assertEq(allocatedStake[0][0], DEFAULT_OPERATOR_SHARES.mulWad(5e17), "allocated stake not correct");
+ }
+
+ /**
+ * Allocates to `firstMod` magnitude and then deallocate to `secondMod` magnitude
+ * Validates allocated stake is updated even after deallocation is cleared in storage
+ */
+ function testFuzz_allocate_deallocate(
+ Randomness r
+ ) public rand(r) {
+ // Bound allocation and deallocation
+ uint64 firstMod = r.Uint64(1, WAD);
+ uint64 secondMod = r.Uint64(0, firstMod - 1);
+
+ // 1. Allocate magnitude to default registered set & warp to allocation complete block
+ AllocateParams[] memory allocateParams = _newAllocateParams(defaultOperatorSet, firstMod);
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, allocateParams);
+ cheats.roll(block.number + DEFAULT_OPERATOR_ALLOCATION_DELAY);
+
+ // 2. Deallocate
+ allocateParams = _newAllocateParams(defaultOperatorSet, secondMod);
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, allocateParams);
+
+ // 3. Check allocated stake right after deallocation - shouldn't be updated
+ uint256[][] memory allocatedStake = allocationManager.getAllocatedStake(defaultOperatorSet, defaultOperator.toArray(), defaultStrategies);
+ assertEq(allocatedStake[0][0], DEFAULT_OPERATOR_SHARES.mulWad(firstMod), "allocated stake not correct");
+
+ // 4. Check slashable stake at the deallocation effect block
+ // Warp to deallocation effect block
+ cheats.roll(block.number + DEALLOCATION_DELAY + 1);
+
+ allocatedStake = allocationManager.getAllocatedStake(defaultOperatorSet, defaultOperator.toArray(), defaultStrategies);
+ assertEq(allocatedStake[0][0], DEFAULT_OPERATOR_SHARES.mulWad(secondMod), "allocated stake not correct");
+ }
+
+ /**
+ * Allocates to `firstMod` magnitude and then deregisters the operator.
+ * Validates allocated stake is nonzero even after deregistration delay
+ */
+ function testFuzz_allocate_deregister(
+ Randomness r
+ ) public rand(r) {
+ // 1. Generate allocation for `strategyMock`, we allocate half
+ AllocateParams[] memory allocateParams = _newAllocateParams(defaultOperatorSet, 5e17);
+ cheats.prank(defaultOperator);
+ allocationManager.modifyAllocations(defaultOperator, allocateParams);
+ cheats.roll(block.number + DEFAULT_OPERATOR_ALLOCATION_DELAY);
+
+ // 2. Deregister from operator set & warp to deregistration effect block
+ cheats.prank(defaultOperator);
+ allocationManager.deregisterFromOperatorSets(
+ DeregisterParams(defaultOperator, defaultOperatorSet.avs, defaultOperatorSet.id.toArrayU32())
+ );
+ cheats.roll(block.number + DEALLOCATION_DELAY + 1);
+
+ // 3. Check allocated stake
+ uint256[][] memory allocatedStake = allocationManager.getAllocatedStake(defaultOperatorSet, defaultOperator.toArray(), defaultStrategies);
+ assertEq(allocatedStake[0][0], DEFAULT_OPERATOR_SHARES.mulWad(5e17), "allocated stake should remain same after deregistration");
+ }
+}
diff --git a/src/test/unit/DelegationUnit.t.sol b/src/test/unit/DelegationUnit.t.sol
index 1619bbf3a1..630be6679e 100644
--- a/src/test/unit/DelegationUnit.t.sol
+++ b/src/test/unit/DelegationUnit.t.sol
@@ -18,7 +18,7 @@ import "src/test/harnesses/DelegationManagerHarness.sol";
* Contracts not mocked: StrategyBase, PauserRegistry
*/
contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManagerEvents, IDelegationManagerErrors {
- using SlashingLib for *;
+ using SlashingLib for *;
using ArrayLib for *;
using Math for *;
@@ -58,12 +58,14 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
uint256 delegationSignerPrivateKey = uint256(0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80);
address defaultApprover = cheats.addr(delegationSignerPrivateKey);
uint256 stakerPrivateKey = uint256(123_456_789);
+ uint256 staker2PrivateKey = uint256(234_567_891);
address defaultStaker = cheats.addr(stakerPrivateKey);
+ address defaultStaker2 = cheats.addr(staker2PrivateKey);
address defaultOperator = address(this);
address defaultOperator2 = address(0x123);
address defaultAVS = address(this);
string emptyStringForMetadataURI;
- ISignatureUtils.SignatureWithExpiry emptyApproverSignatureAndExpiry;
+ ISignatureUtilsMixinTypes.SignatureWithExpiry emptyApproverSignatureAndExpiry;
bytes32 emptySalt;
// Helper to use in storage
DepositScalingFactor dsf;
@@ -110,7 +112,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
// Deploy mock token and strategy
tokenMock = new ERC20PresetFixedSupply("Mock Token", "MOCK", tokenMockInitialSupply, address(this));
- strategyImplementation = new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry);
+ strategyImplementation = new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry, "v9.9.9");
strategyMock = StrategyBase(
address(
new TransparentUpgradeableProxy(
@@ -175,7 +177,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
}
/**
- * @notice internal function to deploy mock tokens and strategies and have the staker deposit into them.
+ * @notice internal function to deploy mock tokens and strategies and have the staker deposit into them.
* Since we are mocking the strategyManager we call strategyManagerMock.setDeposits so that when
* DelegationManager calls getDeposits, we can have these share amounts returned.
*/
@@ -191,7 +193,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
if (strategies[i] == beaconChainETHStrategy) {
eigenPodManagerMock.setPodOwnerShares(staker, int256(sharesAmounts[i]));
} else {
- strategyManagerMock.addDeposit(staker, strategies[i], sharesAmounts[i]);
+ strategyManagerMock.addDeposit(staker, strategies[i], sharesAmounts[i]);
}
}
}
@@ -206,15 +208,11 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
address operator,
bytes32 salt,
uint256 expiry
- ) internal view returns (ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry) {
+ ) internal view returns (ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry) {
approverSignatureAndExpiry.expiry = expiry;
{
bytes32 digestHash = delegationManager.calculateDelegationApprovalDigestHash(
- staker,
- operator,
- delegationManager.delegationApprover(operator),
- salt,
- expiry
+ staker, operator, delegationManager.delegationApprover(operator), salt, expiry
);
(uint8 v, bytes32 r, bytes32 s) = cheats.sign(_delegationSignerPrivateKey, digestHash);
approverSignatureAndExpiry.signature = abi.encodePacked(r, s, v);
@@ -224,14 +222,14 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
// @notice Assumes operator does not have a delegation approver & staker != approver
function _delegateToOperatorWhoAcceptsAllStakers(address staker, address operator) internal {
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry;
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry;
cheats.prank(staker);
delegationManager.delegateTo(operator, approverSignatureAndExpiry, emptySalt);
}
function _delegateToOperatorWhoRequiresSig(address staker, address operator, bytes32 salt) internal {
uint256 expiry = type(uint256).max;
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
delegationSignerPrivateKey,
staker,
operator,
@@ -246,15 +244,21 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
_delegateToOperatorWhoRequiresSig(staker, operator, emptySalt);
}
- function _registerOperatorWithBaseDetails(address operator) internal {
+ function _registerOperatorWithBaseDetails(
+ address operator
+ ) internal {
_registerOperator(operator, address(0), emptyStringForMetadataURI);
}
- function _registerOperatorWithDelegationApprover(address operator) internal {
+ function _registerOperatorWithDelegationApprover(
+ address operator
+ ) internal {
_registerOperator(operator, defaultApprover, emptyStringForMetadataURI);
}
- function _registerOperatorWith1271DelegationApprover(address operator) internal returns (ERC1271WalletMock) {
+ function _registerOperatorWith1271DelegationApprover(
+ address operator
+ ) internal returns (ERC1271WalletMock) {
address delegationSigner = defaultApprover;
/**
* deploy a ERC1271WalletMock contract with the `delegationSigner` address as the owner,
@@ -282,12 +286,15 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
function _fuzzDepositWithdrawalAmounts(
Randomness r,
uint32 numStrategies
- ) internal returns (
- uint256[] memory depositAmounts,
- uint256[] memory withdrawalAmounts,
- uint64[] memory prevMagnitudes,
- uint64[] memory newMagnitudes
- ) {
+ )
+ internal
+ returns (
+ uint256[] memory depositAmounts,
+ uint256[] memory withdrawalAmounts,
+ uint64[] memory prevMagnitudes,
+ uint64[] memory newMagnitudes
+ )
+ {
withdrawalAmounts = new uint256[](numStrategies);
depositAmounts = new uint256[](numStrategies);
prevMagnitudes = new uint64[](numStrategies);
@@ -297,7 +304,6 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
// generate withdrawal amount within range s.t withdrawAmount <= depositAmount
withdrawalAmounts[i] = r.Uint256(1, depositAmounts[i]);
-
prevMagnitudes[i] = r.Uint64(2, WAD);
newMagnitudes[i] = r.Uint64(1, prevMagnitudes[i]);
}
@@ -308,11 +314,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
address staker,
IStrategy strategy,
uint256 depositSharesToWithdraw
- ) internal view returns (
- QueuedWithdrawalParams[] memory,
- Withdrawal memory,
- bytes32
- ) {
+ ) internal view returns (QueuedWithdrawalParams[] memory, Withdrawal memory, bytes32) {
IStrategy[] memory strategyArray = strategy.toArray();
QueuedWithdrawalParams[] memory queuedWithdrawalParams = new QueuedWithdrawalParams[](1);
{
@@ -345,11 +347,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
address staker,
IStrategy[] memory strategies,
uint256[] memory depositWithdrawalAmounts
- ) internal view returns (
- QueuedWithdrawalParams[] memory,
- Withdrawal memory,
- bytes32
- ) {
+ ) internal view returns (QueuedWithdrawalParams[] memory, Withdrawal memory, bytes32) {
QueuedWithdrawalParams[] memory queuedWithdrawalParams = new QueuedWithdrawalParams[](1);
{
queuedWithdrawalParams[0] = QueuedWithdrawalParams({
@@ -364,7 +362,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
for (uint256 i = 0; i < strategies.length; i++) {
scaledSharesArray[i] = _getScaledShares(staker, strategies[i], depositWithdrawalAmounts[i]);
}
-
+
Withdrawal memory withdrawal = Withdrawal({
staker: staker,
delegatedTo: delegationManager.delegatedTo(staker),
@@ -391,9 +389,14 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
delegationManager.queueWithdrawals(queuedWithdrawalParams);
}
- function _getScaledShares(address staker, IStrategy strategy, uint256 depositSharesToWithdraw) internal view returns (uint256) {
- DepositScalingFactor memory _dsf = DepositScalingFactor(delegationManager.depositScalingFactor(staker, strategy));
-
+ function _getScaledShares(
+ address staker,
+ IStrategy strategy,
+ uint256 depositSharesToWithdraw
+ ) internal view returns (uint256) {
+ DepositScalingFactor memory _dsf =
+ DepositScalingFactor(delegationManager.depositScalingFactor(staker, strategy));
+
return _dsf.scaleForQueueWithdrawal(depositSharesToWithdraw);
}
@@ -445,11 +448,8 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
uint256[] memory depositAmounts = new uint256[](1);
depositAmounts[0] = depositAmount;
IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts, isBeaconChainStrategy);
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) =
+ _setUpQueueWithdrawalsSingleStrat({
staker: staker,
strategy: strategies[0],
depositSharesToWithdraw: withdrawalAmount
@@ -462,7 +462,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
strategyManagerMock.setDeposits(staker, strategies, currentAmounts);
IERC20[] memory tokens = new IERC20[](strategies.length);
- for (uint i = 0; i < tokens.length; i++) {
+ for (uint256 i = 0; i < tokens.length; i++) {
tokens[i] = strategies[i].underlyingToken();
}
@@ -471,7 +471,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
/**
* Deploy and deposit staker into a single strategy, then set up multiple queued withdrawals for the staker
- * Assumptions:
+ * Assumptions:
* - operator is already a registered operator.
* - total deposit amount = depositAmount * numWithdrawals
* - this will fully withdraw from the single strategy
@@ -480,11 +480,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
address staker,
uint256 depositAmount,
uint256 numWithdrawals
- ) internal returns (
- Withdrawal[] memory withdrawals,
- IERC20[][] memory tokens,
- bytes32[] memory withdrawalRoots
- ) {
+ ) internal returns (Withdrawal[] memory withdrawals, IERC20[][] memory tokens, bytes32[] memory withdrawalRoots) {
uint256[] memory depositAmounts = new uint256[](1);
depositAmounts[0] = depositAmount * numWithdrawals;
IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts, false);
@@ -493,7 +489,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
tokens = new IERC20[][](numWithdrawals);
withdrawalRoots = new bytes32[](numWithdrawals);
- for (uint i = 0; i < numWithdrawals; i++) {
+ for (uint256 i = 0; i < numWithdrawals; i++) {
(
QueuedWithdrawalParams[] memory queuedWithdrawalParams,
Withdrawal memory withdrawal,
@@ -519,7 +515,6 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
currentAmounts[0] = 0;
strategyManagerMock.setDeposits(staker, strategies, currentAmounts);
}
-
return (withdrawals, tokens, withdrawalRoots);
}
@@ -536,22 +531,16 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
uint256[] memory withdrawalAmounts,
bool depositBeaconChainShares
) internal returns (Withdrawal memory, IERC20[] memory, bytes32) {
- IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts, depositBeaconChainShares);
+ IStrategy[] memory strategies =
+ _deployAndDepositIntoStrategies(staker, depositAmounts, depositBeaconChainShares);
IERC20[] memory tokens = new IERC20[](strategies.length);
for (uint256 i = 0; i < strategies.length; i++) {
tokens[i] = strategies[i].underlyingToken();
}
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawals({
- staker: staker,
- strategies: strategies,
- depositWithdrawalAmounts: withdrawalAmounts
- });
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) =
+ _setUpQueueWithdrawals({staker: staker, strategies: strategies, depositWithdrawalAmounts: withdrawalAmounts});
cheats.prank(staker);
delegationManager.queueWithdrawals(queuedWithdrawalParams);
@@ -559,11 +548,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
return (withdrawal, tokens, withdrawalRoot);
}
- function _setOperatorMagnitude(
- address operator,
- IStrategy strategy,
- uint64 magnitude
- ) internal {
+ function _setOperatorMagnitude(address operator, IStrategy strategy, uint64 magnitude) internal {
allocationManagerMock.setMaxMagnitude(operator, strategy, magnitude);
}
@@ -571,10 +556,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
address staker,
int256 beaconShares,
uint256 sharesDecrease
- ) internal returns (
- uint64 prevBeaconSlashingFactor,
- uint64 newBeaconSlashingFactor
- ) {
+ ) internal returns (uint64 prevBeaconSlashingFactor, uint64 newBeaconSlashingFactor) {
uint256 newRestakedBalanceWei = uint256(beaconShares) - sharesDecrease;
prevBeaconSlashingFactor = eigenPodManagerMock.beaconChainSlashingFactor(staker);
newBeaconSlashingFactor = uint64(prevBeaconSlashingFactor.mulDiv(newRestakedBalanceWei, uint256(beaconShares)));
@@ -586,10 +568,8 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
int256 beaconShares,
uint256 sharesDecrease
) internal returns (uint64 prevBeaconSlashingFactor, uint64 newBeaconSlashingFactor) {
- (
- prevBeaconSlashingFactor,
- newBeaconSlashingFactor
- ) = _setNewBeaconChainSlashingFactor(staker, beaconShares, sharesDecrease);
+ (prevBeaconSlashingFactor, newBeaconSlashingFactor) =
+ _setNewBeaconChainSlashingFactor(staker, beaconShares, sharesDecrease);
cheats.prank(address(eigenPodManagerMock));
delegationManager.decreaseDelegatedShares({
@@ -609,7 +589,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
string metadataURI;
}
- function _registerOperator_expectEmit(RegisterAsOperatorEmitStruct memory params) internal {
+ function _registerOperator_expectEmit(
+ RegisterAsOperatorEmitStruct memory params
+ ) internal {
cheats.expectEmit(true, true, true, true, address(delegationManager));
emit DelegationApproverUpdated(params.operator, params.delegationApprover);
cheats.expectEmit(true, true, true, true, address(delegationManager));
@@ -628,7 +610,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
uint256[] depositScalingFactors;
}
- function _delegateTo_expectEmit(DelegateToEmitStruct memory params) internal {
+ function _delegateTo_expectEmit(
+ DelegateToEmitStruct memory params
+ ) internal {
cheats.expectEmit(true, true, true, true, address(delegationManager));
emit StakerDelegated(params.staker, params.operator);
for (uint256 i = 0; i < params.strategies.length; i++) {
@@ -647,7 +631,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
uint256 depositScalingFactor;
}
- function _delegateTo_expectEmit_singleStrat(DelegateToSingleStratEmitStruct memory params) internal {
+ function _delegateTo_expectEmit_singleStrat(
+ DelegateToSingleStratEmitStruct memory params
+ ) internal {
cheats.expectEmit(true, true, true, true, address(delegationManager));
emit StakerDelegated(params.staker, params.operator);
if (params.depositShares > 0) {
@@ -684,9 +670,13 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
if (address(params.strategy) != address(0)) {
cheats.expectEmit(true, true, true, true, address(delegationManager));
- emit OperatorSharesDecreased(params.operator, params.staker, params.strategy, params.operatorSharesDecreased);
+ emit OperatorSharesDecreased(
+ params.operator, params.staker, params.strategy, params.operatorSharesDecreased
+ );
cheats.expectEmit(true, true, true, true, address(delegationManager));
- emit SlashingWithdrawalQueued(params.withdrawalRoot, params.withdrawal, params.operatorSharesDecreased.toArrayU256());
+ emit SlashingWithdrawalQueued(
+ params.withdrawalRoot, params.withdrawal, params.operatorSharesDecreased.toArrayU256()
+ );
}
}
@@ -698,7 +688,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
uint256 depositScalingFactor;
}
- function _increaseDelegatedShares_expectEmit(IncreaseDelegatedSharesEmitStruct memory params) internal {
+ function _increaseDelegatedShares_expectEmit(
+ IncreaseDelegatedSharesEmitStruct memory params
+ ) internal {
cheats.expectEmit(true, true, true, true, address(delegationManager));
emit DepositScalingFactorUpdated(params.staker, params.strategy, params.depositScalingFactor);
cheats.expectEmit(true, true, true, true, address(delegationManager));
@@ -711,7 +703,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
uint256 sharesToDecrease;
}
- function _decreaseDelegatedShares_expectEmit(DecreaseDelegatedSharesEmitStruct memory params) internal {
+ function _decreaseDelegatedShares_expectEmit(
+ DecreaseDelegatedSharesEmitStruct memory params
+ ) internal {
cheats.expectEmit(true, true, true, true, address(delegationManager));
emit OperatorSharesDecreased(params.operator, params.staker, beaconChainETHStrategy, params.sharesToDecrease);
}
@@ -724,24 +718,25 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
bytes32 withdrawalRoot;
}
- function _queueWithdrawals_expectEmit(QueueWithdrawalsEmitStruct memory params) internal {
+ function _queueWithdrawals_expectEmit(
+ QueueWithdrawalsEmitStruct memory params
+ ) internal {
for (uint256 i = 0; i < params.queuedWithdrawalParams.length; i++) {
uint256[] memory sharesToWithdraw = new uint256[](params.queuedWithdrawalParams[i].strategies.length);
for (uint256 j = 0; j < params.queuedWithdrawalParams[i].strategies.length; j++) {
- uint256 depositScalingFactor = delegationManager.depositScalingFactor(defaultStaker, params.queuedWithdrawalParams[i].strategies[j]);
- uint256 newMaxMagnitude = allocationManagerMock.getMaxMagnitudes(params.operator, params.queuedWithdrawalParams[i].strategies)[j];
+ uint256 depositScalingFactor = delegationManager.depositScalingFactor(
+ defaultStaker, params.queuedWithdrawalParams[i].strategies[j]
+ );
+ uint256 newMaxMagnitude = allocationManagerMock.getMaxMagnitudes(
+ params.operator, params.queuedWithdrawalParams[i].strategies
+ )[j];
sharesToWithdraw[j] = _calcWithdrawableShares(
- params.queuedWithdrawalParams[i].depositShares[j],
- depositScalingFactor,
- newMaxMagnitude
+ params.queuedWithdrawalParams[i].depositShares[j], depositScalingFactor, newMaxMagnitude
);
cheats.expectEmit(true, true, true, true, address(delegationManager));
emit OperatorSharesDecreased(
- params.operator,
- params.staker,
- params.queuedWithdrawalParams[i].strategies[j],
- sharesToWithdraw[j]
+ params.operator, params.staker, params.queuedWithdrawalParams[i].strategies[j], sharesToWithdraw[j]
);
}
cheats.expectEmit(true, true, true, true, address(delegationManager));
@@ -755,7 +750,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
bool receiveAsTokens;
}
- function _completeQueuedWithdrawal_expectEmit(CompleteQueuedWithdrawalEmitStruct memory params) internal {
+ function _completeQueuedWithdrawal_expectEmit(
+ CompleteQueuedWithdrawalEmitStruct memory params
+ ) internal {
if (!params.receiveAsTokens) {
address operator = delegationManager.delegatedTo(params.withdrawal.staker);
uint64[] memory slashingFactors = new uint64[](params.withdrawal.strategies.length);
@@ -766,47 +763,45 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
// Get updated deposit scaling factor
uint256 curDepositShares;
if (params.withdrawal.strategies[i] == beaconChainETHStrategy) {
- curDepositShares = uint256(eigenPodManagerMock.stakerDepositShares(params.withdrawal.staker, address(0)));
- slashingFactors[i] = uint64(slashingFactors[i]
- .mulWad(eigenPodManagerMock.beaconChainSlashingFactor(params.withdrawal.staker))
+ curDepositShares =
+ uint256(eigenPodManagerMock.stakerDepositShares(params.withdrawal.staker, address(0)));
+ slashingFactors[i] = uint64(
+ slashingFactors[i].mulWad(
+ eigenPodManagerMock.beaconChainSlashingFactor(params.withdrawal.staker)
+ )
);
} else {
- curDepositShares = strategyManagerMock.stakerDepositShares(params.withdrawal.staker, params.withdrawal.strategies[i]);
+ curDepositShares = strategyManagerMock.stakerDepositShares(
+ params.withdrawal.staker, params.withdrawal.strategies[i]
+ );
}
- uint256 sharesToWithdraw = _calcCompletedWithdrawnShares(
- params.withdrawal.scaledShares[i],
- slashingFactors[i]
- );
+ uint256 sharesToWithdraw =
+ _calcCompletedWithdrawnShares(params.withdrawal.scaledShares[i], slashingFactors[i]);
uint256 expectedDepositScalingFactor = _calcDepositScalingFactor({
- prevDsf: delegationManager.depositScalingFactor(params.withdrawal.staker, params.withdrawal.strategies[i]),
+ prevDsf: delegationManager.depositScalingFactor(
+ params.withdrawal.staker, params.withdrawal.strategies[i]
+ ),
prevDepositShares: curDepositShares,
addedDepositShares: sharesToWithdraw,
slashingFactor: slashingFactors[i]
});
cheats.expectEmit(true, true, true, true, address(delegationManager));
emit DepositScalingFactorUpdated(
- params.withdrawal.staker,
- params.withdrawal.strategies[i],
- expectedDepositScalingFactor
+ params.withdrawal.staker, params.withdrawal.strategies[i], expectedDepositScalingFactor
);
if (operator != address(0)) {
cheats.expectEmit(true, true, true, true, address(delegationManager));
emit OperatorSharesIncreased(
- operator,
- params.withdrawal.staker,
- params.withdrawal.strategies[i],
- sharesToWithdraw
- );
+ operator, params.withdrawal.staker, params.withdrawal.strategies[i], sharesToWithdraw
+ );
}
}
}
- emit SlashingWithdrawalCompleted(
- delegationManager.calculateWithdrawalRoot(params.withdrawal)
- );
+ emit SlashingWithdrawalCompleted(delegationManager.calculateWithdrawalRoot(params.withdrawal));
}
struct CompleteQueuedWithdrawalsEmitStruct {
@@ -836,7 +831,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
uint256 sharesToBurn;
}
- function _slashOperatorShares_expectEmit(SlashOperatorSharesEmitStruct memory params) internal {
+ function _slashOperatorShares_expectEmit(
+ SlashOperatorSharesEmitStruct memory params
+ ) internal {
cheats.expectEmit(true, true, true, true, address(delegationManager));
emit OperatorSharesDecreased(params.operator, address(0), params.strategy, params.sharesToDecrease);
}
@@ -853,9 +850,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
uint256 depositScalingFactor,
uint256 slashingFactor
) internal pure returns (uint256) {
- return depositShares
- .mulWad(depositScalingFactor)
- .mulWad(slashingFactor);
+ return depositShares.mulWad(depositScalingFactor).mulWad(slashingFactor);
}
function _calcCompletedWithdrawnShares(
@@ -874,17 +869,11 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
) internal pure returns (uint256) {
if (prevDepositShares == 0) return uint256(WAD).divWad(slashingFactor);
- uint256 currWithdrawableShares = _calcWithdrawableShares(
- prevDepositShares,
- prevDsf,
- slashingFactor
- );
+ uint256 currWithdrawableShares = _calcWithdrawableShares(prevDepositShares, prevDsf, slashingFactor);
uint256 newWithdrawableShares = currWithdrawableShares + addedDepositShares;
- uint256 newDsf = newWithdrawableShares
- .divWad(prevDepositShares + addedDepositShares)
- .divWad(slashingFactor);
+ uint256 newDsf = newWithdrawableShares.divWad(prevDepositShares + addedDepositShares).divWad(slashingFactor);
return newDsf;
}
@@ -913,10 +902,8 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
uint256 prevDsf,
uint256 depositAmount
) internal view {
- (
- uint256[] memory withdrawableShares,
- uint256[] memory depositShares
- ) = delegationManager.getWithdrawableShares(staker, strategy.toArray());
+ (uint256[] memory withdrawableShares, uint256[] memory depositShares) =
+ delegationManager.getWithdrawableShares(staker, strategy.toArray());
// Check deposit shares added correctly
assertEq(
depositShares[0],
@@ -936,17 +923,9 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
{
uint64 maxMagnitude = allocationManagerMock.getMaxMagnitude(operator, strategy);
uint256 slashingFactor = _getSlashingFactor(staker, strategy, maxMagnitude);
- expectedDsf = _calcDepositScalingFactor(
- prevDsf,
- depositSharesBefore,
- depositAmount,
- slashingFactor
- );
- expectedWithdrawableShares = _calcWithdrawableShares(
- depositSharesBefore + depositAmount,
- expectedDsf,
- slashingFactor
- );
+ expectedDsf = _calcDepositScalingFactor(prevDsf, depositSharesBefore, depositAmount, slashingFactor);
+ expectedWithdrawableShares =
+ _calcWithdrawableShares(depositSharesBefore + depositAmount, expectedDsf, slashingFactor);
}
// Check the new dsf is accurate
assertEq(
@@ -970,6 +949,63 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
);
}
+ /// @notice Asserts for depositShares, withdrawableShares, and depositScalingFactor after a delegation
+ function _assertDelegation(
+ address staker,
+ address operator,
+ IStrategy strategy,
+ uint256 operatorSharesBefore,
+ uint256 withdrawableSharesBefore,
+ uint256 depositSharesBefore,
+ uint256 prevDsf
+ ) internal view {
+ (uint256[] memory withdrawableShares, uint256[] memory depositShares) =
+ delegationManager.getWithdrawableShares(staker, strategy.toArray());
+ // Check deposit shares don't change
+ assertEq(
+ depositShares[0],
+ depositSharesBefore,
+ "depositShares should be equal to depositSharesBefore"
+ );
+ // Check withdrawable shares don't change
+ assertApproxEqRel(
+ withdrawableShares[0],
+ withdrawableSharesBefore,
+ APPROX_REL_DIFF,
+ "withdrawableShares should be equal to withdrawableSharesBefore"
+ );
+ // Check the new dsf is accurate
+ uint256 expectedWithdrawableShares;
+ uint256 expectedDsf;
+ {
+ uint64 maxMagnitude = allocationManagerMock.getMaxMagnitude(operator, strategy);
+ expectedDsf = prevDsf.divWad(maxMagnitude);
+ uint256 slashingFactor = _getSlashingFactor(staker, strategy, maxMagnitude);
+ expectedWithdrawableShares =
+ _calcWithdrawableShares(depositSharesBefore, expectedDsf, slashingFactor);
+ }
+ // Check the new dsf is accurate
+ assertEq(
+ expectedDsf,
+ delegationManager.depositScalingFactor(staker, strategy),
+ "depositScalingFactor should be equal to expectedDsf"
+ );
+ // Check new operatorShares increased correctly
+ if (operator != address(0)) {
+ assertEq(
+ operatorSharesBefore + withdrawableSharesBefore,
+ delegationManager.operatorShares(operator, strategy),
+ "OperatorShares not increased correctly"
+ );
+ }
+ // Check the newly calculated withdrawable shares are correct
+ assertEq(
+ withdrawableShares[0],
+ expectedWithdrawableShares,
+ "withdrawableShares should be equal to expectedWithdrawableShares"
+ );
+ }
+
/// @notice Asserts for depositShares, and operatorShares decremented properly after a withdrawal
function _assertWithdrawal(
address staker,
@@ -981,10 +1017,8 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
uint256 depositScalingFactor,
uint256 slashingFactor
) internal view {
- (
- uint256[] memory withdrawableShares,
- uint256[] memory depositShares
- ) = delegationManager.getWithdrawableShares(staker, strategy.toArray());
+ (uint256[] memory withdrawableShares, uint256[] memory depositShares) =
+ delegationManager.getWithdrawableShares(staker, strategy.toArray());
// Check deposit shares decreased correctly
assertEq(
depositShares[0],
@@ -992,22 +1026,16 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
"depositShares should be equal to depositSharesBefore - depositSharesWithdrawn"
);
// Check withdrawable shares are decreased, with rounding error
- uint256 expectedWithdrawableShares = _calcWithdrawableShares(
- depositSharesBefore - depositSharesWithdrawn,
- depositScalingFactor,
- slashingFactor
- );
+ uint256 expectedWithdrawableShares =
+ _calcWithdrawableShares(depositSharesBefore - depositSharesWithdrawn, depositScalingFactor, slashingFactor);
assertEq(
withdrawableShares[0],
expectedWithdrawableShares,
"withdrawableShares should be equal to expectedWithdrawableShares"
);
// Check operatorShares decreased properly
- uint256 expectedWithdrawnShares = _calcWithdrawableShares(
- depositSharesWithdrawn,
- depositScalingFactor,
- slashingFactor
- );
+ uint256 expectedWithdrawnShares =
+ _calcWithdrawableShares(depositSharesWithdrawn, depositScalingFactor, slashingFactor);
assertEq(
operatorSharesBefore - expectedWithdrawnShares,
delegationManager.operatorShares(operator, strategy),
@@ -1048,10 +1076,8 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
for (uint256 i = 0; i < params.withdrawal.strategies.length; i++) {
{
// assert deposit and withdrawable shares unchanged
- (
- uint256[] memory withdrawableShares,
- uint256[] memory depositShares
- ) = delegationManager.getWithdrawableShares(params.staker, params.withdrawal.strategies[i].toArray());
+ (uint256[] memory withdrawableShares, uint256[] memory depositShares) = delegationManager
+ .getWithdrawableShares(params.staker, params.withdrawal.strategies[i].toArray());
assertEq(
params.withdrawableSharesBefore[i],
withdrawableShares[0],
@@ -1080,12 +1106,11 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
for (uint256 i = 0; i < params.withdrawal.strategies.length; i++) {
// calculate shares to complete withdraw and add back as shares
if (params.withdrawal.strategies[i] == beaconChainETHStrategy) {
- params.slashingFactors[i] = uint64(params.slashingFactors[i].mulWad(params.beaconChainSlashingFactor));
+ params.slashingFactors[i] =
+ uint64(params.slashingFactors[i].mulWad(params.beaconChainSlashingFactor));
}
- uint256 sharesToAddBack = _calcCompletedWithdrawnShares(
- params.withdrawal.scaledShares[i],
- params.slashingFactors[i]
- );
+ uint256 sharesToAddBack =
+ _calcCompletedWithdrawnShares(params.withdrawal.scaledShares[i], params.slashingFactors[i]);
// assert deposit shares, withdrawable shares, and operator shares, and depositScalingFactor
_assertDeposit({
staker: params.staker,
@@ -1102,19 +1127,13 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
}
/// @notice assert withdrawals completed are reflected as completed in storage for the withdrawal root and staker
- function _assertWithdrawalRootsComplete(
- address staker,
- Withdrawal[] memory withdrawals
- ) internal view {
+ function _assertWithdrawalRootsComplete(address staker, Withdrawal[] memory withdrawals) internal view {
for (uint256 i = 0; i < withdrawals.length; ++i) {
// Check the withdrawal root is no longer pending
// and also doesn't exist in storage for the staker
bytes32 withdrawalRootToCheck = delegationManager.calculateWithdrawalRoot(withdrawals[i]);
- assertFalse(
- delegationManager.pendingWithdrawals(withdrawalRootToCheck),
- "withdrawalRoot not pending"
- );
- (Withdrawal[] memory withdrawalsInStorage, ) = delegationManager.getQueuedWithdrawals(staker);
+ assertFalse(delegationManager.pendingWithdrawals(withdrawalRootToCheck), "withdrawalRoot not pending");
+ (Withdrawal[] memory withdrawalsInStorage,) = delegationManager.getQueuedWithdrawals(staker);
for (uint256 j = 0; j < withdrawalsInStorage.length; ++j) {
assertTrue(
withdrawalRootToCheck != delegationManager.calculateWithdrawalRoot(withdrawalsInStorage[j]),
@@ -1157,7 +1176,7 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
uint256 prevMaxMagnitude,
uint256 currMaxMagnitude
) internal view {
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategy.toArray());
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategy.toArray());
assertApproxEqRel(
uint256(withdrawableSharesBefore).mulDiv(currMaxMagnitude, prevMaxMagnitude),
@@ -1179,7 +1198,8 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
uint256 expectedWithdrawableShares,
uint256 prevBeaconSlashingFactor
) internal view {
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray());
+ (uint256[] memory withdrawableShares,) =
+ delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray());
uint256 currBeaconSlashingFactor = eigenPodManagerMock.beaconChainSlashingFactor(defaultStaker);
assertEq(
withdrawableShares[0],
@@ -1195,26 +1215,17 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
}
/// @notice Due to rounding, withdrawable shares and operator shares may not align even if the operator
- /// only has the single staker with deposits.
+ /// only has the single staker with deposits.
function _assertWithdrawableAndOperatorShares(
uint256 withdrawableShares,
uint256 operatorShares,
string memory errorMessage
) internal pure {
- if (withdrawableShares > 0 ) {
- assertApproxEqRel(
- withdrawableShares,
- operatorShares,
- APPROX_REL_DIFF,
- errorMessage
- );
- } else {
-
- }
+ if (withdrawableShares > 0) {
+ assertApproxEqRel(withdrawableShares, operatorShares, APPROX_REL_DIFF, errorMessage);
+ } else {}
assertLe(
- withdrawableShares,
- operatorShares,
- "withdrawableShares should be less than or equal to operatorShares"
+ withdrawableShares, operatorShares, "withdrawableShares should be less than or equal to operatorShares"
);
}
@@ -1227,49 +1238,22 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
address staker
) internal view {
for (uint256 i = 0; i < stakerQueuedWithdrawals[staker].length; ++i) {
- Withdrawal memory withdrawal = stakerQueuedWithdrawals[staker][i];
+ Withdrawal memory withdrawal = stakerQueuedWithdrawals[staker][i];
bytes32 withdrawalRootToCheck = delegationManager.calculateWithdrawalRoot(withdrawal);
- assertTrue(
- delegationManager.pendingWithdrawals(withdrawalRootToCheck),
- "withdrawalRoot not pending"
- );
+ assertTrue(delegationManager.pendingWithdrawals(withdrawalRootToCheck), "withdrawalRoot not pending");
- (Withdrawal[] memory withdrawals, ) = delegationManager.getQueuedWithdrawals(staker);
+ (Withdrawal[] memory withdrawals,) = delegationManager.getQueuedWithdrawals(staker);
for (uint256 j = 0; j < withdrawals.length; ++j) {
if (withdrawalRootToCheck == delegationManager.calculateWithdrawalRoot(withdrawals[j])) {
- assertEq(
- withdrawals[j].staker,
- withdrawal.staker
- );
- assertEq(
- withdrawals[j].withdrawer,
- withdrawal.withdrawer
- );
- assertEq(
- withdrawals[j].delegatedTo,
- withdrawal.delegatedTo
- );
- assertEq(
- withdrawals[j].nonce,
- withdrawal.nonce
- );
- assertEq(
- withdrawals[j].startBlock,
- withdrawal.startBlock
- );
- assertEq(
- withdrawals[j].scaledShares.length,
- withdrawal.scaledShares.length
- );
+ assertEq(withdrawals[j].staker, withdrawal.staker);
+ assertEq(withdrawals[j].withdrawer, withdrawal.withdrawer);
+ assertEq(withdrawals[j].delegatedTo, withdrawal.delegatedTo);
+ assertEq(withdrawals[j].nonce, withdrawal.nonce);
+ assertEq(withdrawals[j].startBlock, withdrawal.startBlock);
+ assertEq(withdrawals[j].scaledShares.length, withdrawal.scaledShares.length);
for (uint256 k = 0; k < withdrawal.scaledShares.length; ++k) {
- assertEq(
- withdrawals[j].scaledShares[k],
- withdrawal.scaledShares[k]
- );
- assertEq(
- address(withdrawals[j].strategies[k]),
- address(withdrawal.strategies[k])
- );
+ assertEq(withdrawals[j].scaledShares[k], withdrawal.scaledShares[k]);
+ assertEq(address(withdrawals[j].strategies[k]), address(withdrawal.strategies[k]));
}
}
}
@@ -1281,51 +1265,21 @@ contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManag
* - Asserts exact match of Withdrawal struct exists in storage
* - Asserts Withdrawal root is pending
*/
- function _assertQueuedWithdrawalExists(
- address staker,
- Withdrawal memory withdrawal
- ) internal view {
+ function _assertQueuedWithdrawalExists(address staker, Withdrawal memory withdrawal) internal view {
bytes32 withdrawalRootToCheck = delegationManager.calculateWithdrawalRoot(withdrawal);
- assertTrue(
- delegationManager.pendingWithdrawals(withdrawalRootToCheck),
- "withdrawalRoot not pending"
- );
+ assertTrue(delegationManager.pendingWithdrawals(withdrawalRootToCheck), "withdrawalRoot not pending");
- (Withdrawal[] memory withdrawals, ) = delegationManager.getQueuedWithdrawals(staker);
+ (Withdrawal[] memory withdrawals,) = delegationManager.getQueuedWithdrawals(staker);
for (uint256 i = 0; i < withdrawals.length; ++i) {
- assertEq(
- withdrawals[i].staker,
- withdrawal.staker
- );
- assertEq(
- withdrawals[i].withdrawer,
- withdrawal.withdrawer
- );
- assertEq(
- withdrawals[i].delegatedTo,
- withdrawal.delegatedTo
- );
- assertEq(
- withdrawals[i].nonce,
- withdrawal.nonce
- );
- assertEq(
- withdrawals[i].startBlock,
- withdrawal.startBlock
- );
- assertEq(
- withdrawals[i].scaledShares.length,
- withdrawal.scaledShares.length
- );
+ assertEq(withdrawals[i].staker, withdrawal.staker);
+ assertEq(withdrawals[i].withdrawer, withdrawal.withdrawer);
+ assertEq(withdrawals[i].delegatedTo, withdrawal.delegatedTo);
+ assertEq(withdrawals[i].nonce, withdrawal.nonce);
+ assertEq(withdrawals[i].startBlock, withdrawal.startBlock);
+ assertEq(withdrawals[i].scaledShares.length, withdrawal.scaledShares.length);
for (uint256 j = 0; j < withdrawal.scaledShares.length; ++j) {
- assertEq(
- withdrawals[i].scaledShares[j],
- withdrawal.scaledShares[j]
- );
- assertEq(
- address(withdrawals[i].strategies[j]),
- address(withdrawal.strategies[j])
- );
+ assertEq(withdrawals[i].scaledShares[j], withdrawal.scaledShares[j]);
+ assertEq(address(withdrawals[i].strategies[j]), address(withdrawal.strategies[j]));
}
}
}
@@ -1361,6 +1315,19 @@ contract DelegationManagerUnitTests_Initialization_Setters is DelegationManagerU
);
assertEq(delegationManager.owner(), address(this), "constructor / initializer incorrect, owner set wrong");
assertEq(delegationManager.paused(), 0, "constructor / initializer incorrect, paused status set wrong");
+
+ bytes memory v = bytes(delegationManager.version());
+ bytes32 expectedDomainSeparator = keccak256(
+ abi.encode(
+ EIP712_DOMAIN_TYPEHASH,
+ keccak256(bytes("EigenLayer")),
+ keccak256(bytes.concat(v[0], v[1])),
+ block.chainid,
+ address(delegationManager)
+ )
+ );
+
+ assertEq(delegationManager.domainSeparator(), expectedDomainSeparator, "sanity check");
}
/// @notice Verifies that the DelegationManager cannot be initialized multiple times
@@ -1372,7 +1339,7 @@ contract DelegationManagerUnitTests_Initialization_Setters is DelegationManagerU
contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerUnitTests {
using ArrayLib for *;
-
+
function test_registerAsOperator_revert_paused() public {
// set the pausing flag
cheats.prank(pauser);
@@ -1422,9 +1389,7 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU
// Storage checks
assertEq(
- delegationApprover,
- delegationManager.delegationApprover(operator),
- "delegationApprover not set correctly"
+ delegationApprover, delegationManager.delegationApprover(operator), "delegationApprover not set correctly"
);
assertEq(delegationManager.delegatedTo(operator), operator, "operator not delegated to self");
}
@@ -1455,17 +1420,10 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU
})
);
_registerOperator(operator2, delegationApprover2, emptyStringForMetadataURI);
- assertTrue(
- delegationManager.isOperator(operator1),
- "operator1 not registered"
- );
- assertTrue(
- delegationManager.isOperator(operator2),
- "operator2 not registered"
- );
+ assertTrue(delegationManager.isOperator(operator1), "operator1 not registered");
+ assertTrue(delegationManager.isOperator(operator2), "operator2 not registered");
}
-
// @notice Verifies that a staker who is actively delegated to an operator cannot register as an operator (without first undelegating, at least)
function testFuzz_Revert_registerAsOperator_cannotRegisterWhileDelegated(
address staker,
@@ -1478,7 +1436,7 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU
// delegate from the `staker` to the operator
cheats.startPrank(staker);
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry;
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry;
delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt);
// expect revert if attempt to register as operator
@@ -1487,12 +1445,14 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU
cheats.stopPrank();
}
-
+
/// @notice Add test for registerAsOperator where the operator has existing deposits in strategies
/// Assert:
/// depositShares == operatorShares == withdrawableShares
/// check operatorDetails hash encode matches the operatorDetails hash stored (call view function)
- function testFuzz_registerAsOperator_withDeposits(Randomness r) public rand(r) {
+ function testFuzz_registerAsOperator_withDeposits(
+ Randomness r
+ ) public rand(r) {
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES);
// Set staker shares in StrategyManager
IStrategy[] memory strategiesToReturn = strategyMock.toArray();
@@ -1513,12 +1473,9 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU
// check depositShares == operatorShares == withdrawableShares
assertEq(operatorSharesAfter, shares, "operator shares not set correctly");
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(defaultOperator, strategiesToReturn);
- assertEq(
- withdrawableShares[0],
- shares,
- "withdrawable shares not set correctly"
- );
+ (uint256[] memory withdrawableShares,) =
+ delegationManager.getWithdrawableShares(defaultOperator, strategiesToReturn);
+ assertEq(withdrawableShares[0], shares, "withdrawable shares not set correctly");
assertEq(
strategyManagerMock.stakerDepositShares(defaultOperator, strategyMock),
shares,
@@ -1535,10 +1492,7 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU
* Reverts if operator tries to decrease their `stakerOptOutWindowBlocks` parameter
* @param delegationApprover1 and @param delegationApprover2 are fuzzed inputs
*/
- function testFuzz_modifyOperatorParameters(
- address delegationApprover1,
- address delegationApprover2
- ) public {
+ function testFuzz_modifyOperatorParameters(address delegationApprover1, address delegationApprover2) public {
_registerOperator_expectEmit(
RegisterAsOperatorEmitStruct({
operator: defaultOperator,
@@ -1574,7 +1528,6 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU
delegationManager.updateOperatorMetadataURI(defaultOperator, emptyStringForMetadataURI);
}
-
function test_Revert_updateOperatorMetadataUri_notOperator() public {
cheats.expectRevert(OperatorNotRegistered.selector);
delegationManager.modifyOperatorDetails(defaultOperator, defaultOperator);
@@ -1585,7 +1538,9 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU
* @dev This is an important check to ensure that our definition of 'operator' remains consistent, in particular for preserving the
* invariant that 'operators' are always delegated to themselves
*/
- function testFuzz_UpdateOperatorMetadataURI(string memory metadataURI) public {
+ function testFuzz_UpdateOperatorMetadataURI(
+ string memory metadataURI
+ ) public {
_registerOperatorWithBaseDetails(defaultOperator);
// call `updateOperatorMetadataURI` and check for event
@@ -1622,7 +1577,9 @@ contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerU
);
}
- function testFuzz_UAM_updateOperatorMetadataURI(string memory metadataURI) public {
+ function testFuzz_UAM_updateOperatorMetadataURI(
+ string memory metadataURI
+ ) public {
// Set admin
cheats.prank(defaultOperator);
permissionController.setAppointee(
@@ -1647,17 +1604,13 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
function test_Revert_WhenPaused() public {
cheats.prank(defaultOperator);
- delegationManager.registerAsOperator(
- address(0),
- 0,
- emptyStringForMetadataURI
- );
+ delegationManager.registerAsOperator(address(0), 0, emptyStringForMetadataURI);
// set the pausing flag
cheats.prank(pauser);
delegationManager.pause(2 ** PAUSED_NEW_DELEGATION);
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry;
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry;
cheats.prank(defaultStaker);
cheats.expectRevert(IPausable.CurrentlyPaused.selector);
delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt);
@@ -1668,7 +1621,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
*/
function testFuzz_Revert_WhenDelegateWhileDelegated(
Randomness r,
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry
) public rand(r) {
address staker = r.Address();
address operator = r.Address();
@@ -1685,7 +1638,9 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
}
/// @notice Verifies that `staker` cannot delegate to an unregistered `operator`
- function testFuzz_Revert_WhenDelegateToUnregisteredOperator(Randomness r) public rand(r) {
+ function testFuzz_Revert_WhenDelegateToUnregisteredOperator(
+ Randomness r
+ ) public rand(r) {
address staker = r.Address();
address operator = r.Address();
assertFalse(delegationManager.isOperator(operator), "incorrect test input?");
@@ -1693,7 +1648,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// try to delegate and check that the call reverts
cheats.prank(staker);
cheats.expectRevert(OperatorNotRegistered.selector);
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry;
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry;
delegationManager.delegateTo(operator, approverSignatureAndExpiry, emptySalt);
}
@@ -1711,7 +1666,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
*/
function testFuzz_OperatorWhoAcceptsAllStakers_StrategyManagerShares(
Randomness r,
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry
) public rand(r) {
address staker = r.Address();
bytes32 salt = r.Bytes32();
@@ -1721,10 +1676,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt hasn't been used before
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
// Set staker shares in StrategyManager
@@ -1757,10 +1709,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator");
// verify that the salt is still marked as unused (since it wasn't checked or used)
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
}
@@ -1780,7 +1729,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
*/
function testFuzz_OperatorWhoAcceptsAllStakers_beaconChainStrategyShares(
Randomness r,
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry
) public rand(r) {
address staker = r.Address();
bytes32 salt = r.Bytes32();
@@ -1792,10 +1741,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt hasn't been used before
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
// Set staker shares in BeaconChainStrategy
@@ -1829,13 +1775,11 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator");
// verify that the salt is still marked as unused (since it wasn't checked or used)
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray());
+ (uint256[] memory withdrawableShares,) =
+ delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray());
_assertWithdrawableAndOperatorShares(
withdrawableShares[0],
delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy),
@@ -1873,14 +1817,15 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
cheats.expectRevert(FullySlashed.selector);
delegationManager.delegateTo(defaultOperator, emptyApproverSignatureAndExpiry, emptySalt);
- assertTrue(delegationManager.delegatedTo(staker) != defaultOperator, "staker should not be delegated to the operator");
+ assertTrue(
+ delegationManager.delegatedTo(staker) != defaultOperator, "staker should not be delegated to the operator"
+ );
assertFalse(delegationManager.isDelegated(staker), "staker should not be delegated");
assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator");
// verify that the salt is still marked as unused (since it wasn't checked or used)
assertFalse(
delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- emptySalt
+ delegationManager.delegationApprover(defaultOperator), emptySalt
),
"salt somehow spent too early?"
);
@@ -1899,7 +1844,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
*/
function testFuzz_Revert_OperatorWhoAcceptsAllStakers_AlreadySlashed100Percent_BeaconChainStrategyShares(
Randomness r,
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry
) public rand(r) {
address staker = r.Address();
bytes32 salt = r.Bytes32();
@@ -1909,10 +1854,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt hasn't been used before
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
// Set staker shares in BeaconChainStrategy
@@ -1933,15 +1875,14 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
beaconSharesAfter,
"operator beaconchain shares should not have increased with negative shares"
);
- assertTrue(delegationManager.delegatedTo(staker) != defaultOperator, "staker should not be delegated to the operator");
+ assertTrue(
+ delegationManager.delegatedTo(staker) != defaultOperator, "staker should not be delegated to the operator"
+ );
assertFalse(delegationManager.isDelegated(staker), "staker should not be delegated");
assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator");
// verify that the salt is still marked as unused (since it wasn't checked or used)
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
}
@@ -2001,13 +1942,12 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt is still marked as unused (since it wasn't checked or used)
assertFalse(
delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- emptySalt
+ delegationManager.delegationApprover(defaultOperator), emptySalt
),
"salt somehow spent too early?"
);
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray());
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray());
_assertWithdrawableAndOperatorShares(
withdrawableShares[0],
delegationManager.operatorShares(defaultOperator, strategyMock),
@@ -2070,15 +2010,13 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt is still marked as unused (since it wasn't checked or used)
assertFalse(
delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- emptySalt
+ delegationManager.delegationApprover(defaultOperator), emptySalt
),
"salt somehow spent too early?"
);
- (
- uint256[] memory withdrawableShares,
- ) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray());
+ (uint256[] memory withdrawableShares,) =
+ delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray());
_assertWithdrawableAndOperatorShares(
withdrawableShares[0],
delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy),
@@ -2095,7 +2033,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
* - depositShares incremented for staker correctly
* - withdrawableShares are correct
* - depositScalingFactor is updated correctly
- * - operatorShares increase by depositShares amount
+ * - operatorShares increase by withdrawableShares amount
* - defaultOperator is an operator, staker is delegated to defaultOperator, staker is not an operator
* - That the staker withdrawableShares is <= operatorShares (less due to rounding from non-WAD maxMagnitude)
*/
@@ -2113,6 +2051,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
eigenPodManagerMock.setBeaconChainSlashingFactor(staker, beaconChainSlashingFactor);
// Set staker shares in BeaconChainStrategy
eigenPodManagerMock.setPodOwnerShares(staker, beaconShares);
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray());
// delegate from the `staker` to the operator, check for events emitted
cheats.startPrank(staker);
@@ -2121,21 +2060,20 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
staker: staker,
operator: defaultOperator,
strategy: beaconChainETHStrategy,
- depositShares: beaconShares > 0 ? uint256(beaconShares) : 0,
- depositScalingFactor: uint256(WAD).divWad(maxMagnitude.mulWad(beaconChainSlashingFactor))
+ depositShares: beaconShares > 0 ? withdrawableShares[0] : 0,
+ depositScalingFactor: uint256(WAD).divWad(maxMagnitude)
})
);
delegationManager.delegateTo(defaultOperator, emptyApproverSignatureAndExpiry, emptySalt);
- _assertDeposit({
+ _assertDelegation({
staker: staker,
operator: defaultOperator,
strategy: beaconChainETHStrategy,
operatorSharesBefore: 0,
- withdrawableSharesBefore: 0,
- depositSharesBefore: 0,
- prevDsf: WAD,
- depositAmount: uint256(beaconShares)
+ withdrawableSharesBefore: withdrawableShares[0],
+ depositSharesBefore: uint256(beaconShares),
+ prevDsf: WAD
});
assertTrue(delegationManager.isOperator(defaultOperator), "staker not registered as operator");
assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address");
@@ -2143,17 +2081,15 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt is still marked as unused (since it wasn't checked or used)
assertFalse(
delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- emptySalt
+ delegationManager.delegationApprover(defaultOperator), emptySalt
),
"salt somehow spent too early?"
);
- (
- uint256[] memory withdrawableShares,
- ) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray());
+ (uint256[] memory withdrawableSharesAfter,) =
+ delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray());
_assertWithdrawableAndOperatorShares(
- withdrawableShares[0],
+ withdrawableSharesAfter[0],
delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy),
"withdrawableShares not set correctly"
);
@@ -2174,7 +2110,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
*/
function testFuzz_OperatorWhoAcceptsAllStakers_BeaconChainAndStrategyManagerShares(
Randomness r,
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry
) public rand(r) {
address staker = r.Address();
bytes32 salt = r.Bytes32();
@@ -2185,19 +2121,14 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt hasn't been used before
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
// Set staker shares in BeaconChainStrategy and StrategyManager
strategyManagerMock.addDeposit(staker, strategyMock, shares);
eigenPodManagerMock.setPodOwnerShares(staker, beaconShares);
- (
- IStrategy[] memory strategiesToReturn,
- uint256[] memory sharesToReturn
- ) = delegationManager.getDepositedShares(staker);
+ (IStrategy[] memory strategiesToReturn, uint256[] memory sharesToReturn) =
+ delegationManager.getDepositedShares(staker);
uint256[] memory depositScalingFactors = new uint256[](2);
depositScalingFactors[0] = uint256(WAD);
depositScalingFactors[1] = uint256(WAD);
@@ -2235,7 +2166,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
prevDsf: WAD,
depositAmount: shares
});
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategiesToReturn);
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategiesToReturn);
_assertWithdrawableAndOperatorShares(
withdrawableShares[0],
delegationManager.operatorShares(defaultOperator, strategyMock),
@@ -2252,10 +2183,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator");
// verify that the salt is still marked as unused (since it wasn't checked or used)
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
}
@@ -2289,10 +2217,8 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// 2. Set staker shares in BeaconChainStrategy and StrategyManager
strategyManagerMock.addDeposit(defaultStaker, strategyMock, shares);
eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares);
- (
- IStrategy[] memory strategiesToReturn,
- uint256[] memory sharesToReturn
- ) = delegationManager.getDepositedShares(defaultStaker);
+ (IStrategy[] memory strategiesToReturn, uint256[] memory sharesToReturn) =
+ delegationManager.getDepositedShares(defaultStaker);
// 3. delegate from the `staker` to the operator with expected emitted events
cheats.startPrank(defaultStaker);
@@ -2333,17 +2259,21 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
depositAmount: shares
});
assertTrue(delegationManager.isOperator(defaultOperator), "defaultStaker not registered as operator");
- assertEq(delegationManager.delegatedTo(defaultStaker), defaultOperator, "defaultStaker delegated to the wrong address");
+ assertEq(
+ delegationManager.delegatedTo(defaultStaker),
+ defaultOperator,
+ "defaultStaker delegated to the wrong address"
+ );
assertFalse(delegationManager.isOperator(defaultStaker), "staker incorrectly registered as operator");
// verify that the salt is still marked as unused (since it wasn't checked or used)
assertFalse(
delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- emptySalt
+ delegationManager.delegationApprover(defaultOperator), emptySalt
),
"salt somehow spent too early?"
);
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategiesToReturn);
+ (uint256[] memory withdrawableShares,) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategiesToReturn);
_assertWithdrawableAndOperatorShares(
withdrawableShares[0],
delegationManager.operatorShares(defaultOperator, strategyMock),
@@ -2363,7 +2293,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
*/
function testFuzz_OperatorWhoAcceptsAllStakers_ZeroDelegatableShares(
Randomness r,
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry
) public rand(r) {
address staker = r.Address();
bytes32 salt = r.Bytes32();
@@ -2371,10 +2301,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt hasn't been used before
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
@@ -2390,10 +2317,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator");
// verify that the salt is still marked as unused (since it wasn't checked or used)
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
}
@@ -2413,7 +2337,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
_registerOperatorWithDelegationApprover(defaultOperator);
// calculate the delegationSigner's signature
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
delegationSignerPrivateKey,
staker,
defaultOperator,
@@ -2423,7 +2347,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// delegate from the `staker` to the operator
cheats.startPrank(staker);
- cheats.expectRevert(ISignatureUtils.SignatureExpired.selector);
+ cheats.expectRevert(ISignatureUtilsMixinErrors.SignatureExpired.selector);
delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt);
cheats.stopPrank();
}
@@ -2443,14 +2367,11 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt hasn't been used before
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
// calculate the delegationSigner's signature
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
delegationSignerPrivateKey,
staker,
defaultOperator,
@@ -2463,10 +2384,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
cheats.startPrank(staker);
delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt);
assertTrue(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent not spent?"
);
delegationManager.undelegate(staker);
@@ -2487,15 +2405,11 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
_registerOperatorWithDelegationApprover(defaultOperator);
// calculate the signature
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry;
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry;
approverSignatureAndExpiry.expiry = expiry;
{
bytes32 digestHash = delegationManager.calculateDelegationApprovalDigestHash(
- staker,
- defaultOperator,
- delegationManager.delegationApprover(defaultOperator),
- emptySalt,
- expiry
+ staker, defaultOperator, delegationManager.delegationApprover(defaultOperator), emptySalt, expiry
);
(uint8 v, bytes32 r, bytes32 s) = cheats.sign(delegationSignerPrivateKey, digestHash);
// mess up the signature by flipping v's parity
@@ -2505,7 +2419,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// try to delegate from the `staker` to the operator, and check reversion
cheats.startPrank(staker);
- cheats.expectRevert(ISignatureUtils.InvalidSignature.selector);
+ cheats.expectRevert(ISignatureUtilsMixinErrors.InvalidSignature.selector);
delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt);
cheats.stopPrank();
}
@@ -2519,7 +2433,9 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
* Reverts if the staker is already delegated (to the operator or to anyone else)
* Reverts if the ‘operator’ is not actually registered as an operator
*/
- function testFuzz_OperatorWhoRequiresECDSASignature(Randomness r) public rand(r) {
+ function testFuzz_OperatorWhoRequiresECDSASignature(
+ Randomness r
+ ) public rand(r) {
address staker = r.Address();
bytes32 salt = r.Bytes32();
uint256 expiry = r.Uint256(block.timestamp, type(uint256).max);
@@ -2528,14 +2444,11 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt hasn't been used before
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
// calculate the delegationSigner's signature
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
delegationSignerPrivateKey,
staker,
defaultOperator,
@@ -2558,8 +2471,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt is still marked as unused (since it wasn't checked or used)
assertFalse(
delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
+ delegationManager.delegationApprover(defaultOperator), salt
),
"salt somehow spent too incorrectly?"
);
@@ -2567,8 +2479,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt is marked as used
assertTrue(
delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
+ delegationManager.delegationApprover(defaultOperator), salt
),
"salt somehow spent not spent?"
);
@@ -2597,14 +2508,11 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt hasn't been used before
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
// calculate the delegationSigner's signature
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
delegationSignerPrivateKey,
staker,
defaultOperator,
@@ -2640,7 +2548,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator");
assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address");
assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator");
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray());
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray());
_assertWithdrawableAndOperatorShares(
withdrawableShares[0],
delegationManager.operatorShares(defaultOperator, strategyMock),
@@ -2651,8 +2559,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt is still marked as unused (since it wasn't checked or used)
assertFalse(
delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
+ delegationManager.delegationApprover(defaultOperator), salt
),
"salt somehow spent too incorrectly?"
);
@@ -2660,8 +2567,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt is marked as used
assertTrue(
delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
+ delegationManager.delegationApprover(defaultOperator), salt
),
"salt somehow spent not spent?"
);
@@ -2690,14 +2596,11 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt hasn't been used before
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
// calculate the delegationSigner's signature
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
delegationSignerPrivateKey,
staker,
defaultOperator,
@@ -2731,9 +2634,8 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
prevDsf: WAD,
depositAmount: uint256(beaconShares)
});
- (
- uint256[] memory withdrawableShares,
- ) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray());
+ (uint256[] memory withdrawableShares,) =
+ delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray());
_assertWithdrawableAndOperatorShares(
withdrawableShares[0],
delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy),
@@ -2746,8 +2648,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt is still marked as unused (since it wasn't checked or used)
assertFalse(
delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
+ delegationManager.delegationApprover(defaultOperator), salt
),
"salt somehow spent too incorrectly?"
);
@@ -2755,8 +2656,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt is marked as used
assertTrue(
delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
+ delegationManager.delegationApprover(defaultOperator), salt
),
"salt somehow spent not spent?"
);
@@ -2788,14 +2688,11 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt hasn't been used before
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
// calculate the delegationSigner's signature
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
delegationSignerPrivateKey,
staker,
defaultOperator,
@@ -2809,10 +2706,8 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
depositScalingFactors[1] = uint256(WAD);
strategyManagerMock.addDeposit(staker, strategyMock, shares);
eigenPodManagerMock.setPodOwnerShares(staker, beaconShares);
- (
- IStrategy[] memory strategiesToReturn,
- uint256[] memory sharesToReturn
- ) = delegationManager.getDepositedShares(staker);
+ (IStrategy[] memory strategiesToReturn, uint256[] memory sharesToReturn) =
+ delegationManager.getDepositedShares(staker);
// delegate from the `staker` to the operator
cheats.startPrank(staker);
_delegateTo_expectEmit(
@@ -2847,7 +2742,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
prevDsf: WAD,
depositAmount: shares
});
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategiesToReturn);
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategiesToReturn);
_assertWithdrawableAndOperatorShares(
withdrawableShares[0],
delegationManager.operatorShares(defaultOperator, strategyMock),
@@ -2865,8 +2760,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt is still marked as unused (since it wasn't checked or used)
assertFalse(
delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
+ delegationManager.delegationApprover(defaultOperator), salt
),
"salt somehow spent too incorrectly?"
);
@@ -2874,8 +2768,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt is marked as used
assertTrue(
delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
+ delegationManager.delegationApprover(defaultOperator), salt
),
"salt somehow spent not spent?"
);
@@ -2899,12 +2792,12 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
_registerOperatorWithDelegationApprover(defaultOperator);
// create the signature struct
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry;
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry;
approverSignatureAndExpiry.expiry = expiry;
// try to delegate from the `staker` to the operator, and check reversion
cheats.startPrank(staker);
- cheats.expectRevert(ISignatureUtils.SignatureExpired.selector);
+ cheats.expectRevert(ISignatureUtilsMixinErrors.SignatureExpired.selector);
delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt);
cheats.stopPrank();
}
@@ -2926,7 +2819,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
_registerOperatorWith1271DelegationApprover(defaultOperator);
// calculate the delegationSigner's signature
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
delegationSignerPrivateKey,
staker,
defaultOperator,
@@ -2961,7 +2854,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
_registerOperator(defaultOperator, address(wallet), emptyStringForMetadataURI);
// create the signature struct
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry;
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry;
approverSignatureAndExpiry.expiry = expiry;
// try to delegate from the `staker` to the operator, and check reversion
@@ -2990,7 +2883,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// calculate the delegationSigner's but this is not the correct signature from the wallet contract
// since the wallet owner is address(1)
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
delegationSignerPrivateKey,
staker,
defaultOperator,
@@ -3001,7 +2894,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// try to delegate from the `staker` to the operator, and check reversion
cheats.startPrank(staker);
// Signature should fail as the wallet will not return EIP1271_MAGICVALUE
- cheats.expectRevert(ISignatureUtils.InvalidSignature.selector);
+ cheats.expectRevert(ISignatureUtilsMixinErrors.InvalidSignature.selector);
delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt);
cheats.stopPrank();
}
@@ -3016,7 +2909,9 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
* Reverts if the staker is already delegated (to the operator or to anyone else)
* Reverts if the ‘operator’ is not actually registered as an operator
*/
- function testFuzz_OperatorWhoRequiresEIP1271Signature(Randomness r) public rand(r) {
+ function testFuzz_OperatorWhoRequiresEIP1271Signature(
+ Randomness r
+ ) public rand(r) {
address staker = r.Address();
bytes32 salt = r.Bytes32();
uint256 expiry = r.Uint256(block.timestamp, type(uint256).max);
@@ -3025,14 +2920,11 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt hasn't been used before
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(defaultOperator), salt),
"salt somehow spent too early?"
);
// calculate the delegationSigner's signature
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
delegationSignerPrivateKey,
staker,
defaultOperator,
@@ -3056,8 +2948,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt is still marked as unused (since it wasn't checked or used)
assertFalse(
delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
+ delegationManager.delegationApprover(defaultOperator), salt
),
"salt somehow spent too incorrectly?"
);
@@ -3065,8 +2956,7 @@ contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
// verify that the salt is marked as used
assertTrue(
delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(defaultOperator),
- salt
+ delegationManager.delegationApprover(defaultOperator), salt
),
"salt somehow spent not spent?"
);
@@ -3080,7 +2970,9 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
using Math for *;
/// @notice Verifies that `DelegationManager.increaseDelegatedShares` reverts if not called by the StrategyManager nor EigenPodManager
- function testFuzz_Revert_increaseDelegatedShares_invalidCaller(Randomness r) public rand(r) {
+ function testFuzz_Revert_increaseDelegatedShares_invalidCaller(
+ Randomness r
+ ) public rand(r) {
address invalidCaller = r.Address();
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES);
cheats.expectRevert(IDelegationManagerErrors.OnlyStrategyManagerOrEigenPodManager.selector);
@@ -3100,27 +2992,19 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
// Register operator
_registerOperatorWithBaseDetails(defaultOperator);
// Set operator magnitude
- _setOperatorMagnitude({
- operator: defaultOperator,
- strategy: strategyMock,
- magnitude: 0
- });
+ _setOperatorMagnitude({operator: defaultOperator, strategy: strategyMock, magnitude: 0});
// delegate from the `staker` to the operator
_delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator);
- uint256 _delegatedSharesBefore = delegationManager.operatorShares(
- delegationManager.delegatedTo(staker),
- strategyMock
- );
+ uint256 _delegatedSharesBefore =
+ delegationManager.operatorShares(delegationManager.delegatedTo(staker), strategyMock);
cheats.prank(address(strategyManagerMock));
cheats.expectRevert(FullySlashed.selector);
delegationManager.increaseDelegatedShares(staker, strategyMock, 0, shares);
- uint256 delegatedSharesAfter = delegationManager.operatorShares(
- delegationManager.delegatedTo(staker),
- strategyMock
- );
+ uint256 delegatedSharesAfter =
+ delegationManager.operatorShares(delegationManager.delegatedTo(staker), strategyMock);
assertEq(delegatedSharesAfter, _delegatedSharesBefore, "delegated shares incremented incorrectly");
assertEq(_delegatedSharesBefore, 0, "nonzero shares delegated to zero address!");
@@ -3143,11 +3027,7 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
// 1. Register operator with initial operator magnitude and delegate staker to operator
_registerOperatorWithBaseDetails(defaultOperator);
- _setOperatorMagnitude({
- operator: defaultOperator,
- strategy: strategyMock,
- magnitude: initialMagnitude
- });
+ _setOperatorMagnitude({operator: defaultOperator, strategy: strategyMock, magnitude: initialMagnitude});
_delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator);
// 2. set staker initial shares and increase delegated shares
IStrategy[] memory strategiesDeposited = strategyMock.toArray();
@@ -3167,18 +3047,14 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
prevDsf: WAD,
depositAmount: existingShares
});
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategiesDeposited);
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategiesDeposited);
_assertWithdrawableAndOperatorShares(
withdrawableShares[0],
delegationManager.operatorShares(defaultOperator, strategyMock),
"Shares not increased correctly"
);
// 3. Now set operator magnitude to 0 (100% slashed)
- _setOperatorMagnitude({
- operator: defaultOperator,
- strategy: strategyMock,
- magnitude: 0
- });
+ _setOperatorMagnitude({operator: defaultOperator, strategy: strategyMock, magnitude: 0});
// 4. Try to "redeposit" and expect a revert since strategy is 100% slashed
// staker's withdrawable shares should also be 0 now
@@ -3186,16 +3062,14 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
cheats.expectRevert(FullySlashed.selector);
delegationManager.increaseDelegatedShares(staker, strategyMock, existingShares, shares);
- (withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategiesDeposited);
- assertEq(
- withdrawableShares[0],
- 0,
- "All existing shares should be slashed"
- );
+ (withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategiesDeposited);
+ assertEq(withdrawableShares[0], 0, "All existing shares should be slashed");
}
/// @notice Verifies that there is no change in operatorShares if the staker is not delegated
- function testFuzz_increaseDelegatedShares_noop(Randomness r) public rand(r) {
+ function testFuzz_increaseDelegatedShares_noop(
+ Randomness r
+ ) public rand(r) {
address staker = r.Address();
_registerOperatorWithBaseDetails(defaultOperator);
assertFalse(delegationManager.isDelegated(staker), "bad test setup");
@@ -3211,10 +3085,12 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
* Asserts:
* - depositScalingFactor, depositShares, withdrawableShares, operatorShares after deposit
* - correct operator shares after deposit
-
+ *
* @dev Checks that there is no change if the staker is not delegated
*/
- function testFuzz_increaseDelegatedShares(Randomness r) public rand(r) {
+ function testFuzz_increaseDelegatedShares(
+ Randomness r
+ ) public rand(r) {
address staker = r.Address();
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES);
bool delegateFromStakerToOperator = r.Boolean();
@@ -3225,10 +3101,8 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
if (delegateFromStakerToOperator) {
_delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator);
}
- uint256 delegatedSharesBefore = delegationManager.operatorShares(
- delegationManager.delegatedTo(staker),
- strategyMock
- );
+ uint256 delegatedSharesBefore =
+ delegationManager.operatorShares(delegationManager.delegatedTo(staker), strategyMock);
// deposit and increase delegated shares
strategyManagerMock.addDeposit(staker, strategyMock, shares);
@@ -3258,12 +3132,10 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
// Assert correct end state values
uint256 delegatedSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock);
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray());
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray());
if (delegationManager.isDelegated(staker)) {
_assertWithdrawableAndOperatorShares(
- withdrawableShares[0],
- delegatedSharesAfter,
- "Invalid withdrawable shares"
+ withdrawableShares[0], delegatedSharesAfter, "Invalid withdrawable shares"
);
} else {
assertEq(delegatedSharesAfter, delegatedSharesBefore, "delegated shares incremented incorrectly");
@@ -3271,7 +3143,9 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
}
}
- function testFuzz_increaseDelegatedShares_beaconChainShares(Randomness r) public rand(r) {
+ function testFuzz_increaseDelegatedShares_beaconChainShares(
+ Randomness r
+ ) public rand(r) {
address staker = r.Address();
uint256 shares = r.Uint256(1, MAX_ETH_SUPPLY);
uint64 beaconChainSlashingFactor = r.Uint64(1, WAD);
@@ -3280,10 +3154,8 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
_registerOperatorWithBaseDetails(defaultOperator);
// delegate from the `staker` to the operator *if `delegateFromStakerToOperator` is 'true'*
_delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator);
- uint256 delegatedSharesBefore = delegationManager.operatorShares(
- delegationManager.delegatedTo(staker),
- beaconChainETHStrategy
- );
+ uint256 delegatedSharesBefore =
+ delegationManager.operatorShares(delegationManager.delegatedTo(staker), beaconChainETHStrategy);
// deposit and increase delegated shares
eigenPodManagerMock.setPodOwnerShares(staker, int256(shares));
@@ -3312,12 +3184,9 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
// Assert correct end state values
uint256 delegatedSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy);
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray());
- _assertWithdrawableAndOperatorShares(
- withdrawableShares[0],
- delegatedSharesAfter,
- "Invalid withdrawable shares"
- );
+ (uint256[] memory withdrawableShares,) =
+ delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray());
+ _assertWithdrawableAndOperatorShares(withdrawableShares[0], delegatedSharesAfter, "Invalid withdrawable shares");
}
/**
@@ -3325,7 +3194,9 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
* who the `staker` is delegated to has in the strategy
* @dev Checks that there is no change if the staker is not delegated
*/
- function testFuzz_increaseDelegatedShares_slashedOperator(Randomness r) public rand(r) {
+ function testFuzz_increaseDelegatedShares_slashedOperator(
+ Randomness r
+ ) public rand(r) {
address staker = r.Address();
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES);
uint64 magnitude = r.Uint64(1, WAD);
@@ -3333,7 +3204,7 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
// Register operator
_registerOperatorWithBaseDetails(defaultOperator);
-
+
// Set operator magnitude
_setOperatorMagnitude(defaultOperator, strategyMock, magnitude);
@@ -3341,10 +3212,8 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
if (delegateFromStakerToOperator) {
_delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator);
}
- uint256 delegatedSharesBefore = delegationManager.operatorShares(
- delegationManager.delegatedTo(staker),
- strategyMock
- );
+ uint256 delegatedSharesBefore =
+ delegationManager.operatorShares(delegationManager.delegatedTo(staker), strategyMock);
strategyManagerMock.addDeposit(staker, strategyMock, shares);
if (delegationManager.isDelegated(staker)) {
@@ -3374,13 +3243,11 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
// Assert correct values
uint256 delegatedSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock);
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray());
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategyMock.toArray());
if (delegationManager.isDelegated(staker)) {
_assertWithdrawableAndOperatorShares(
- withdrawableShares[0],
- delegatedSharesAfter,
- "Invalid withdrawable shares"
+ withdrawableShares[0], delegatedSharesAfter, "Invalid withdrawable shares"
);
} else {
assertEq(delegatedSharesAfter, delegatedSharesBefore, "delegated shares incremented incorrectly");
@@ -3390,10 +3257,12 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
/**
* @notice Verifies that `DelegationManager.increaseDelegatedShares` properly increases the delegated `shares` for the
- * `defaultOperator` who the staker is delegated to. Asserts for proper events emitted and correct withdrawable shares,
+ * `defaultOperator` who the staker is delegated to. Asserts for proper events emitted and correct withdrawable shares,
* despoitScalingFactor for the staker, and operator shares after deposit.
*/
- function testFuzz_increaseDelegatedShares_slashedOperatorAndBeaconChainShares(Randomness r) public rand(r) {
+ function testFuzz_increaseDelegatedShares_slashedOperatorAndBeaconChainShares(
+ Randomness r
+ ) public rand(r) {
address staker = r.Address();
uint256 shares = r.Uint256(1, MAX_ETH_SUPPLY);
uint64 maxMagnitude = r.Uint64(1, WAD);
@@ -3405,10 +3274,8 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
_setOperatorMagnitude(defaultOperator, beaconChainETHStrategy, maxMagnitude);
// delegate from the `staker` to the operator *if `delegateFromStakerToOperator` is 'true'*
_delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator);
- uint256 delegatedSharesBefore = delegationManager.operatorShares(
- delegationManager.delegatedTo(staker),
- beaconChainETHStrategy
- );
+ uint256 delegatedSharesBefore =
+ delegationManager.operatorShares(delegationManager.delegatedTo(staker), beaconChainETHStrategy);
// deposit and increase delegated shares
eigenPodManagerMock.setPodOwnerShares(staker, int256(shares));
@@ -3437,12 +3304,9 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
// Assert correct end state values
uint256 delegatedSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy);
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray());
- _assertWithdrawableAndOperatorShares(
- withdrawableShares[0],
- delegatedSharesAfter,
- "Invalid withdrawable shares"
- );
+ (uint256[] memory withdrawableShares,) =
+ delegationManager.getWithdrawableShares(staker, beaconChainETHStrategy.toArray());
+ _assertWithdrawableAndOperatorShares(withdrawableShares[0], delegatedSharesAfter, "Invalid withdrawable shares");
}
/**
@@ -3461,24 +3325,14 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
// Register operator
_registerOperatorWithBaseDetails(defaultOperator);
// Set operator magnitude for 100% slashed strategy
- _setOperatorMagnitude({
- operator: defaultOperator,
- strategy: strategyMock,
- magnitude: 0
- });
+ _setOperatorMagnitude({operator: defaultOperator, strategy: strategyMock, magnitude: 0});
// Set operator magnitude for non-100% slashed strategy
- _setOperatorMagnitude({
- operator: defaultOperator,
- strategy: strategy,
- magnitude: magnitude
- });
+ _setOperatorMagnitude({operator: defaultOperator, strategy: strategy, magnitude: magnitude});
// delegate from the `staker` to the operator
_delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator);
- uint256 delegatedSharesBefore = delegationManager.operatorShares(
- delegationManager.delegatedTo(staker),
- strategy
- );
+ uint256 delegatedSharesBefore =
+ delegationManager.operatorShares(delegationManager.delegatedTo(staker), strategy);
// deposit and increaseDelegatedShares
strategyManagerMock.addDeposit(staker, strategy, shares);
@@ -3508,16 +3362,9 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
});
// Assert correct end state values
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(staker, strategyArray);
- uint256 delegatedSharesAfter = delegationManager.operatorShares(
- delegationManager.delegatedTo(staker),
- strategy
- );
- _assertWithdrawableAndOperatorShares(
- withdrawableShares[0],
- delegatedSharesAfter,
- "Invalid withdrawable shares"
- );
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(staker, strategyArray);
+ uint256 delegatedSharesAfter = delegationManager.operatorShares(delegationManager.delegatedTo(staker), strategy);
+ _assertWithdrawableAndOperatorShares(withdrawableShares[0], delegatedSharesAfter, "Invalid withdrawable shares");
}
/**
@@ -3528,13 +3375,13 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
* The test below results in a drift difference of 4.418e13
*/
function test_increaseDelegatedShares_depositRepeatedly() public {
- uint64 initialMagnitude = 999999999999990009;
- uint256 shares = 44182209037560531097078597505;
+ uint64 initialMagnitude = 999_999_999_999_990_009;
+ uint256 shares = 44_182_209_037_560_531_097_078_597_505;
// register *this contract* as an operator
_registerOperatorWithBaseDetails(defaultOperator);
_setOperatorMagnitude(defaultOperator, strategyMock, initialMagnitude);
-
+
// Set the staker deposits in the strategies
IStrategy[] memory strategies = strategyMock.toArray();
strategyManagerMock.addDeposit(defaultStaker, strategyMock, shares);
@@ -3554,14 +3401,12 @@ contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManager
}
}
- (
- uint256[] memory withdrawableShares,
- uint256[] memory depositShares
- ) = delegationManager.getWithdrawableShares(defaultStaker, strategies);
+ (uint256[] memory withdrawableShares, uint256[] memory depositShares) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategies);
assertEq(depositShares[0], shares, "staker deposit shares not reset correctly");
assertEq(
delegationManager.operatorShares(defaultOperator, strategyMock) - withdrawableShares[0],
- 44182209037566,
+ 44_182_209_037_566,
"drift should be 4.418e13 from previous tests"
);
}
@@ -3572,7 +3417,9 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager
using SlashingLib for *;
using Math for *;
- function testFuzz_Revert_decreaseDelegatedShares_invalidCaller(Randomness r) public rand(r) {
+ function testFuzz_Revert_decreaseDelegatedShares_invalidCaller(
+ Randomness r
+ ) public rand(r) {
address invalidCaller = r.Address();
address staker = r.Address();
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES);
@@ -3583,7 +3430,9 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager
}
/// @notice Verifies that there is no change in operatorShares if the staker is not delegated
- function testFuzz_decreaseDelegatedShares_noop(Randomness r) public rand(r) {
+ function testFuzz_decreaseDelegatedShares_noop(
+ Randomness r
+ ) public rand(r) {
address staker = r.Address();
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES);
uint64 beaconChainSlashingFactorDecrease = uint64(r.Uint256(0, WAD));
@@ -3603,7 +3452,9 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager
* Ensures that after the decrease, the staker's withdrawableShares <= operatorShares,
* preventing any underflow for the operator's shares if they were all to be withdrawn.
*/
- function testFuzz_decreaseDelegatedShares_nonSlashedOperator(Randomness r) public rand(r) {
+ function testFuzz_decreaseDelegatedShares_nonSlashedOperator(
+ Randomness r
+ ) public rand(r) {
int256 beaconShares = int256(r.Uint256(1, MAX_ETH_SUPPLY));
uint256 sharesDecrease = r.Uint256(0, uint256(beaconShares) - 1);
uint64 beaconChainSlashingFactor = r.Uint64(1, WAD);
@@ -3612,30 +3463,24 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager
_registerOperatorWithBaseDetails(defaultOperator);
eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares);
eigenPodManagerMock.setBeaconChainSlashingFactor(defaultStaker, beaconChainSlashingFactor);
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
- _assertDeposit({
+ _assertDelegation({
staker: defaultStaker,
operator: defaultOperator,
strategy: beaconChainETHStrategy,
operatorSharesBefore: 0,
- withdrawableSharesBefore: 0,
- depositSharesBefore: 0,
- prevDsf: WAD,
- depositAmount: uint256(beaconShares)
+ withdrawableSharesBefore: withdrawableShares[0],
+ depositSharesBefore: uint256(beaconShares),
+ prevDsf: WAD
});
// 2. Perform beaconChain slash + decreaseDelegatedShares()
- (
- uint64 prevBeaconSlashingFactor,
- uint64 newBeaconSlashingFactor
- ) = _setNewBeaconChainSlashingFactor(defaultStaker, beaconShares, sharesDecrease);
+ (uint64 prevBeaconSlashingFactor, uint64 newBeaconSlashingFactor) =
+ _setNewBeaconChainSlashingFactor(defaultStaker, beaconShares, sharesDecrease);
uint64 beaconChainSlashingFactorDecrease = prevBeaconSlashingFactor - newBeaconSlashingFactor;
- assertEq(
- beaconChainSlashingFactor,
- prevBeaconSlashingFactor,
- "Bad test setup"
- );
- uint256 depositScalingFactor = uint256(WAD).divWad(beaconChainSlashingFactor);
+ assertEq(beaconChainSlashingFactor, prevBeaconSlashingFactor, "Bad test setup");
+ uint256 depositScalingFactor = uint256(WAD);
// expected operatorShares decreased for event
uint256 operatorSharesToDecrease = _calcWithdrawableShares({
depositShares: uint256(beaconShares),
@@ -3651,7 +3496,9 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager
})
);
cheats.prank(address(eigenPodManagerMock));
- delegationManager.decreaseDelegatedShares(defaultStaker, uint256(beaconShares), beaconChainSlashingFactorDecrease);
+ delegationManager.decreaseDelegatedShares(
+ defaultStaker, uint256(beaconShares), beaconChainSlashingFactorDecrease
+ );
// 3. Assert correct values
uint256 expectedWithdrawableShares = _calcWithdrawableShares({
@@ -3661,16 +3508,17 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager
});
_assertSharesAfterBeaconSlash({
staker: defaultStaker,
- withdrawableSharesBefore: uint256(beaconShares),
+ withdrawableSharesBefore: withdrawableShares[0],
expectedWithdrawableShares: expectedWithdrawableShares,
prevBeaconSlashingFactor: prevBeaconSlashingFactor
});
// Assert correct end state values
- (uint256[] memory withdrawableSharesAfter, ) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
+ (uint256[] memory withdrawableSharesAfter,) =
+ delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
assertEq(
delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy) + operatorSharesToDecrease,
- uint256(beaconShares),
+ withdrawableShares[0],
"operator shares not decreased correctly"
);
@@ -3689,7 +3537,9 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager
* Ensures that after the decrease, the staker's withdrawableShares <= operatorShares,
* preventing any underflow for the operator's shares if they were all to be withdrawn.
*/
- function testFuzz_decreaseDelegatedShares_slashedOperator(Randomness r) public rand(r) {
+ function testFuzz_decreaseDelegatedShares_slashedOperator(
+ Randomness r
+ ) public rand(r) {
int256 beaconShares = int256(r.Uint256(1, MAX_ETH_SUPPLY));
uint256 sharesDecrease = r.Uint256(0, uint256(beaconShares) - 1);
uint64 maxMagnitude = r.Uint64(1, WAD - 1);
@@ -3700,30 +3550,24 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager
_setOperatorMagnitude(defaultOperator, beaconChainETHStrategy, maxMagnitude);
eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares);
eigenPodManagerMock.setBeaconChainSlashingFactor(defaultStaker, beaconChainSlashingFactor);
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
- _assertDeposit({
+ _assertDelegation({
staker: defaultStaker,
operator: defaultOperator,
strategy: beaconChainETHStrategy,
operatorSharesBefore: 0,
- withdrawableSharesBefore: 0,
- depositSharesBefore: 0,
- prevDsf: WAD,
- depositAmount: uint256(beaconShares)
+ withdrawableSharesBefore: withdrawableShares[0],
+ depositSharesBefore: uint256(beaconShares),
+ prevDsf: WAD
});
// 2. Perform beaconChain slash + decreaseDelegatedShares()
- (
- uint64 prevBeaconSlashingFactor,
- uint64 newBeaconSlashingFactor
- ) = _setNewBeaconChainSlashingFactor(defaultStaker, beaconShares, sharesDecrease);
+ (uint64 prevBeaconSlashingFactor, uint64 newBeaconSlashingFactor) =
+ _setNewBeaconChainSlashingFactor(defaultStaker, beaconShares, sharesDecrease);
uint64 beaconChainSlashingFactorDecrease = prevBeaconSlashingFactor - newBeaconSlashingFactor;
- assertEq(
- beaconChainSlashingFactor,
- prevBeaconSlashingFactor,
- "Bad test setup"
- );
- uint256 depositScalingFactor = uint256(WAD).divWad(maxMagnitude.mulWad(beaconChainSlashingFactor));
+ assertEq(beaconChainSlashingFactor, prevBeaconSlashingFactor, "Bad test setup");
+ uint256 depositScalingFactor = uint256(WAD).divWad(maxMagnitude);
// expected operatorShares decreased for event
uint256 operatorSharesToDecrease = _calcWithdrawableShares({
depositShares: uint256(beaconShares),
@@ -3739,7 +3583,9 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager
})
);
cheats.prank(address(eigenPodManagerMock));
- delegationManager.decreaseDelegatedShares(defaultStaker, uint256(beaconShares), beaconChainSlashingFactorDecrease);
+ delegationManager.decreaseDelegatedShares(
+ defaultStaker, uint256(beaconShares), beaconChainSlashingFactorDecrease
+ );
// 3. Assert correct values
uint256 expectedWithdrawableShares = _calcWithdrawableShares({
@@ -3749,16 +3595,17 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager
});
_assertSharesAfterBeaconSlash({
staker: defaultStaker,
- withdrawableSharesBefore: uint256(beaconShares),
+ withdrawableSharesBefore: withdrawableShares[0],
expectedWithdrawableShares: expectedWithdrawableShares,
prevBeaconSlashingFactor: prevBeaconSlashingFactor
});
// Assert correct end state values
- (uint256[] memory withdrawableSharesAfter, ) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
+ (uint256[] memory withdrawableSharesAfter,) =
+ delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
assertEq(
delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy) + operatorSharesToDecrease,
- uint256(beaconShares),
+ withdrawableShares[0],
"operator shares not decreased correctly"
);
@@ -3774,7 +3621,9 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager
* is slashed. Their withdrawable shares should be 0 afterwards and decreasing operatorShares should
* not underflow and revert either.
*/
- function testFuzz_decreaseDelegatedShares_entireBalance(Randomness r) public rand(r) {
+ function testFuzz_decreaseDelegatedShares_entireBalance(
+ Randomness r
+ ) public rand(r) {
int256 beaconShares = int256(r.Uint256(1, MAX_ETH_SUPPLY));
uint64 maxMagnitude = r.Uint64(1, WAD);
uint64 beaconChainSlashingFactor = r.Uint64(1, WAD);
@@ -3784,30 +3633,24 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager
_setOperatorMagnitude(defaultOperator, beaconChainETHStrategy, maxMagnitude);
eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares);
eigenPodManagerMock.setBeaconChainSlashingFactor(defaultStaker, beaconChainSlashingFactor);
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
- _assertDeposit({
+ _assertDelegation({
staker: defaultStaker,
operator: defaultOperator,
strategy: beaconChainETHStrategy,
operatorSharesBefore: 0,
- withdrawableSharesBefore: 0,
- depositSharesBefore: 0,
- prevDsf: WAD,
- depositAmount: uint256(beaconShares)
+ withdrawableSharesBefore: withdrawableShares[0],
+ depositSharesBefore: uint256(beaconShares),
+ prevDsf: WAD
});
// 2. Perform beaconChain slash + decreaseDelegatedShares()
- (
- uint64 prevBeaconSlashingFactor,
- uint64 newBeaconSlashingFactor
- ) = _setNewBeaconChainSlashingFactor(defaultStaker, beaconShares, uint256(beaconShares));
- assertEq(
- beaconChainSlashingFactor,
- prevBeaconSlashingFactor,
- "Bad test setup"
- );
+ (uint64 prevBeaconSlashingFactor, uint64 newBeaconSlashingFactor) =
+ _setNewBeaconChainSlashingFactor(defaultStaker, beaconShares, uint256(beaconShares));
+ assertEq(beaconChainSlashingFactor, prevBeaconSlashingFactor, "Bad test setup");
uint64 beaconChainSlashingFactorDecrease = prevBeaconSlashingFactor - newBeaconSlashingFactor;
- uint256 depositScalingFactor = uint256(WAD).divWad(maxMagnitude.mulWad(beaconChainSlashingFactor));
+ uint256 depositScalingFactor = uint256(WAD).divWad(maxMagnitude);
// expected operatorShares decreased for event
uint256 operatorSharesToDecrease = _calcWithdrawableShares({
depositShares: uint256(beaconShares),
@@ -3831,25 +3674,19 @@ contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManager
depositScalingFactor: depositScalingFactor,
slashingFactor: maxMagnitude.mulWad(newBeaconSlashingFactor)
});
+ assertEq(expectedWithdrawableShares, 0, "All shares should be slashed");
assertEq(
- expectedWithdrawableShares,
- 0,
- "All shares should be slashed"
- );
- assertEq(
- eigenPodManagerMock.beaconChainSlashingFactor(defaultStaker),
- 0,
- "beaconChainSlashingFactor should be 0"
+ eigenPodManagerMock.beaconChainSlashingFactor(defaultStaker), 0, "beaconChainSlashingFactor should be 0"
);
_assertSharesAfterBeaconSlash({
staker: defaultStaker,
- withdrawableSharesBefore: uint256(beaconShares),
+ withdrawableSharesBefore: withdrawableShares[0],
expectedWithdrawableShares: expectedWithdrawableShares,
prevBeaconSlashingFactor: prevBeaconSlashingFactor
});
assertEq(
delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy) + operatorSharesToDecrease,
- uint256(beaconShares),
+ withdrawableShares[0],
"operator shares not decreased correctly"
);
}
@@ -3861,7 +3698,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
using Math for uint256;
// @notice Verifies that undelegating is not possible when the "undelegation paused" switch is flipped
- function testFuzz_Revert_undelegate_paused(Randomness r) public rand(r) {
+ function testFuzz_Revert_undelegate_paused(
+ Randomness r
+ ) public rand(r) {
address staker = r.Address();
address operator = r.Address();
_registerOperatorWithBaseDetails(operator);
@@ -3875,7 +3714,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
delegationManager.undelegate(staker);
}
- function testFuzz_Revert_undelegate_notDelegated(Randomness r) public rand(r) {
+ function testFuzz_Revert_undelegate_notDelegated(
+ Randomness r
+ ) public rand(r) {
address undelegatedStaker = r.Address();
assertFalse(delegationManager.isDelegated(undelegatedStaker), "bad test setup");
@@ -3885,7 +3726,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
}
// @notice Verifies that an operator cannot undelegate from themself (this should always be forbidden)
- function testFuzz_Revert_undelegate_stakerIsOperator(Randomness r) public rand(r) {
+ function testFuzz_Revert_undelegate_stakerIsOperator(
+ Randomness r
+ ) public rand(r) {
address operator = r.Address();
_registerOperatorWithBaseDetails(operator);
@@ -3923,7 +3766,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
* @notice Verifies that the `undelegate` function has proper access controls (can only be called by the operator who the `staker` has delegated
* to or the operator's `delegationApprover`), or the staker themselves
*/
- function testFuzz_Revert_undelegate_invalidCaller(Randomness r) public rand(r) {
+ function testFuzz_Revert_undelegate_invalidCaller(
+ Randomness r
+ ) public rand(r) {
address invalidCaller = r.Address();
address staker = r.Address();
@@ -3942,9 +3787,11 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
* Properly undelegates the staker, i.e. the staker becomes “delegated to” the zero address, and `isDelegated(staker)` returns ‘false’
* Emits a `StakerUndelegated` event
*/
- function testFuzz_undelegate_noDelegateableShares(Randomness r) public rand(r) {
+ function testFuzz_undelegate_noDelegateableShares(
+ Randomness r
+ ) public rand(r) {
address staker = r.Address();
-
+
// register *this contract* as an operator and delegate from the `staker` to them
_registerOperatorWithBaseDetails(defaultOperator);
_delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator);
@@ -3956,9 +3803,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
assertEq(withdrawalRoots.length, 0, "withdrawalRoot should be an empty array");
assertEq(
- delegationManager.delegatedTo(staker),
- address(0),
- "undelegated staker should be delegated to zero address"
+ delegationManager.delegatedTo(staker), address(0), "undelegated staker should be delegated to zero address"
);
assertFalse(delegationManager.isDelegated(staker), "staker not undelegated");
}
@@ -3966,7 +3811,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
/**
* @notice Verifies that the `undelegate` function allows for a force undelegation
*/
- function testFuzz_undelegate_forceUndelegation_noDelegateableShares(Randomness r) public rand(r) {
+ function testFuzz_undelegate_forceUndelegation_noDelegateableShares(
+ Randomness r
+ ) public rand(r) {
address staker = r.Address();
bytes32 salt = r.Bytes32();
bool callFromOperatorOrApprover = r.Boolean();
@@ -4000,9 +3847,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
assertEq(withdrawalRoots.length, 0, "withdrawalRoot should be an empty array");
assertEq(
- delegationManager.delegatedTo(staker),
- address(0),
- "undelegated staker should be delegated to zero address"
+ delegationManager.delegatedTo(staker), address(0), "undelegated staker should be delegated to zero address"
);
assertFalse(delegationManager.isDelegated(staker), "staker not undelegated");
}
@@ -4010,7 +3855,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
/**
* @notice Verifies that the `undelegate` function properly queues a withdrawal for all shares of the staker
*/
- function testFuzz_undelegate_nonSlashedOperator(Randomness r) public rand(r) {
+ function testFuzz_undelegate_nonSlashedOperator(
+ Randomness r
+ ) public rand(r) {
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES);
IStrategy[] memory strategyArray = r.StrategyArray(1);
IStrategy strategy = strategyArray[0];
@@ -4034,11 +3881,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
});
// Format queued withdrawal
- (
- ,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategy,
depositSharesToWithdraw: shares
@@ -4085,15 +3928,17 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
* @notice Verifies that the `undelegate` function properly queues a withdrawal for all shares of the staker
* @notice The operator should have its shares slashed prior to the staker's deposit
*/
- function testFuzz_undelegate_preSlashedOperator(Randomness r) public rand(r) {
+ function testFuzz_undelegate_preSlashedOperator(
+ Randomness r
+ ) public rand(r) {
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES);
uint64 operatorMagnitude = r.Uint64(1, WAD);
- IStrategy strategy = IStrategy(r.Address());
+ IStrategy strategy = IStrategy(r.Address());
// register *this contract* as an operator & set its slashed magnitude
_registerOperatorWithBaseDetails(defaultOperator);
_setOperatorMagnitude(defaultOperator, strategy, operatorMagnitude);
-
+
// Set the staker deposits in the strategies
strategyManagerMock.addDeposit(defaultStaker, strategy, shares);
@@ -4109,13 +3954,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
prevDsf: uint256(WAD).divWad(operatorMagnitude),
depositAmount: shares
});
-
+
// Format queued withdrawal
- (
- ,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategy,
depositSharesToWithdraw: shares
@@ -4124,11 +3965,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
// Calculate operatorShares decreased, may be off of shares due to rounding
uint256 depositScalingFactor = delegationManager.depositScalingFactor(defaultStaker, strategy);
assertTrue(depositScalingFactor > WAD, "bad test setup");
- uint256 operatorSharesDecreased = _calcWithdrawableShares(
- shares,
- depositScalingFactor,
- operatorMagnitude
- );
+ uint256 operatorSharesDecreased = _calcWithdrawableShares(shares, depositScalingFactor, operatorMagnitude);
assertLe(operatorSharesDecreased, shares, "operatorSharesDecreased should be <= shares");
// Undelegate the staker
@@ -4167,7 +4004,8 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
depositScalingFactor: uint256(WAD).divWad(operatorMagnitude),
slashingFactor: uint256(operatorMagnitude)
});
- (uint256[] memory stakerWithdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray());
+ (uint256[] memory stakerWithdrawableShares,) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray());
assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly");
}
@@ -4175,7 +4013,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
* @notice Verifies that the `undelegate` function properly queues a withdrawal for all shares of the staker
* @notice The operator should have its shares slashed prior to the staker's deposit
*/
- function testFuzz_undelegate_slashedWhileStaked(Randomness r) public rand(r) {
+ function testFuzz_undelegate_slashedWhileStaked(
+ Randomness r
+ ) public rand(r) {
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES);
uint64 prevMaxMagnitude = r.Uint64(2, WAD);
uint64 newMaxMagnitude = r.Uint64(1, prevMaxMagnitude - 1);
@@ -4184,10 +4024,10 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
// register *this contract* as an operator
_registerOperatorWithBaseDetails(defaultOperator);
_setOperatorMagnitude(defaultOperator, strategy, prevMaxMagnitude);
-
+
// Set the staker deposits in the strategies
strategyManagerMock.addDeposit(defaultStaker, strategy, shares);
-
+
// delegate from the `defaultStaker` to the operator
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
_assertDeposit({
@@ -4209,7 +4049,8 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
// Set operator magnitude
{
- (uint256[] memory withdrawableSharesBefore, ) = delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray());
+ (uint256[] memory withdrawableSharesBefore,) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray());
uint256 delegatedSharesBefore = delegationManager.operatorShares(defaultOperator, strategy);
_setOperatorMagnitude(defaultOperator, strategy, newMaxMagnitude);
cheats.prank(address(allocationManagerMock));
@@ -4223,7 +4064,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
});
uint256 expectedWithdrawable = _calcWithdrawableShares(
- shares,
+ shares,
uint256(WAD).divWad(prevMaxMagnitude),
_getSlashingFactor(defaultStaker, strategy, newMaxMagnitude)
);
@@ -4237,8 +4078,11 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
});
// Get withdrawable shares
- (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) = delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray());
- _assertWithdrawableAndOperatorShares(withdrawableSharesAfter[0], operatorSharesAfterSlash, "Invalid withdrawable shares");
+ (uint256[] memory withdrawableSharesAfter, uint256[] memory depositSharesAfter) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray());
+ _assertWithdrawableAndOperatorShares(
+ withdrawableSharesAfter[0], operatorSharesAfterSlash, "Invalid withdrawable shares"
+ );
assertEq(depositSharesAfter[0], shares, "Invalid deposit shares");
assertEq(
delegationManager.depositScalingFactor(defaultStaker, strategy),
@@ -4248,14 +4092,11 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
}
// Format queued withdrawal
- (uint256[] memory withdrawableShares, uint256[] memory depositShares) = delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray());
+ (uint256[] memory withdrawableShares, uint256[] memory depositShares) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategy.toArray());
uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategy);
{
- (
- ,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategy,
depositSharesToWithdraw: shares
@@ -4308,7 +4149,9 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
* @notice Verifies that the `undelegate` function properly undelegates a staker even though their shares
* were slashed entirely.
*/
- function testFuzz_undelegate_slashedOperator100PercentWhileStaked(Randomness r) public rand(r) {
+ function testFuzz_undelegate_slashedOperator100PercentWhileStaked(
+ Randomness r
+ ) public rand(r) {
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES);
IStrategy[] memory strategyArray = r.StrategyArray(1);
IStrategy strategy = strategyArray[0];
@@ -4343,11 +4186,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
assertEq(operatorSharesAfterSlash, 0, "operator shares not fully slashed");
}
- (
- ,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategy,
depositSharesToWithdraw: shares
@@ -4357,20 +4196,10 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
assertEq(depositScalingFactor, WAD, "bad test setup");
// Get withdrawable and deposit shares
{
- (
- uint256[] memory withdrawableSharesBefore,
- uint256[] memory depositSharesBefore
- ) = delegationManager.getWithdrawableShares(defaultStaker, strategyArray);
- assertEq(
- withdrawableSharesBefore[0],
- 0,
- "withdrawable shares should be 0 after being slashed fully"
- );
- assertEq(
- depositSharesBefore[0],
- shares,
- "deposit shares should be unchanged after being slashed fully"
- );
+ (uint256[] memory withdrawableSharesBefore, uint256[] memory depositSharesBefore) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategyArray);
+ assertEq(withdrawableSharesBefore[0], 0, "withdrawable shares should be 0 after being slashed fully");
+ assertEq(depositSharesBefore[0], shares, "deposit shares should be unchanged after being slashed fully");
}
// Undelegate the staker
@@ -4410,16 +4239,18 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
slashingFactor: 0
});
- assertEq(delegationManager.operatorShares(defaultOperator, strategy), 0, "operator shares not decreased correctly");
- (
- uint256[] memory stakerWithdrawableShares,
- uint256[] memory depositShares
- ) = delegationManager.getWithdrawableShares(defaultStaker, strategyArray);
+ assertEq(
+ delegationManager.operatorShares(defaultOperator, strategy), 0, "operator shares not decreased correctly"
+ );
+ (uint256[] memory stakerWithdrawableShares, uint256[] memory depositShares) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategyArray);
assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly");
assertEq(depositShares[0], 0, "staker deposit shares not reset correctly");
}
- function testFuzz_undelegate_slashedOperatorCloseTo100(Randomness r) public rand(r) {
+ function testFuzz_undelegate_slashedOperatorCloseTo100(
+ Randomness r
+ ) public rand(r) {
address[] memory stakers = r.StakerArray(r.Uint32(1, 8));
uint64 prevMaxMagnitude = r.Uint64(2, WAD);
uint64 newMaxMagnitude = 1;
@@ -4427,16 +4258,12 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
// 1. register *this contract* as an operator
_registerOperatorWithBaseDetails(defaultOperator);
_setOperatorMagnitude(defaultOperator, strategyMock, prevMaxMagnitude);
-
+
// 2. Stakers deposits in the strategyMock
{
for (uint256 i = 0; i < stakers.length; ++i) {
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES);
- strategyManagerMock.addDeposit(
- stakers[i],
- strategyMock,
- shares
- );
+ strategyManagerMock.addDeposit(stakers[i], strategyMock, shares);
stakerDepositShares[stakers[i]] = shares;
}
}
@@ -4460,11 +4287,14 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
});
}
- (uint256[] memory withdrawableSharesBefore, ) = delegationManager.getWithdrawableShares(stakers[i], strategyMock.toArray());
+ (uint256[] memory withdrawableSharesBefore,) =
+ delegationManager.getWithdrawableShares(stakers[i], strategyMock.toArray());
totalWithdrawable += withdrawableSharesBefore[0];
}
assertLe(
- totalWithdrawable, delegationManager.operatorShares(defaultOperator, strategyMock), "should be <= op shares due to rounding"
+ totalWithdrawable,
+ delegationManager.operatorShares(defaultOperator, strategyMock),
+ "should be <= op shares due to rounding"
);
}
@@ -4487,11 +4317,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
// 5. Undelegate the stakers with expected events
uint256 totalOperatorSharesDecreased = 0;
for (uint256 i = 0; i < stakers.length; ++i) {
- (
- ,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({
staker: stakers[i],
strategy: strategyMock,
depositSharesToWithdraw: stakerDepositShares[stakers[i]]
@@ -4529,10 +4355,8 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
);
assertFalse(delegationManager.isDelegated(defaultStaker), "staker not undelegated");
for (uint256 i = 0; i < stakers.length; ++i) {
- (
- uint256[] memory stakerWithdrawableShares,
- uint256[] memory stakerDepositShares
- ) = delegationManager.getWithdrawableShares(stakers[i], strategyMock.toArray());
+ (uint256[] memory stakerWithdrawableShares, uint256[] memory stakerDepositShares) =
+ delegationManager.getWithdrawableShares(stakers[i], strategyMock.toArray());
assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly");
assertEq(stakerDepositShares[0], 0, "staker deposit shares not reset correctly");
}
@@ -4542,10 +4366,12 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
* @notice Given an operator with slashed magnitude, delegate, undelegate, and then delegate back to the same operator with
* completing withdrawals as shares. This should result in the operatorShares after the second delegation being <= the shares from the first delegation.
*/
- function testFuzz_undelegate_delegateAgainWithRounding(Randomness r) public rand(r) {
+ function testFuzz_undelegate_delegateAgainWithRounding(
+ Randomness r
+ ) public rand(r) {
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES);
// set magnitude to 66% to ensure rounding when calculating `toShares`
- uint64 operatorMagnitude = 333333333333333333;
+ uint64 operatorMagnitude = 333_333_333_333_333_333;
// register *this contract* as an operator & set its slashed magnitude
_registerOperatorWithBaseDetails(defaultOperator);
@@ -4569,11 +4395,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock);
// Format queued withdrawal
- (
- ,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategyMock,
depositSharesToWithdraw: shares
@@ -4581,9 +4403,7 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
uint256 slashingFactor = _getSlashingFactor(defaultStaker, strategyMock, operatorMagnitude);
uint256 operatorSharesDecreased = _calcWithdrawableShares(
- shares,
- delegationManager.depositScalingFactor(defaultStaker, strategyMock),
- slashingFactor
+ shares, delegationManager.depositScalingFactor(defaultStaker, strategyMock), slashingFactor
);
// Undelegate the staker
@@ -4621,7 +4441,8 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
depositScalingFactor: uint256(WAD).divWad(operatorMagnitude),
slashingFactor: operatorMagnitude
});
- (uint256[] memory stakerWithdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray());
+ (uint256[] memory stakerWithdrawableShares,) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray());
assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly");
// // Re-delegate the staker to the operator again. The shares should have increased but may be less than from before due to rounding
@@ -4634,15 +4455,21 @@ contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false);
uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock);
- assertLe(operatorSharesAfter, operatorSharesBefore, "operator shares should be less than or equal to before due to potential rounding");
+ assertLe(
+ operatorSharesAfter,
+ operatorSharesBefore,
+ "operator shares should be less than or equal to before due to potential rounding"
+ );
}
}
-contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
+contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
using ArrayLib for *;
-
+
// @notice Verifies that redelegating is not possible when the "delegation paused" switch is flipped
- function testFuzz_Revert_redelegate_delegatePaused(Randomness r) public {
+ function testFuzz_Revert_redelegate_delegatePaused(
+ Randomness r
+ ) public {
address staker = r.Address();
address newOperator = r.Address();
@@ -4661,7 +4488,9 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
}
// @notice Verifies that redelegating is not possible when the "undelegation paused" switch is flipped
- function testFuzz_Revert_redelegate_undelegatePaused(Randomness r) public {
+ function testFuzz_Revert_redelegate_undelegatePaused(
+ Randomness r
+ ) public {
address staker = r.Address();
address newOperator = r.Address();
@@ -4679,7 +4508,9 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
delegationManager.redelegate(newOperator, emptyApproverSignatureAndExpiry, emptySalt);
}
- function testFuzz_Revert_redelegate_notDelegated(Randomness r) public {
+ function testFuzz_Revert_redelegate_notDelegated(
+ Randomness r
+ ) public {
address undelegatedStaker = r.Address();
assertFalse(delegationManager.isDelegated(undelegatedStaker), "bad test setup");
@@ -4691,7 +4522,9 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
}
// @notice Verifies that an operator cannot undelegate from themself (this should always be forbidden)
- function testFuzz_Revert_redelegate_stakerIsOperator(Randomness r) public {
+ function testFuzz_Revert_redelegate_stakerIsOperator(
+ Randomness r
+ ) public {
address operator = r.Address();
_registerOperatorWithBaseDetails(operator);
_registerOperatorWithBaseDetails(defaultOperator);
@@ -4702,7 +4535,9 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
}
/// @notice Verifies that `staker` cannot redelegate to an unregistered `operator`
- function testFuzz_Revert_redelegateToUnregisteredOperator(Randomness r) public {
+ function testFuzz_Revert_redelegateToUnregisteredOperator(
+ Randomness r
+ ) public {
address staker = r.Address();
address operator = r.Address();
assertFalse(delegationManager.isOperator(operator), "incorrect test input?");
@@ -4724,7 +4559,7 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
address staker = r.Address();
address newOperator = r.Address();
- uint expiry = r.Uint256(0, block.timestamp - 1);
+ uint256 expiry = r.Uint256(0, block.timestamp - 1);
bytes32 salt = r.Bytes32();
_registerOperatorWithBaseDetails(defaultOperator);
@@ -4733,7 +4568,7 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
_registerOperatorWithDelegationApprover(newOperator);
// calculate the delegationSigner's signature
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
delegationSignerPrivateKey,
staker,
newOperator,
@@ -4743,7 +4578,7 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
// delegate from the `staker` to the operator
cheats.startPrank(staker);
- cheats.expectRevert(ISignatureUtils.SignatureExpired.selector);
+ cheats.expectRevert(ISignatureUtilsMixinErrors.SignatureExpired.selector);
delegationManager.redelegate(newOperator, approverSignatureAndExpiry, salt);
cheats.stopPrank();
}
@@ -4753,7 +4588,7 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
) public {
address staker = r.Address();
address newOperator = r.Address();
- uint expiry = r.Uint256(block.timestamp, block.timestamp + 100);
+ uint256 expiry = r.Uint256(block.timestamp, block.timestamp + 100);
bytes32 salt = r.Bytes32();
_registerOperatorWithBaseDetails(defaultOperator);
@@ -4761,14 +4596,11 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
// verify that the salt hasn't been used before
assertFalse(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(newOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(newOperator), salt),
"salt somehow spent too early?"
);
// calculate the delegationSigner's signature
- ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature(
delegationSignerPrivateKey,
staker,
newOperator,
@@ -4780,10 +4612,7 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
cheats.startPrank(staker);
delegationManager.delegateTo(newOperator, approverSignatureAndExpiry, salt);
assertTrue(
- delegationManager.delegationApproverSaltIsSpent(
- delegationManager.delegationApprover(newOperator),
- salt
- ),
+ delegationManager.delegationApproverSaltIsSpent(delegationManager.delegationApprover(newOperator), salt),
"salt somehow spent not spent?"
);
@@ -4800,7 +4629,9 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
* @notice Verifies that the `redelegate` function properly queues a withdrawal for all shares of the staker
* ... and delegates to a new operator
*/
- function testFuzz_redelegate_noSlashing(Randomness r) public {
+ function testFuzz_redelegate_noSlashing(
+ Randomness r
+ ) public {
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES);
IStrategy[] memory strategyArray = r.StrategyArray(1);
IStrategy strategy = strategyArray[0];
@@ -4813,13 +4644,9 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
_registerOperatorWithBaseDetails(defaultOperator);
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
_registerOperatorWithBaseDetails(newOperator);
-
+
// Format queued withdrawal
- (
- ,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategy,
depositSharesToWithdraw: shares
@@ -4860,9 +4687,16 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
assertTrue(delegationManager.isDelegated(defaultStaker), "staker should still be delegated");
// Checks - operator & staker shares
- assertEq(delegationManager.operatorShares(defaultOperator, strategyMock), 0, "operator shares not decreased correctly");
- assertEq(delegationManager.operatorShares(newOperator, strategyMock), 0, "operator shares should not have been added");
- (uint256[] memory stakerWithdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategyArray);
+ assertEq(
+ delegationManager.operatorShares(defaultOperator, strategyMock),
+ 0,
+ "operator shares not decreased correctly"
+ );
+ assertEq(
+ delegationManager.operatorShares(newOperator, strategyMock), 0, "operator shares should not have been added"
+ );
+ (uint256[] memory stakerWithdrawableShares,) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategyArray);
assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly");
}
@@ -4870,7 +4704,9 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
* @notice This function tests to ensure that a delegator can re-delegate to an operator after undelegating.
* Asserts the shares after re-delegating are the same as originally. No slashing is done in this test.
*/
- function testFuzz_undelegate_redelegateWithSharesBack(Randomness r) public rand(r) {
+ function testFuzz_undelegate_redelegateWithSharesBack(
+ Randomness r
+ ) public rand(r) {
address staker = r.Address();
address operator = r.Address();
uint256 strategyShares = r.Uint256(1, MAX_STRATEGY_SHARES);
@@ -4880,9 +4716,7 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
// 1. Set staker shares
strategyManagerMock.addDeposit(staker, strategyMock, strategyShares);
eigenPodManagerMock.setPodOwnerShares(staker, beaconShares);
- (
- IStrategy[] memory strategiesToReturn,
- ) = delegationManager.getDepositedShares(staker);
+ (IStrategy[] memory strategiesToReturn,) = delegationManager.getDepositedShares(staker);
// 2. register operator and delegate staker to operator
_registerOperatorWithBaseDetails(operator);
_delegateToOperatorWhoAcceptsAllStakers(staker, operator);
@@ -4909,18 +4743,12 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
// 3. Setup queued withdrawals from `undelegate`
// queued withdrawals done for single strat as this is how undelegate queue withdraws
- (
- ,
- Withdrawal memory strategyWithdrawal,
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (, Withdrawal memory strategyWithdrawal,) = _setUpQueueWithdrawalsSingleStrat({
staker: staker,
strategy: strategyMock,
depositSharesToWithdraw: strategyShares
});
- (
- ,
- Withdrawal memory beaconWithdrawal,
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (, Withdrawal memory beaconWithdrawal,) = _setUpQueueWithdrawalsSingleStrat({
staker: staker,
strategy: IStrategy(address(beaconChainETHStrategy)),
depositSharesToWithdraw: uint256(beaconShares)
@@ -4939,30 +4767,23 @@ contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
// delegate first and complete withdrawal
_delegateToOperatorWhoAcceptsAllStakers(staker, operator);
cheats.startPrank(staker);
- delegationManager.completeQueuedWithdrawal(strategyWithdrawal, strategyTokens, false);
- delegationManager.completeQueuedWithdrawal(beaconWithdrawal, beaconTokens, false);
+ delegationManager.completeQueuedWithdrawal(strategyWithdrawal, strategyTokens, false);
+ delegationManager.completeQueuedWithdrawal(beaconWithdrawal, beaconTokens, false);
cheats.stopPrank();
} else {
// complete withdrawal first and then delegate
cheats.startPrank(staker);
- delegationManager.completeQueuedWithdrawal(strategyWithdrawal, strategyTokens, false);
- delegationManager.completeQueuedWithdrawal(beaconWithdrawal, beaconTokens, false);
+ delegationManager.completeQueuedWithdrawal(strategyWithdrawal, strategyTokens, false);
+ delegationManager.completeQueuedWithdrawal(beaconWithdrawal, beaconTokens, false);
cheats.stopPrank();
_delegateToOperatorWhoAcceptsAllStakers(staker, operator);
}
}
// 5. assert correct shares and delegation state
- assertTrue(
- delegationManager.isDelegated(staker),
- "staker should be delegated"
- );
- assertEq(
- delegationManager.delegatedTo(staker),
- operator,
- "staker should be delegated to operator"
- );
- (uint256[] memory stakerShares, ) = delegationManager.getWithdrawableShares(staker, strategiesToReturn);
+ assertTrue(delegationManager.isDelegated(staker), "staker should be delegated");
+ assertEq(delegationManager.delegatedTo(staker), operator, "staker should be delegated to operator");
+ (uint256[] memory stakerShares,) = delegationManager.getWithdrawableShares(staker, strategiesToReturn);
assertEq(
delegationManager.operatorShares(operator, strategyMock),
stakerShares[0],
@@ -4983,7 +4804,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
function test_Revert_WhenEnterQueueWithdrawalsPaused() public {
cheats.prank(pauser);
delegationManager.pause(2 ** PAUSED_ENTER_WITHDRAWAL_QUEUE);
- (QueuedWithdrawalParams[] memory queuedWithdrawalParams, , ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) = _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategyMock,
depositSharesToWithdraw: 100
@@ -5009,9 +4830,11 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
delegationManager.queueWithdrawals(queuedWithdrawalParams);
}
- function testFuzz_IgnoresWithdrawerField(address withdrawer) public {
- _depositIntoStrategies(defaultStaker, strategyMock.toArray(), uint(100).toArrayU256());
- (QueuedWithdrawalParams[] memory queuedWithdrawalParams, , ) = _setUpQueueWithdrawalsSingleStrat({
+ function testFuzz_IgnoresWithdrawerField(
+ address withdrawer
+ ) public {
+ _depositIntoStrategies(defaultStaker, strategyMock.toArray(), uint256(100).toArrayU256());
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) = _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategyMock,
depositSharesToWithdraw: 100
@@ -5023,7 +4846,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
cheats.prank(defaultStaker);
bytes32 withdrawalRoot = delegationManager.queueWithdrawals(queuedWithdrawalParams)[0];
- Withdrawal memory withdrawal = delegationManager.getQueuedWithdrawal(withdrawalRoot);
+ (Withdrawal memory withdrawal, ) = delegationManager.getQueuedWithdrawal(withdrawalRoot);
assertEq(withdrawal.staker, defaultStaker, "staker should be msg.sender");
assertEq(withdrawal.withdrawer, defaultStaker, "withdrawer should be msg.sender");
}
@@ -5051,12 +4874,15 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
* - Asserts that staker cumulativeWithdrawalsQueued nonce is incremented
* - Checks that event was emitted with correct withdrawalRoot and withdrawal
*/
- function testFuzz_queueWithdrawal_SingleStrat_nonSlashedOperator(Randomness r) public rand(r) {
+ function testFuzz_queueWithdrawal_SingleStrat_nonSlashedOperator(
+ Randomness r
+ ) public rand(r) {
uint256 depositAmount = r.Uint256(1, MAX_STRATEGY_SHARES);
uint256 withdrawalAmount = r.Uint256(1, depositAmount);
bool depositBeaconChainShares = r.Boolean();
// sharesAmounts is single element so returns single strategy
- IStrategy[] memory strategies = _deployAndDepositIntoStrategies(defaultStaker, depositAmount.toArrayU256(), depositBeaconChainShares);
+ IStrategy[] memory strategies =
+ _deployAndDepositIntoStrategies(defaultStaker, depositAmount.toArrayU256(), depositBeaconChainShares);
_registerOperatorWithBaseDetails(defaultOperator);
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
_assertDeposit({
@@ -5069,16 +4895,15 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
prevDsf: uint256(WAD),
depositAmount: depositAmount
});
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) =
+ _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategies[0],
depositSharesToWithdraw: withdrawalAmount
});
- assertEq(delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator");
+ assertEq(
+ delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator"
+ );
uint256 nonceBefore = delegationManager.cumulativeWithdrawalsQueued(defaultStaker);
uint256 delegatedSharesBefore = delegationManager.operatorShares(defaultOperator, strategies[0]);
@@ -5118,7 +4943,9 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
* - Asserts that staker cumulativeWithdrawalsQueued nonce is incremented
* - Checks that event was emitted with correct withdrawalRoot and withdrawal
*/
- function testFuzz_queueWithdrawal_SingleStrat_preSlashedOperator(Randomness r) public rand(r) {
+ function testFuzz_queueWithdrawal_SingleStrat_preSlashedOperator(
+ Randomness r
+ ) public rand(r) {
uint256 depositAmount = r.Uint256(1, MAX_STRATEGY_SHARES);
uint256 withdrawalAmount = r.Uint256(1, depositAmount);
uint64 maxMagnitude = r.Uint64(1, WAD);
@@ -5141,17 +4968,16 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
depositAmount: depositAmount
});
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) =
+ _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategyMock,
depositSharesToWithdraw: withdrawalAmount
});
- assertEq(delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator");
+ assertEq(
+ delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator"
+ );
uint256 nonceBefore = delegationManager.cumulativeWithdrawalsQueued(defaultStaker);
uint256 delegatedSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock);
@@ -5192,7 +5018,9 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
* - Asserts that staker cumulativeWithdrawalsQueued nonce is incremented
* - Checks that event was emitted with correct withdrawalRoot and withdrawal
*/
- function testFuzz_queueWithdrawal_SingleStrat_slashedWhileStaked(Randomness r) public rand(r) {
+ function testFuzz_queueWithdrawal_SingleStrat_slashedWhileStaked(
+ Randomness r
+ ) public rand(r) {
uint256 depositAmount = r.Uint256(1, MAX_STRATEGY_SHARES);
uint256 withdrawalAmount = r.Uint256(1, depositAmount);
uint64 prevMaxMagnitude = r.Uint64(2, WAD);
@@ -5222,7 +5050,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
cheats.prank(address(allocationManagerMock));
delegationManager.slashOperatorShares(defaultOperator, strategyMock, prevMaxMagnitude, newMaxMagnitude);
// Assertions on amount burned
- (uint256 operatorSharesSlashed, ) = _assertOperatorSharesAfterSlash({
+ (uint256 operatorSharesSlashed,) = _assertOperatorSharesAfterSlash({
operator: defaultOperator,
strategy: strategyMock,
operatorSharesBefore: operatorSharesBefore,
@@ -5286,7 +5114,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
Randomness r
) public rand(r) {
uint256 depositAmount = r.Uint256(1, MAX_STRATEGY_SHARES);
-
+
// Register operator, deposit for staker & delegate
_registerOperatorWithBaseDetails(defaultOperator);
strategyManagerMock.addDeposit(defaultStaker, strategyMock, depositAmount);
@@ -5302,11 +5130,8 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
depositAmount: depositAmount
});
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) =
+ _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategyMock,
depositSharesToWithdraw: 0 // expected 0 since slashed 100%
@@ -5324,7 +5149,9 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
prevMaxMagnitude: WAD,
newMaxMagnitude: operatorMagnitude
});
- assertEq(delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator");
+ assertEq(
+ delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator"
+ );
// queueWithdrawals should result in an empty withdrawal
_queueWithdrawals_expectEmit(
@@ -5339,12 +5166,9 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
cheats.prank(defaultStaker);
delegationManager.queueWithdrawals(queuedWithdrawalParams);
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray());
- assertEq(
- withdrawableShares[0],
- 0,
- "withdrawable shares should be 0 after being slashed fully"
- );
+ (uint256[] memory withdrawableShares,) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray());
+ assertEq(withdrawableShares[0], 0, "withdrawable shares should be 0 after being slashed fully");
_assertWithdrawal({
staker: defaultStaker,
operator: defaultOperator,
@@ -5374,12 +5198,10 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
uint32 numStrategies = r.Uint32(1, 32);
bool depositBeaconChainShares = r.Boolean();
- (
- uint256[] memory depositAmounts,
- uint256[] memory withdrawalAmounts,
- ,
- ) = _fuzzDepositWithdrawalAmounts({ r: r, numStrategies: numStrategies });
- IStrategy[] memory strategies = _deployAndDepositIntoStrategies(defaultStaker, depositAmounts, depositBeaconChainShares);
+ (uint256[] memory depositAmounts, uint256[] memory withdrawalAmounts,,) =
+ _fuzzDepositWithdrawalAmounts({r: r, numStrategies: numStrategies});
+ IStrategy[] memory strategies =
+ _deployAndDepositIntoStrategies(defaultStaker, depositAmounts, depositBeaconChainShares);
_registerOperatorWithBaseDetails(defaultOperator);
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
@@ -5396,18 +5218,17 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
});
}
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawals({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) =
+ _setUpQueueWithdrawals({
staker: defaultStaker,
strategies: strategies,
depositWithdrawalAmounts: withdrawalAmounts
});
// Before queueWithdrawal state values
uint256 nonceBefore = delegationManager.cumulativeWithdrawalsQueued(defaultStaker);
- assertEq(delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator");
+ assertEq(
+ delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator"
+ );
uint256[] memory delegatedSharesBefore = new uint256[](strategies.length);
for (uint256 i = 0; i < strategies.length; i++) {
delegatedSharesBefore[i] = delegationManager.operatorShares(defaultOperator, strategies[i]);
@@ -5440,9 +5261,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
});
}
assertEq(
- delegationManager.delegatedTo(defaultStaker),
- defaultOperator,
- "staker should be delegated to operator"
+ delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator"
);
uint256 nonceAfter = delegationManager.cumulativeWithdrawalsQueued(defaultStaker);
assertEq(nonceBefore + 1, nonceAfter, "staker nonce should have incremented");
@@ -5464,18 +5283,15 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
) public rand(r) {
// 1. Setup
// - fuzz numbers of strategies, deposit and withdraw amounts, and prev/new magnitudes for each strategy respectively
- // - deposit into strategies, delegate to operator
+ // - deposit into strategies, delegate to operator
bool depositBeaconChainShares = r.Boolean();
IStrategy[] memory strategies = r.StrategyArray(r.Uint32(1, 32));
if (depositBeaconChainShares) {
strategies[strategies.length - 1] = beaconChainETHStrategy;
}
- (
- uint256[] memory depositAmounts,
- uint256[] memory withdrawalAmounts,
- uint64[] memory prevMaxMagnitudes,
- ) = _fuzzDepositWithdrawalAmounts({ r: r, numStrategies: uint32(strategies.length) });
+ (uint256[] memory depositAmounts, uint256[] memory withdrawalAmounts, uint64[] memory prevMaxMagnitudes,) =
+ _fuzzDepositWithdrawalAmounts({r: r, numStrategies: uint32(strategies.length)});
_registerOperatorWithBaseDetails(defaultOperator);
allocationManagerMock.setMaxMagnitudes(defaultOperator, strategies, prevMaxMagnitudes);
_depositIntoStrategies(defaultStaker, strategies, depositAmounts);
@@ -5535,9 +5351,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
});
}
assertEq(
- delegationManager.delegatedTo(defaultStaker),
- defaultOperator,
- "staker should be delegated to operator"
+ delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator"
);
assertEq(
nonceBefore + 1,
@@ -5552,7 +5366,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
* with multiple strategies and sharesAmounts. Operator has random maxMagnitudes for each strategy.
* Depending on number of strategies randomized, deposits sharesAmounts into each strategy for the staker and delegates to operator.
* After depositing, the operator gets slashed for each of the strategies and has new maxMagnitudes set.
- * For each strategy,
+ * For each strategy,
* - Asserts that staker is delegated to the operator
* - Asserts that shares for delegatedTo operator are decreased by `depositAmount`
* - Asserts that staker cumulativeWithdrawalsQueued nonce is incremented
@@ -5563,7 +5377,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
) public rand(r) {
// 1. Setup
// - fuzz numbers of strategies, deposit and withdraw amounts, and prev/new magnitudes for each strategy respectively
- // - deposit into strategies, delegate to operator
+ // - deposit into strategies, delegate to operator
IStrategy[] memory strategies = r.StrategyArray(r.Uint32(1, 32));
bool depositBeaconChainShares = r.Boolean();
if (depositBeaconChainShares) {
@@ -5574,7 +5388,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
uint256[] memory withdrawalAmounts,
uint64[] memory prevMaxMagnitudes,
uint64[] memory newMaxMagnitudes
- ) = _fuzzDepositWithdrawalAmounts({ r: r, numStrategies: uint32(strategies.length) });
+ ) = _fuzzDepositWithdrawalAmounts({r: r, numStrategies: uint32(strategies.length)});
_registerOperatorWithBaseDetails(defaultOperator);
allocationManagerMock.setMaxMagnitudes(defaultOperator, strategies, prevMaxMagnitudes);
_depositIntoStrategies(defaultStaker, strategies, depositAmounts);
@@ -5600,9 +5414,11 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
uint256[] memory slashedOperatorShares = new uint256[](strategies.length);
for (uint256 i = 0; i < strategies.length; i++) {
uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategies[i]);
- delegationManager.slashOperatorShares(defaultOperator, strategies[i], prevMaxMagnitudes[i], newMaxMagnitudes[i]);
+ delegationManager.slashOperatorShares(
+ defaultOperator, strategies[i], prevMaxMagnitudes[i], newMaxMagnitudes[i]
+ );
// Assert correct amount of shares slashed from operator
- (slashedOperatorShares[i], ) = _assertOperatorSharesAfterSlash({
+ (slashedOperatorShares[i],) = _assertOperatorSharesAfterSlash({
operator: defaultOperator,
strategy: strategies[i],
operatorSharesBefore: operatorSharesBefore,
@@ -5652,9 +5468,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
});
}
assertEq(
- delegationManager.delegatedTo(defaultStaker),
- defaultOperator,
- "staker should be delegated to operator"
+ delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator"
);
assertEq(
nonceBefore + 1,
@@ -5673,7 +5487,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
) public rand(r) {
// 1. Setup
// - fuzz numbers of strategies, deposit and withdraw amounts, and prev/new magnitudes for each strategy respectively
- // - deposit into strategies, delegate to operator
+ // - deposit into strategies, delegate to operator
uint32 numStrats = r.Uint32(1, 32);
IStrategy[] memory strategies = r.StrategyArray(numStrats);
bool depositBeaconChainShares = r.Boolean();
@@ -5685,7 +5499,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
uint256[] memory withdrawalAmounts,
uint64[] memory prevMaxMagnitudes,
uint64[] memory newMaxMagnitudes
- ) = _fuzzDepositWithdrawalAmounts({ r: r, numStrategies: numStrats });
+ ) = _fuzzDepositWithdrawalAmounts({r: r, numStrategies: numStrats});
// randomly choose strategy to have 0 newMaxMagnitude
uint256 zeroMagnitudeIndex = r.Uint256(0, numStrats - 1);
newMaxMagnitudes[zeroMagnitudeIndex] = 0;
@@ -5715,10 +5529,12 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
cheats.startPrank(address(allocationManagerMock));
for (uint256 i = 0; i < strategies.length; i++) {
uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategies[i]);
- delegationManager.slashOperatorShares(defaultOperator, strategies[i], prevMaxMagnitudes[i], newMaxMagnitudes[i]);
-
+ delegationManager.slashOperatorShares(
+ defaultOperator, strategies[i], prevMaxMagnitudes[i], newMaxMagnitudes[i]
+ );
+
// Assertions on amount burned
- (slashedOperatorShares[i], ) = _assertOperatorSharesAfterSlash({
+ (slashedOperatorShares[i],) = _assertOperatorSharesAfterSlash({
operator: defaultOperator,
strategy: strategies[i],
operatorSharesBefore: operatorSharesBefore,
@@ -5728,9 +5544,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
// additional assertion checks for strategy that was slashed 100%
if (zeroMagnitudeIndex == i) {
assertEq(
- slashedOperatorShares[i],
- operatorSharesBefore,
- "expected slashed operator shares to be full amount"
+ slashedOperatorShares[i], operatorSharesBefore, "expected slashed operator shares to be full amount"
);
assertEq(
delegationManager.operatorShares(defaultOperator, strategies[i]),
@@ -5770,11 +5584,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
// 5. Post queueWithdrawal state values
for (uint256 i = 0; i < strategies.length; i++) {
if (zeroMagnitudeIndex == i) {
- assertEq(
- newMaxMagnitudes[i],
- 0,
- "expected new max magnitude to be 0"
- );
+ assertEq(newMaxMagnitudes[i], 0, "expected new max magnitude to be 0");
}
_assertWithdrawal({
staker: defaultStaker,
@@ -5788,9 +5598,7 @@ contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTes
});
}
assertEq(
- delegationManager.delegatedTo(defaultStaker),
- defaultOperator,
- "staker should be delegated to operator"
+ delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator"
);
assertEq(
nonceBefore + 1,
@@ -5823,7 +5631,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
// single withdrawal interface
cheats.expectRevert(IPausable.CurrentlyPaused.selector);
- delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false);
+ delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false);
IERC20[][] memory tokensArray = new IERC20[][](1);
tokensArray[0] = tokens;
@@ -5836,7 +5644,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
// multiple Withdrawal interface
cheats.expectRevert(IPausable.CurrentlyPaused.selector);
- delegationManager.completeQueuedWithdrawals(withdrawals, tokensArray, receiveAsTokens);
+ delegationManager.completeQueuedWithdrawals(withdrawals, tokensArray, receiveAsTokens);
}
function test_Revert_WhenInputArrayLengthMismatch() public {
@@ -5861,21 +5669,20 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
cheats.prank(defaultStaker);
cheats.expectRevert(InputArrayLengthMismatch.selector);
- delegationManager.completeQueuedWithdrawal(withdrawal, newTokens, false);
+ delegationManager.completeQueuedWithdrawal(withdrawal, newTokens, false);
// check that the withdrawal completes otherwise
cheats.prank(defaultStaker);
- delegationManager.completeQueuedWithdrawal(withdrawal, tokens, true);
+ delegationManager.completeQueuedWithdrawal(withdrawal, tokens, true);
}
- function test_Revert_WhenWithdrawerNotCaller(Randomness r) rand(r) public {
+ function test_Revert_WhenWithdrawerNotCaller(
+ Randomness r
+ ) public rand(r) {
address invalidCaller = r.Address();
_registerOperatorWithBaseDetails(defaultOperator);
- (
- Withdrawal memory withdrawal,
- IERC20[] memory tokens,
- ) = _setUpCompleteQueuedWithdrawalSingleStrat({
+ (Withdrawal memory withdrawal, IERC20[] memory tokens,) = _setUpCompleteQueuedWithdrawalSingleStrat({
staker: defaultStaker,
depositAmount: 100,
withdrawalAmount: 100,
@@ -5885,16 +5692,13 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
cheats.expectRevert(WithdrawerNotCaller.selector);
cheats.prank(invalidCaller);
- delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false);
+ delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false);
}
function test_Revert_WhenInvalidWithdrawalRoot() public {
_registerOperatorWithBaseDetails(defaultOperator);
- (
- Withdrawal memory withdrawal,
- IERC20[] memory tokens,
- bytes32 withdrawalRoot
- ) = _setUpCompleteQueuedWithdrawalSingleStrat({
+ (Withdrawal memory withdrawal, IERC20[] memory tokens, bytes32 withdrawalRoot) =
+ _setUpCompleteQueuedWithdrawalSingleStrat({
staker: defaultStaker,
depositAmount: 100,
withdrawalAmount: 100,
@@ -5905,12 +5709,15 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be pending");
cheats.roll(withdrawal.startBlock + delegationManager.minWithdrawalDelayBlocks() + 1);
cheats.prank(defaultStaker);
- delegationManager.completeQueuedWithdrawal(withdrawal, tokens, true);
- assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be completed and marked false now");
+ delegationManager.completeQueuedWithdrawal(withdrawal, tokens, true);
+ assertFalse(
+ delegationManager.pendingWithdrawals(withdrawalRoot),
+ "withdrawalRoot should be completed and marked false now"
+ );
cheats.expectRevert(WithdrawalNotQueued.selector);
cheats.prank(defaultStaker);
- delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false);
+ delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false);
}
/**
@@ -5918,15 +5725,14 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
* delegationManager.getCompletableTimestamp returns a value greater than MIN_WITHDRAWAL_DELAY_BLOCKS
* then it should revert if the validBlockNumber has not passed either.
*/
- function test_Revert_WhenWithdrawalDelayNotPassed(Randomness r) rand(r) public {
+ function test_Revert_WhenWithdrawalDelayNotPassed(
+ Randomness r
+ ) public rand(r) {
uint32 numStrategies = r.Uint32(1, 32);
bool receiveAsTokens = r.Boolean();
- (
- uint256[] memory depositAmounts,
- uint256[] memory withdrawalAmounts,
- ,
- ) = _fuzzDepositWithdrawalAmounts(r, numStrategies);
-
+ (uint256[] memory depositAmounts, uint256[] memory withdrawalAmounts,,) =
+ _fuzzDepositWithdrawalAmounts(r, numStrategies);
+
_registerOperatorWithBaseDetails(defaultOperator);
(
Withdrawal memory withdrawal,
@@ -5946,8 +5752,8 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens);
}
- /// @notice Verifies that when we complete a withdrawal as shares after a full slash, we revert
- function test_revert_fullySlashed() public {
+ /// @notice Verifies that when we complete a withdrawal as shares after a full slash, we clear the withdrawal
+ function test_clearWithdrawal_fullySlashed() public {
// Register operator
_registerOperatorWithBaseDetails(defaultOperator);
_setOperatorMagnitude(defaultOperator, strategyMock, WAD);
@@ -5959,10 +5765,8 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
// Queue withdrawal
uint256 withdrawalAmount = depositAmount;
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) =
+ _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategyMock,
depositSharesToWithdraw: withdrawalAmount
@@ -5978,28 +5782,42 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
cheats.prank(address(allocationManagerMock));
delegationManager.slashOperatorShares(defaultOperator, strategyMock, WAD, 0);
- // Complete withdrawal as shares and assert that operator has no shares increased
+ // Complete withdrawal as shares and check that withdrawal was cleared
cheats.roll(block.number + 1);
IERC20[] memory tokens = strategyMock.underlyingToken().toArray();
- cheats.expectRevert(FullySlashed.selector);
+
+ bytes32 withdrawalRoot = delegationManager.calculateWithdrawalRoot(withdrawal);
+ assertTrue(
+ delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be pending before completion"
+ );
+
cheats.prank(defaultStaker);
delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false);
+
+ assertFalse(
+ delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be cleared after completion"
+ );
+
+ // Assert that no shares were added back
+ assertEq(delegationManager.operatorShares(defaultOperator, strategyMock), 0, "operator shares should remain 0");
+ (uint256[] memory withdrawableShares,) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray());
+ assertEq(withdrawableShares[0], 0, "withdrawable shares should be 0");
}
/**
* Test completing multiple queued withdrawals for a single strategy by passing in the withdrawals
*/
- function test_completeQueuedWithdrawals_MultipleWithdrawals(Randomness r) public rand(r) {
+ function test_completeQueuedWithdrawals_MultipleWithdrawals(
+ Randomness r
+ ) public rand(r) {
address staker = r.Address();
uint256 depositAmount = r.Uint256(1, MAX_STRATEGY_SHARES);
uint256 numWithdrawals = r.Uint256(2, 20);
bool receiveAsTokens = r.Boolean();
- (
- Withdrawal[] memory withdrawals,
- IERC20[][] memory tokens,
- bytes32[] memory withdrawalRoots
- ) = _setUpCompleteQueuedWithdrawalsSingleStrat({
+ (Withdrawal[] memory withdrawals, IERC20[][] memory tokens, bytes32[] memory withdrawalRoots) =
+ _setUpCompleteQueuedWithdrawalsSingleStrat({
staker: staker,
depositAmount: depositAmount,
numWithdrawals: numWithdrawals
@@ -6009,7 +5827,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
_delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator);
uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, withdrawals[0].strategies[0]);
- for (uint i = 0; i < withdrawalRoots.length; i++) {
+ for (uint256 i = 0; i < withdrawalRoots.length; i++) {
assertTrue(delegationManager.pendingWithdrawals(withdrawalRoots[i]), "withdrawalRoots should be pending");
}
bool[] memory receiveAsTokensArray = receiveAsTokens.toArray(numWithdrawals);
@@ -6027,22 +5845,12 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
delegationManager.completeQueuedWithdrawals(withdrawals, tokens, receiveAsTokensArray);
// assertion checks
- (
- uint256[] memory withdrawableShares,
- uint256[] memory depositShares
- ) = delegationManager.getWithdrawableShares(staker, withdrawals[0].strategies);
+ (uint256[] memory withdrawableShares, uint256[] memory depositShares) =
+ delegationManager.getWithdrawableShares(staker, withdrawals[0].strategies);
uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, withdrawals[0].strategies[0]);
if (receiveAsTokens) {
- assertEq(
- withdrawableShares[0],
- 0,
- "withdrawable shares should be 0 from withdrawing all"
- );
- assertEq(
- depositShares[0],
- 0,
- "deposit shares should be 0 from withdrawing all"
- );
+ assertEq(withdrawableShares[0], 0, "withdrawable shares should be 0 from withdrawing all");
+ assertEq(depositShares[0], 0, "deposit shares should be 0 from withdrawing all");
assertEq(operatorSharesAfter, operatorSharesBefore, "operator shares should be unchanged");
} else {
assertEq(
@@ -6050,11 +5858,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
depositAmount * numWithdrawals,
"withdrawable shares should be added back as shares"
);
- assertEq(
- depositShares[0],
- depositAmount * numWithdrawals,
- "deposit shares should be added back as shares"
- );
+ assertEq(depositShares[0], depositAmount * numWithdrawals, "deposit shares should be added back as shares");
assertEq(
operatorSharesAfter,
operatorSharesBefore + depositAmount * numWithdrawals,
@@ -6083,17 +5887,14 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
*/
function test_completeQueuedWithdrawal_SingleStrat(
Randomness r
- ) public rand(r) {
+ ) public rand(r) {
uint256 depositAmount = r.Uint256(1, MAX_STRATEGY_SHARES);
uint256 withdrawalAmount = r.Uint256(1, depositAmount);
bool receiveAsTokens = r.Boolean();
_registerOperatorWithBaseDetails(defaultOperator);
- (
- Withdrawal memory withdrawal,
- IERC20[] memory tokens,
- bytes32 withdrawalRoot
- ) = _setUpCompleteQueuedWithdrawalSingleStrat({
+ (Withdrawal memory withdrawal, IERC20[] memory tokens, bytes32 withdrawalRoot) =
+ _setUpCompleteQueuedWithdrawalSingleStrat({
staker: defaultStaker,
depositAmount: depositAmount,
withdrawalAmount: withdrawalAmount,
@@ -6113,7 +5914,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
})
);
cheats.prank(defaultStaker);
- delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens);
+ delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens);
_assertCompletedWithdrawal(
AssertCompletedWithdrawalStruct({
@@ -6157,11 +5958,8 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
// Queue withdrawal
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) =
+ _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategyMock,
depositSharesToWithdraw: withdrawalAmount
@@ -6188,14 +5986,16 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
// Slash operator while staker has queued withdrawal
{
uint256 operatorSharesAfterQueue = delegationManager.operatorShares(defaultOperator, strategyMock);
- (uint256 sharesToDecrement, ) = _calcSlashedAmount({
+ (uint256 sharesToDecrement,) = _calcSlashedAmount({
operatorShares: operatorSharesAfterQueue,
prevMaxMagnitude: prevMaxMagnitude,
newMaxMagnitude: newMaxMagnitude
});
_setOperatorMagnitude(defaultOperator, strategyMock, newMaxMagnitude);
cheats.prank(address(allocationManagerMock));
- delegationManager.slashOperatorShares(defaultOperator, withdrawal.strategies[0], prevMaxMagnitude, newMaxMagnitude);
+ delegationManager.slashOperatorShares(
+ defaultOperator, withdrawal.strategies[0], prevMaxMagnitude, newMaxMagnitude
+ );
uint256 operatorSharesAfterSlash = delegationManager.operatorShares(defaultOperator, strategyMock);
assertEq(
operatorSharesAfterSlash,
@@ -6205,10 +6005,8 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
}
// Complete queue withdrawal
- (
- uint256[] memory withdrawableShares,
- uint256[] memory depositShares
- ) = delegationManager.getWithdrawableShares(defaultStaker, withdrawal.strategies);
+ (uint256[] memory withdrawableShares, uint256[] memory depositShares) =
+ delegationManager.getWithdrawableShares(defaultStaker, withdrawal.strategies);
uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock);
{
IERC20[] memory tokens = new IERC20[](1);
@@ -6222,7 +6020,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
})
);
cheats.prank(defaultStaker);
- delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens);
+ delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens);
}
_assertCompletedWithdrawal(
@@ -6267,11 +6065,8 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
// Queue withdrawal
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) =
+ _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: beaconChainETHStrategy,
depositSharesToWithdraw: withdrawalAmount
@@ -6281,19 +6076,25 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
{
uint256 sharesToDecrement = _calcWithdrawableShares({
depositShares: withdrawalAmount,
- depositScalingFactor: uint256(WAD).divWad(initialBCSF),
+ depositScalingFactor: uint256(WAD),
slashingFactor: uint256(initialBCSF)
});
- uint256 operatorSharesBeforeQueue = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy);
+ uint256 operatorSharesBeforeQueue =
+ delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy);
cheats.prank(defaultStaker);
delegationManager.queueWithdrawals(queuedWithdrawalParams);
assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be pending");
uint256 operatorSharesAfterQueue = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy);
- assertEq(operatorSharesAfterQueue, operatorSharesBeforeQueue - sharesToDecrement, "operator shares should be decreased after queue");
+ assertEq(
+ operatorSharesAfterQueue,
+ operatorSharesBeforeQueue - sharesToDecrement,
+ "operator shares should be decreased after queue"
+ );
// Slash the staker for beacon chain shares while it has queued a withdrawal
// simulate the operations done in EigenPodManager._reduceSlashingFactor
- (uint256[] memory withdrawableSharesBefore, ) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
+ (uint256[] memory withdrawableSharesBefore,) =
+ delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
uint256 currentPodShares = uint256(depositAmount) - withdrawalAmount;
(prevBeaconSlashingFactor, newBeaconSlashingFactor) = _decreaseBeaconChainShares({
@@ -6304,17 +6105,17 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
uint256 expectedWithdrawableShares = _calcWithdrawableShares({
depositShares: uint256(currentPodShares),
- depositScalingFactor: uint256(WAD).divWad(prevBeaconSlashingFactor),
+ depositScalingFactor: uint256(WAD),
slashingFactor: uint256(newBeaconSlashingFactor)
});
- _assertSharesAfterBeaconSlash(defaultStaker, withdrawableSharesBefore[0], expectedWithdrawableShares, prevBeaconSlashingFactor);
+ _assertSharesAfterBeaconSlash(
+ defaultStaker, withdrawableSharesBefore[0], expectedWithdrawableShares, prevBeaconSlashingFactor
+ );
}
// Complete queue withdrawal
- (
- uint256[] memory withdrawableShares,
- uint256[] memory depositShares
- ) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
+ (uint256[] memory withdrawableShares, uint256[] memory depositShares) =
+ delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy);
{
@@ -6328,7 +6129,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
})
);
cheats.prank(defaultStaker);
- delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens);
+ delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens);
}
_assertCompletedWithdrawal(
@@ -6340,7 +6141,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
operatorSharesBefore: operatorSharesBefore.toArrayU256(),
withdrawableSharesBefore: withdrawableShares,
depositSharesBefore: depositShares,
- prevDepositScalingFactors: uint256(WAD).divWad(initialBCSF).toArrayU256(),
+ prevDepositScalingFactors: uint256(WAD).toArrayU256(),
slashingFactors: uint256(WAD).toArrayU256(), // beaconChainSlashingFactor is separate from slashingFactors input
beaconChainSlashingFactor: newBeaconSlashingFactor
})
@@ -6371,11 +6172,8 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
uint256 operatorSharesBeforeQueue = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy);
// Queue withdrawal
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) =
+ _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: beaconChainETHStrategy,
depositSharesToWithdraw: withdrawalAmount
@@ -6387,7 +6185,11 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
delegationManager.queueWithdrawals(queuedWithdrawalParams);
assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be pending");
uint256 operatorSharesAfterQueue = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy);
- assertEq(operatorSharesAfterQueue, operatorSharesBeforeQueue - withdrawalAmount, "operator shares should be decreased after queue");
+ assertEq(
+ operatorSharesAfterQueue,
+ operatorSharesBeforeQueue - withdrawalAmount,
+ "operator shares should be decreased after queue"
+ );
// Slash the staker for beacon chain shares while it has queued a withdrawal
// simulate the operations done in EigenPodManager._reduceSlashingFactor
@@ -6396,23 +6198,32 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
beaconShares: depositAmount - int256(withdrawalAmount),
sharesDecrease: (uint256(depositAmount) - withdrawalAmount) / 2
});
- uint256 operatorSharesAfterBeaconSlash = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy);
- assertEq(operatorSharesAfterBeaconSlash, operatorSharesAfterQueue.ceilDiv(2), "operator shares should be decreased after beaconChain slash");
+ uint256 operatorSharesAfterBeaconSlash =
+ delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy);
+ assertEq(
+ operatorSharesAfterBeaconSlash,
+ operatorSharesAfterQueue.ceilDiv(2),
+ "operator shares should be decreased after beaconChain slash"
+ );
// Slash the operator for beacon chain shares
uint64 operatorMagnitude = 5e17;
_setOperatorMagnitude(defaultOperator, withdrawal.strategies[0], operatorMagnitude);
cheats.prank(address(allocationManagerMock));
delegationManager.slashOperatorShares(defaultOperator, withdrawal.strategies[0], WAD, operatorMagnitude);
- uint256 operatorSharesAfterAVSSlash = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy);
- assertApproxEqAbs(operatorSharesAfterAVSSlash, operatorSharesAfterBeaconSlash / 2, 1, "operator shares should be decreased after AVS slash");
+ uint256 operatorSharesAfterAVSSlash =
+ delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy);
+ assertApproxEqAbs(
+ operatorSharesAfterAVSSlash,
+ operatorSharesAfterBeaconSlash / 2,
+ 1,
+ "operator shares should be decreased after AVS slash"
+ );
}
// Complete queue withdrawal
- (
- uint256[] memory withdrawableShares,
- uint256[] memory depositShares
- ) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
+ (uint256[] memory withdrawableShares, uint256[] memory depositShares) =
+ delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy);
IERC20[] memory tokens = new IERC20[](1);
cheats.roll(withdrawal.startBlock + delegationManager.minWithdrawalDelayBlocks() + 1);
@@ -6424,7 +6235,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
})
);
cheats.prank(defaultStaker);
- delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens);
+ delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens);
_assertCompletedWithdrawal(
AssertCompletedWithdrawalStruct({
@@ -6442,7 +6253,6 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
);
}
-
/**
* @notice Verifies that `DelegationManager.completeQueuedWithdrawal` properly completes a queued withdrawal for the `withdrawer`
* for a single strategy. Withdraws as shares so if the withdrawer is delegated, operator shares increase. In the test case, this only
@@ -6457,14 +6267,11 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
address staker = r.Address();
uint128 depositAmount = r.Uint128();
uint128 withdrawalAmount = r.Uint128(1, depositAmount);
-
+
_registerOperatorWithBaseDetails(defaultOperator);
- (
- Withdrawal memory withdrawal,
- IERC20[] memory tokens,
- bytes32 withdrawalRoot
- ) = _setUpCompleteQueuedWithdrawalSingleStrat({
+ (Withdrawal memory withdrawal, IERC20[] memory tokens, bytes32 withdrawalRoot) =
+ _setUpCompleteQueuedWithdrawalSingleStrat({
staker: staker,
depositAmount: depositAmount,
withdrawalAmount: withdrawalAmount,
@@ -6480,22 +6287,25 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
// completeQueuedWithdrawal
cheats.roll(withdrawal.startBlock + delegationManager.minWithdrawalDelayBlocks() + 1);
_completeQueuedWithdrawal_expectEmit(
- CompleteQueuedWithdrawalEmitStruct({
- withdrawal: withdrawal,
- tokens: tokens,
- receiveAsTokens: false
- })
+ CompleteQueuedWithdrawalEmitStruct({withdrawal: withdrawal, tokens: tokens, receiveAsTokens: false})
);
cheats.prank(staker);
- delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false);
+ delegationManager.completeQueuedWithdrawal(withdrawal, tokens, false);
uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, withdrawal.strategies[0]);
// Since staker is delegated, operatorShares get incremented
- assertEq(operatorSharesAfter, operatorSharesBefore + withdrawalAmount, "operator shares not increased correctly");
- assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be completed and marked false now");
+ assertEq(
+ operatorSharesAfter, operatorSharesBefore + withdrawalAmount, "operator shares not increased correctly"
+ );
+ assertFalse(
+ delegationManager.pendingWithdrawals(withdrawalRoot),
+ "withdrawalRoot should be completed and marked false now"
+ );
}
- function testFuzz_completeQueuedWithdrawals_OutOfOrderBlocking(Randomness r) public {
+ function testFuzz_completeQueuedWithdrawals_OutOfOrderBlocking(
+ Randomness r
+ ) public {
uint256 totalDepositShares = r.Uint256(4, 100 ether);
uint256 depositSharesPerWithdrawal = totalDepositShares / 4;
@@ -6505,20 +6315,14 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
QueuedWithdrawalParams[] memory queuedParams = new QueuedWithdrawalParams[](4);
Withdrawal[] memory withdrawals = new Withdrawal[](4);
-
+
uint256 startBlock = block.number;
uint256 nonce = delegationManager.cumulativeWithdrawalsQueued(defaultStaker);
for (uint256 i; i < 4; ++i) {
cheats.roll(startBlock + i);
- (
- QueuedWithdrawalParams[] memory params,
- Withdrawal memory withdrawal,
- ) = _setUpQueueWithdrawalsSingleStrat(
- defaultStaker,
- strategyMock,
- depositSharesPerWithdrawal
- );
+ (QueuedWithdrawalParams[] memory params, Withdrawal memory withdrawal,) =
+ _setUpQueueWithdrawalsSingleStrat(defaultStaker, strategyMock, depositSharesPerWithdrawal);
withdrawal.nonce = nonce;
nonce += 1;
@@ -6529,12 +6333,12 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
cheats.startPrank(defaultStaker);
cheats.roll(startBlock);
-
+
delegationManager.queueWithdrawals(queuedParams[0].toArray());
cheats.roll(startBlock + 1);
delegationManager.queueWithdrawals(queuedParams[1].toArray());
-
- (Withdrawal[] memory firstWithdrawals, ) = delegationManager.getQueuedWithdrawals(defaultStaker);
+
+ (Withdrawal[] memory firstWithdrawals,) = delegationManager.getQueuedWithdrawals(defaultStaker);
cheats.roll(startBlock + 2);
delegationManager.queueWithdrawals(queuedParams[2].toArray());
@@ -6548,23 +6352,17 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage
bytes32 root1 = delegationManager.calculateWithdrawalRoot(withdrawals[0]);
bytes32 root2 = delegationManager.calculateWithdrawalRoot(withdrawals[1]);
-
+
bytes32 root1_view = delegationManager.calculateWithdrawalRoot(firstWithdrawals[0]);
bytes32 root2_view = delegationManager.calculateWithdrawalRoot(firstWithdrawals[1]);
- assertEq(
- root1, root1_view,
- "withdrawal root should be the same"
- );
+ assertEq(root1, root1_view, "withdrawal root should be the same");
- assertEq(
- root2, root2_view,
- "withdrawal root should be the same"
- );
+ assertEq(root2, root2_view, "withdrawal root should be the same");
cheats.roll(startBlock + delay + 2);
delegationManager.completeQueuedWithdrawals(firstWithdrawals, tokens, true.toArray(2));
-
+
// Throws `WithdrawalNotQueued`.
cheats.roll(startBlock + delay + 3);
delegationManager.completeQueuedWithdrawals(withdrawals[2].toArray(), tokens, true.toArray());
@@ -6578,7 +6376,9 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
using Math for *;
/// @notice Verifies that `DelegationManager.slashOperatorShares` reverts if not called by the AllocationManager
- function testFuzz_Revert_slashOperatorShares_invalidCaller(Randomness r) public rand(r) {
+ function testFuzz_Revert_slashOperatorShares_invalidCaller(
+ Randomness r
+ ) public rand(r) {
address invalidCaller = r.Address();
cheats.startPrank(invalidCaller);
@@ -6591,7 +6391,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
_registerOperatorWithBaseDetails(defaultOperator);
cheats.prank(address(allocationManagerMock));
- delegationManager.slashOperatorShares(defaultOperator, strategyMock, WAD, WAD/2);
+ delegationManager.slashOperatorShares(defaultOperator, strategyMock, WAD, WAD / 2);
assertEq(delegationManager.operatorShares(defaultOperator, strategyMock), 0, "shares should not have changed");
}
@@ -6608,10 +6408,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// Queue withdrawal
uint256 withdrawalAmount = depositAmount;
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) =
+ _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategyMock,
depositSharesToWithdraw: withdrawalAmount
@@ -6631,32 +6429,28 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
uint256 slashableSharesInQueueAfter = delegationManager.getSlashableSharesInQueue(defaultOperator, strategyMock);
- // Complete withdrawal as tokens and assert that nothing is returned
+ // Complete withdrawal as tokens and assert that nothing is returned and withdrawal is cleared
cheats.roll(block.number + 1);
IERC20[] memory tokens = strategyMock.underlyingToken().toArray();
- cheats.expectCall(
- address(strategyManagerMock),
- abi.encodeWithSelector(
- IShareManager.withdrawSharesAsTokens.selector,
- defaultStaker,
- strategyMock,
- strategyMock.underlyingToken(),
- 0
- )
+
+ bytes32 withdrawalRoot = delegationManager.calculateWithdrawalRoot(withdrawal);
+ assertTrue(
+ delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be pending before completion"
);
+
cheats.prank(defaultStaker);
delegationManager.completeQueuedWithdrawal(withdrawal, tokens, true);
+ assertFalse(
+ delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawal should be cleared after completion"
+ );
+
assertEq(
slashableSharesInQueue,
depositAmount,
"the withdrawal in queue from block.number - minWithdrawalDelayBlocks should still be included"
);
- assertEq(
- slashableSharesInQueueAfter,
- 0,
- "slashable shares in queue should be 0 after burning"
- );
+ assertEq(slashableSharesInQueueAfter, 0, "slashable shares in queue should be 0 after burning");
}
/// @notice Verifies that shares are NOT burnable for a withdrawal queued just before the MIN_WITHDRAWAL_DELAY_BLOCKS
@@ -6672,10 +6466,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// Queue withdrawal
uint256 withdrawalAmount = depositAmount;
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) =
+ _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategyMock,
depositSharesToWithdraw: withdrawalAmount
@@ -6706,7 +6498,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
)
);
cheats.prank(defaultStaker);
- delegationManager.completeQueuedWithdrawal(withdrawal, tokens, true);
+ delegationManager.completeQueuedWithdrawal(withdrawal, tokens, true);
}
/**
@@ -6725,10 +6517,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// Queue 5 withdrawals
uint256 startBlock = block.number;
uint256 withdrawalAmount = depositAmount / 6;
- for(uint256 i = 0; i < 5; i++) {
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,,
- ) = _setUpQueueWithdrawalsSingleStrat({
+ for (uint256 i = 0; i < 5; i++) {
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) = _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategyMock,
depositSharesToWithdraw: withdrawalAmount
@@ -6744,7 +6534,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// Get slashable shares
uint256 slashableSharesInQueue = delegationManager.getSlashableSharesInQueue(defaultOperator, strategyMock);
- assertEq(slashableSharesInQueue, depositAmount/6 * 3, "slashable shares in queue should be 3/6 of the deposit amount");
+ assertEq(
+ slashableSharesInQueue,
+ depositAmount / 6 * 3,
+ "slashable shares in queue should be 3/6 of the deposit amount"
+ );
// Slash all of operator's shares
_setOperatorMagnitude(defaultOperator, strategyMock, 0);
@@ -6757,7 +6551,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
depositAmount / 6 // 1 withdrawal not queued so decreased
);
delegationManager.slashOperatorShares(defaultOperator, strategyMock, WAD, 0);
-
+
// Assert slashable shares
slashableSharesInQueue = delegationManager.getSlashableSharesInQueue(defaultOperator, strategyMock);
assertEq(slashableSharesInQueue, 0);
@@ -6767,7 +6561,9 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
* @notice Verifies that `DelegationManager.slashOperatorShares` properly decreases the delegated `shares` that the operator
* who the `defaultStaker` is delegated to has in the strategies
*/
- function testFuzz_slashOperatorShares_slashedOperator(Randomness r) public rand(r) {
+ function testFuzz_slashOperatorShares_slashedOperator(
+ Randomness r
+ ) public rand(r) {
// sanity-filtering on fuzzed input length & staker
IStrategy[] memory strategies = r.StrategyArray(16);
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES);
@@ -6785,7 +6581,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// Set the staker deposits in the strategies
uint256[] memory sharesToSet = new uint256[](strategies.length);
uint256[] memory depositScalingFactors = new uint256[](strategies.length);
- for(uint256 i = 0; i < strategies.length; i++) {
+ for (uint256 i = 0; i < strategies.length; i++) {
strategies[i] = IStrategy(random().Address());
sharesToSet[i] = shares;
depositScalingFactors[i] = uint256(WAD).divWad(uint256(prevMaxMagnitude));
@@ -6832,12 +6628,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
});
cheats.expectEmit(true, true, true, true, address(delegationManager));
- emit OperatorSharesDecreased(
- defaultOperator,
- address(0),
- strategies[i],
- sharesToDecrease
- );
+ emit OperatorSharesDecreased(defaultOperator, address(0), strategies[i], sharesToDecrease);
delegationManager.slashOperatorShares(defaultOperator, strategies[i], prevMaxMagnitude, newMaxMagnitude);
// Also update maxMagnitude in ALM mock
@@ -6849,7 +6640,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
}
// check shares after call to `slashOperatorShares`
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategies);
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, strategies);
for (uint256 i = 0; i < strategies.length; ++i) {
uint256 delegatedSharesAfter = delegationManager.operatorShares(delegatedTo, strategies[i]);
assertEq(
@@ -6893,7 +6684,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
uint256 queuedSlashableSharesBefore = delegationManager.getSlashableSharesInQueue(operator, strategyMock);
// calculate burned shares, should be halved
- uint256 sharesToBurn = shares/2;
+ uint256 sharesToBurn = shares / 2;
// Burn shares
_slashOperatorShares_expectEmit(
@@ -6904,6 +6695,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
sharesToBurn: sharesToBurn
})
);
+
+ // Assert OperatorSharesSlashed event was emitted with correct params
+ cheats.expectEmit(true, true, true, true, address(delegationManager));
+ emit OperatorSharesSlashed(operator, strategyMock, sharesToBurn);
+
cheats.prank(address(allocationManagerMock));
delegationManager.slashOperatorShares({
operator: operator,
@@ -6916,7 +6712,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
uint256 operatorSharesAfter = delegationManager.operatorShares(operator, strategyMock);
assertEq(queuedSlashableSharesBefore, 0, "there should be no slashable shares in queue");
assertEq(queuedSlashableSharesAfter, 0, "there should be no slashable shares in queue");
- assertEq(operatorSharesAfter, operatorSharesBefore - sharesToBurn, "operator shares should be decreased by sharesToBurn");
+ assertEq(
+ operatorSharesAfter,
+ operatorSharesBefore - sharesToBurn,
+ "operator shares should be decreased by sharesToBurn"
+ );
}
/**
@@ -6951,10 +6751,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// 3. Queue withdrawal for staker2 and roll blocks forward so that the withdrawal is not slashable
{
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) =
+ _setUpQueueWithdrawalsSingleStrat({
staker: staker2,
strategy: strategyMock,
depositSharesToWithdraw: withdrawAmount
@@ -6988,6 +6786,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
sharesToBurn: sharesToBurn
})
);
+
+ // Assert OperatorSharesSlashed event was emitted with correct params
+ cheats.expectEmit(true, true, true, true, address(delegationManager));
+ emit OperatorSharesSlashed(operator, strategyMock, sharesToBurn);
+
cheats.prank(address(allocationManagerMock));
delegationManager.slashOperatorShares({
operator: operator,
@@ -7001,14 +6804,20 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
uint256 operatorSharesAfter = delegationManager.operatorShares(operator, strategyMock);
assertEq(queuedSlashableSharesBefore, 0, "there should be no slashable shares in queue");
assertEq(queuedSlashableSharesAfter, 0, "there should be no slashable shares in queue");
- assertEq(operatorSharesAfter, operatorSharesBefore - sharesToBurn, "operator shares should be decreased by sharesToBurn");
+ assertEq(
+ operatorSharesAfter,
+ operatorSharesBefore - sharesToBurn,
+ "operator shares should be decreased by sharesToBurn"
+ );
}
/**
* @notice Test burning shares for an operator with slashable queued withdrawals in past MIN_WITHDRAWAL_DELAY_BLOCKS window.
* There exists a single withdrawal that is slashable.
*/
- function testFuzz_slashOperatorShares_SingleSlashableWithdrawal(Randomness r) public rand(r) {
+ function testFuzz_slashOperatorShares_SingleSlashableWithdrawal(
+ Randomness r
+ ) public rand(r) {
// 1. Randomize operator and staker info
// Operator info
address operator = r.Address();
@@ -7030,9 +6839,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// 3. Queue withdrawal for staker2 so that the withdrawal is slashable
{
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,,
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) = _setUpQueueWithdrawalsSingleStrat({
staker: staker2,
strategy: strategyMock,
depositSharesToWithdraw: withdrawAmount
@@ -7066,6 +6873,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
sharesToBurn: sharesToBurn
})
);
+
+ // Assert OperatorSharesSlashed event was emitted with correct params
+ cheats.expectEmit(true, true, true, true, address(delegationManager));
+ emit OperatorSharesSlashed(operator, strategyMock, sharesToBurn);
+
cheats.prank(address(allocationManagerMock));
delegationManager.slashOperatorShares({
operator: operator,
@@ -7077,9 +6889,19 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// 5. Assert expected values
uint256 queuedSlashableSharesAfter = delegationManager.getSlashableSharesInQueue(operator, strategyMock);
uint256 operatorSharesAfter = delegationManager.operatorShares(operator, strategyMock);
- assertEq(queuedSlashableSharesBefore, withdrawAmount, "Slashable shares in queue should be full withdraw amount");
- assertEq(queuedSlashableSharesAfter, withdrawAmount / 4, "Slashable shares in queue should be 1/4 withdraw amount after slashing");
- assertEq(operatorSharesAfter, operatorSharesBefore - sharesToDecrease, "operator shares should be decreased by sharesToBurn");
+ assertEq(
+ queuedSlashableSharesBefore, withdrawAmount, "Slashable shares in queue should be full withdraw amount"
+ );
+ assertEq(
+ queuedSlashableSharesAfter,
+ withdrawAmount / 4,
+ "Slashable shares in queue should be 1/4 withdraw amount after slashing"
+ );
+ assertEq(
+ operatorSharesAfter,
+ operatorSharesBefore - sharesToDecrease,
+ "operator shares should be decreased by sharesToBurn"
+ );
}
/**
@@ -7106,10 +6928,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// 3. Queue withdrawal for staker and roll blocks forward so that the withdrawal is not slashable
{
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) =
+ _setUpQueueWithdrawalsSingleStrat({
staker: staker,
strategy: strategyMock,
depositSharesToWithdraw: withdrawAmount1
@@ -7122,10 +6942,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
"there should be withdrawAmount slashable shares in queue"
);
- (
- queuedWithdrawalParams,
- withdrawal,
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (queuedWithdrawalParams, withdrawal,) = _setUpQueueWithdrawalsSingleStrat({
staker: staker,
strategy: strategyMock,
depositSharesToWithdraw: withdrawAmount2
@@ -7145,7 +6962,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// calculate burned shares, should be halved for both operatorShares and slashable shares in queue
// staker queue withdraws shares twice and both withdrawals should be slashed 75%.
uint256 sharesToDecrease = (depositAmount - withdrawAmount1 - withdrawAmount2) * 3 / 4;
- uint256 sharesToBurn = sharesToDecrease + (delegationManager.getSlashableSharesInQueue(operator, strategyMock) * 3 / 4);
+ uint256 sharesToBurn =
+ sharesToDecrease + (delegationManager.getSlashableSharesInQueue(operator, strategyMock) * 3 / 4);
// 4. Burn shares
_setOperatorMagnitude(operator, strategyMock, newMagnitude);
@@ -7157,6 +6975,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
sharesToBurn: sharesToBurn
})
);
+
+ // Assert OperatorSharesSlashed event was emitted with correct params
+ cheats.expectEmit(true, true, true, true, address(delegationManager));
+ emit OperatorSharesSlashed(operator, strategyMock, sharesToBurn);
+
cheats.prank(address(allocationManagerMock));
delegationManager.slashOperatorShares({
operator: operator,
@@ -7168,9 +6991,21 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// 5. Assert expected values
uint256 queuedSlashableSharesAfter = delegationManager.getSlashableSharesInQueue(operator, strategyMock);
uint256 operatorSharesAfter = delegationManager.operatorShares(operator, strategyMock);
- assertEq(queuedSlashableSharesBefore, (withdrawAmount1 + withdrawAmount2), "Slashable shares in queue should be full withdraw amount");
- assertEq(queuedSlashableSharesAfter, (withdrawAmount1 + withdrawAmount2) / 4, "Slashable shares in queue should be 1/4 withdraw amount after slashing");
- assertEq(operatorSharesAfter, operatorSharesBefore - sharesToDecrease, "operator shares should be decreased by sharesToBurn");
+ assertEq(
+ queuedSlashableSharesBefore,
+ (withdrawAmount1 + withdrawAmount2),
+ "Slashable shares in queue should be full withdraw amount"
+ );
+ assertEq(
+ queuedSlashableSharesAfter,
+ (withdrawAmount1 + withdrawAmount2) / 4,
+ "Slashable shares in queue should be 1/4 withdraw amount after slashing"
+ );
+ assertEq(
+ operatorSharesAfter,
+ operatorSharesBefore - sharesToDecrease,
+ "operator shares should be decreased by sharesToBurn"
+ );
}
/**
@@ -7178,9 +7013,9 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
* There exists multiple withdrawals that are slashable but queued with different maxMagnitudes at
* time of queuing.
*
- * Test Setup:
+ * Test Setup:
* - staker1 deposits, queues withdrawal for some amount,
- * - operator slashed 50%
+ * - operator slashed 50%
* - staker 2 deposits, queues withdrawal for some amount
* - operator is then slashed another 50%
* slashed amount for staker 1 should be 75% and staker 2 should be 50% where the total
@@ -7204,9 +7039,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// 3. Queue withdrawal for staker and slash operator for 50%
{
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,,
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) = _setUpQueueWithdrawalsSingleStrat({
staker: staker,
strategy: strategyMock,
depositSharesToWithdraw: depositSharesToWithdraw1
@@ -7219,7 +7052,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
uint256 queuedSlashableSharesBefore = delegationManager.getSlashableSharesInQueue(operator, strategyMock);
uint256 sharesToDecrease = (depositAmount - depositSharesToWithdraw1) / 2;
- uint256 sharesToBurn = sharesToDecrease + depositSharesToWithdraw1/2;
+ uint256 sharesToBurn = sharesToDecrease + depositSharesToWithdraw1 / 2;
// 3.2 Burn shares
_setOperatorMagnitude(operator, strategyMock, newMagnitude);
@@ -7231,6 +7064,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
sharesToBurn: sharesToBurn
})
);
+
+ // Assert OperatorSharesSlashed event was emitted with correct params
+ cheats.expectEmit(true, true, true, true, address(delegationManager));
+ emit OperatorSharesSlashed(operator, strategyMock, sharesToBurn);
+
cheats.prank(address(allocationManagerMock));
delegationManager.slashOperatorShares({
operator: operator,
@@ -7260,15 +7098,12 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// 4. Queue withdrawal for staker and slash operator for 60% again
newMagnitude = 25e16;
{
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,,
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) = _setUpQueueWithdrawalsSingleStrat({
staker: staker,
strategy: strategyMock,
depositSharesToWithdraw: depositSharesToWithdraw2
});
-
// 4.1 queue a withdrawal for the staker
cheats.prank(staker);
delegationManager.queueWithdrawals(queuedWithdrawalParams);
@@ -7288,18 +7123,23 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
sharesToBurn: sharesToBurn
})
);
+
+ // Assert OperatorSharesSlashed event was emitted with correct params
+ cheats.expectEmit(true, true, true, true, address(delegationManager));
+ emit OperatorSharesSlashed(operator, strategyMock, sharesToBurn);
+
cheats.prank(address(allocationManagerMock));
delegationManager.slashOperatorShares({
operator: operator,
strategy: strategyMock,
- prevMaxMagnitude: newMagnitude*2,
+ prevMaxMagnitude: newMagnitude * 2,
newMaxMagnitude: newMagnitude
});
// 4.3 Assert slashable shares and operator shares
assertEq(
queuedSlashableSharesBefore,
- (depositSharesToWithdraw1 + depositSharesToWithdraw2)/2,
+ (depositSharesToWithdraw1 + depositSharesToWithdraw2) / 2,
"Slashable shares in queue before should be both queued withdrawal amounts halved"
);
assertEq(
@@ -7320,7 +7160,9 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
* However if the withdrawal is not completable and the withdrawal delay hasn't elapsed, then the withdrawal
* should be counted as slashable.
*/
- function testFuzz_slashOperatorShares_Timings(Randomness r) public rand(r) {
+ function testFuzz_slashOperatorShares_Timings(
+ Randomness r
+ ) public rand(r) {
// 1. Randomize operator and staker info
// Operator info
address operator = r.Address();
@@ -7337,10 +7179,8 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// 3. Queue withdrawal for staker and roll blocks forward so that the withdrawal is completable
uint256 completableBlock;
{
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) =
+ _setUpQueueWithdrawalsSingleStrat({
staker: staker,
strategy: strategyMock,
depositSharesToWithdraw: depositAmount
@@ -7378,7 +7218,6 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
);
cheats.stopPrank();
-
}
uint256 operatorSharesBefore = delegationManager.operatorShares(operator, strategyMock);
@@ -7393,6 +7232,11 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
sharesToBurn: 0
})
);
+
+ // Assert OperatorSharesSlashed event was emitted with correct params
+ cheats.expectEmit(true, true, true, true, address(delegationManager));
+ emit OperatorSharesSlashed(operator, strategyMock, 0);
+
cheats.prank(address(allocationManagerMock));
delegationManager.slashOperatorShares({
operator: operator,
@@ -7417,7 +7261,9 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
* and there are no slashable shares in the queue. Note: this will be implemented in a future release with
* consideration of the Pectra upgrade.
*/
- function testFuzz_slashOperatorShares_BeaconChainStrategy(Randomness r) public rand(r) {
+ function testFuzz_slashOperatorShares_BeaconChainStrategy(
+ Randomness r
+ ) public rand(r) {
// 1. Randomize operator and staker info
// Operator info
address operator = r.Address();
@@ -7439,9 +7285,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// 3. Queue withdrawal for staker2 so that the withdrawal is slashable
{
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,,
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) = _setUpQueueWithdrawalsSingleStrat({
staker: staker2,
strategy: beaconChainETHStrategy,
depositSharesToWithdraw: withdrawAmount
@@ -7450,24 +7294,31 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
delegationManager.queueWithdrawals(queuedWithdrawalParams);
assertEq(
delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy),
- 0,
- "there should be 0 withdrawAmount slashable shares in queue since this is beaconChainETHStrategy"
+ withdrawAmount,
+ "there should be withdrawAmount slashable shares in queue"
);
}
uint256 operatorSharesBefore = delegationManager.operatorShares(operator, beaconChainETHStrategy);
- uint256 queuedSlashableSharesBefore = delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy);
+ uint256 queuedSlashableSharesBefore =
+ delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy);
// calculate burned shares, should be 3/4 of the original shares
// staker2 queue withdraws shares
// Therefore amount of shares to burn should be what the staker still has remaining + staker1 shares and then
// divided by 2 since the operator was slashed 50%
uint256 sharesToDecrease = (shares + depositAmount - withdrawAmount) * 3 / 4;
+ uint256 sharesToBurn = sharesToDecrease + (delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy) * 3 / 4);
// 4. Burn shares
_setOperatorMagnitude(operator, beaconChainETHStrategy, newMagnitude);
cheats.expectEmit(true, true, true, true, address(delegationManager));
emit OperatorSharesDecreased(operator, address(0), beaconChainETHStrategy, sharesToDecrease);
+
+ // Assert OperatorSharesSlashed event was emitted with correct params
+ cheats.expectEmit(true, true, true, true, address(delegationManager));
+ emit OperatorSharesSlashed(operator, beaconChainETHStrategy, sharesToBurn);
+
cheats.prank(address(allocationManagerMock));
delegationManager.slashOperatorShares({
operator: operator,
@@ -7477,27 +7328,28 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
});
// 5. Assert expected values
- uint256 queuedSlashableSharesAfter = delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy);
+ uint256 queuedSlashableSharesAfter =
+ delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy);
uint256 operatorSharesAfter = delegationManager.operatorShares(operator, beaconChainETHStrategy);
- assertEq(queuedSlashableSharesBefore, 0, "Slashable shares in queue should be 0 for beaconChainStrategy");
- assertEq(queuedSlashableSharesAfter, 0, "Slashable shares in queue should be 0 for beaconChainStrategy");
+ assertEq(queuedSlashableSharesBefore, withdrawAmount, "Slashable shares in queue should be full withdraw amount");
+ assertEq(queuedSlashableSharesAfter, withdrawAmount / 4, "Slashable shares in queue should be 1/4 withdraw amount after slashing");
assertEq(operatorSharesAfter, operatorSharesBefore - sharesToDecrease, "operator shares should be decreased by sharesToDecrease");
}
/**
* @notice This test demonstrates that the rate that withdrawable shares decrease from slashing is at LEAST
- * greater than or equal to the rate that the operator shares decrease from slashing.
+ * greater than or equal to the rate that the operator shares decrease from slashing.
* We want this property otherwise undelegating/queue withdrawing all shares as a staker could lead to a underflow revert.
* Note: If the SlashingLib.calcSlashedAmount function were to round down (overslash) then this test would fail.
*/
function test_slashOperatorShares_slashedRepeatedly() public {
- uint64 initialMagnitude = 90009;
- uint256 shares = 40000000004182209037560531097078597505;
+ uint64 initialMagnitude = 90_009;
+ uint256 shares = 40_000_000_004_182_209_037_560_531_097_078_597_505;
// register *this contract* as an operator
_registerOperatorWithBaseDetails(defaultOperator);
_setOperatorMagnitude(defaultOperator, strategyMock, initialMagnitude);
-
+
// Set the staker deposits in the strategies
strategyManagerMock.addDeposit(defaultStaker, strategyMock, shares);
@@ -7512,19 +7364,18 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
newOperatorMagnitude -= slashMagnitude;
_setOperatorMagnitude(defaultOperator, strategyMock, newOperatorMagnitude);
+ // Assert OperatorSharesSlashed event was emitted with correct params
+ cheats.expectEmit(true, true, true, true, address(delegationManager));
+ emit OperatorSharesSlashed(defaultOperator, strategyMock, 44440000449046438731194137360795695);
+
cheats.prank(address(allocationManagerMock));
delegationManager.slashOperatorShares(
- defaultOperator,
- strategyMock,
- newOperatorMagnitude + slashMagnitude,
- newOperatorMagnitude
+ defaultOperator, strategyMock, newOperatorMagnitude + slashMagnitude, newOperatorMagnitude
);
uint256 operatorSharesAfterSlash = delegationManager.operatorShares(defaultOperator, strategyMock);
- (
- uint256[] memory withdrawableShares,
- uint256[] memory depositShares
- ) = delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray());
+ (uint256[] memory withdrawableShares, uint256[] memory depositShares) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategyMock.toArray());
assertEq(depositShares[0], shares, "staker deposit shares not reset correctly");
assertLe(
withdrawableShares[0],
@@ -7539,7 +7390,9 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
* and also on the beaconChain. This test ensures that the order of slashing does not matter and nets
* the same withdrawableShares for the staker whether slashing occurred on the beaconChain, or on EigenLayer first.
*/
- function testFuzz_beaconSlashAndAVSSlash(Randomness r) public rand(r) {
+ function testFuzz_beaconSlashAndAVSSlash(
+ Randomness r
+ ) public rand(r) {
uint64 initialMagnitude = r.Uint64(2, WAD);
uint64 newMaxMagnitude = r.Uint64(1, initialMagnitude);
// note: beaconShares only goes negative when performing withdrawal -- and this will change post-migration
@@ -7587,15 +7440,13 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
{
// Slash beaconChain first
{
- (withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
+ (withdrawableShares,) =
+ delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
uint256 beaconSharesBeforeSlash = withdrawableShares[0];
uint64 prevBeaconChainSlashingFactor;
- (prevBeaconChainSlashingFactor, newBeaconSlashingFactor) = _decreaseBeaconChainShares(
- defaultStaker,
- beaconShares,
- sharesDecrease
- );
+ (prevBeaconChainSlashingFactor, newBeaconSlashingFactor) =
+ _decreaseBeaconChainShares(defaultStaker, beaconShares, sharesDecrease);
uint256 expectedWithdrawableShares = _calcWithdrawableShares({
depositShares: uint256(beaconShares),
@@ -7611,19 +7462,23 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
}
// Slash on EigenLayer second
{
- (withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
+ (withdrawableShares,) =
+ delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
uint256 beaconSharesBeforeSlash = withdrawableShares[0];
// do a slash via an AVS
_setOperatorMagnitude(defaultOperator, beaconChainETHStrategy, newMaxMagnitude);
cheats.prank(address(allocationManagerMock));
- delegationManager.slashOperatorShares(defaultOperator, beaconChainETHStrategy, initialMagnitude, newMaxMagnitude);
+ delegationManager.slashOperatorShares(
+ defaultOperator, beaconChainETHStrategy, initialMagnitude, newMaxMagnitude
+ );
// save the outcome
- (withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
+ (withdrawableShares,) =
+ delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
uint256 beaconSharesAfterSecondSlash = withdrawableShares[0];
uint256 expectedWithdrawable = _calcWithdrawableShares(
- uint256(beaconShares),
+ uint256(beaconShares),
uint256(WAD).divWad(initialMagnitude),
_getSlashingFactor(defaultStaker, beaconChainETHStrategy, newMaxMagnitude)
);
@@ -7645,16 +7500,15 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// 2. do AVS slash then beacon chain slash
////////////////////////////
- // restore the staker and operator to their original state
- // Reset operator's magnitude, beaconChainSlashingFactor
+ // initialize new staker and operator with same initial conditions
delegationManager.undelegate(defaultStaker);
_registerOperatorWithBaseDetails(defaultOperator2);
_setOperatorMagnitude(defaultOperator2, beaconChainETHStrategy, initialMagnitude);
- eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares);
- eigenPodManagerMock.setBeaconChainSlashingFactor(defaultStaker, WAD);
- _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator2);
+ eigenPodManagerMock.setPodOwnerShares(defaultStaker2, beaconShares);
+ eigenPodManagerMock.setBeaconChainSlashingFactor(defaultStaker2, WAD);
+ _delegateToOperatorWhoAcceptsAllStakers(defaultStaker2, defaultOperator2);
_assertDeposit({
- staker: defaultStaker,
+ staker: defaultStaker2,
operator: defaultOperator2,
strategy: beaconChainETHStrategy,
operatorSharesBefore: 0,
@@ -7667,21 +7521,24 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
{
// Slash on EigenLayer first
{
- (withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
+ (withdrawableShares,) =
+ delegationManager.getWithdrawableShares(defaultStaker2, beaconChainETHStrategy.toArray());
uint256 beaconSharesBeforeSlash = withdrawableShares[0];
_setOperatorMagnitude(defaultOperator2, beaconChainETHStrategy, newMaxMagnitude);
cheats.prank(address(allocationManagerMock));
- delegationManager.slashOperatorShares(defaultOperator2, beaconChainETHStrategy, initialMagnitude, newMaxMagnitude);
+ delegationManager.slashOperatorShares(
+ defaultOperator2, beaconChainETHStrategy, initialMagnitude, newMaxMagnitude
+ );
uint256 expectedWithdrawable = _calcWithdrawableShares(
- uint256(beaconShares),
+ uint256(beaconShares),
uint256(WAD).divWad(initialMagnitude),
- _getSlashingFactor(defaultStaker, beaconChainETHStrategy, newMaxMagnitude)
+ _getSlashingFactor(defaultStaker2, beaconChainETHStrategy, newMaxMagnitude)
);
_assertSharesAfterSlash({
- staker: defaultStaker,
+ staker: defaultStaker2,
strategy: beaconChainETHStrategy,
withdrawableSharesBefore: beaconSharesBeforeSlash,
expectedWithdrawableShares: expectedWithdrawable,
@@ -7692,15 +7549,13 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
// Slash beaconChain second
{
- (withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
+ (withdrawableShares,) =
+ delegationManager.getWithdrawableShares(defaultStaker2, beaconChainETHStrategy.toArray());
uint256 beaconSharesBeforeSlash = withdrawableShares[0];
uint64 prevBeaconChainSlashingFactor;
- (prevBeaconChainSlashingFactor, newBeaconSlashingFactor) = _decreaseBeaconChainShares(
- defaultStaker,
- beaconShares,
- sharesDecrease
- );
+ (prevBeaconChainSlashingFactor, newBeaconSlashingFactor) =
+ _decreaseBeaconChainShares(defaultStaker2, beaconShares, sharesDecrease);
uint256 expectedWithdrawableShares = _calcWithdrawableShares({
depositShares: uint256(beaconShares),
@@ -7708,7 +7563,7 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
slashingFactor: newMaxMagnitude.mulWad(newBeaconSlashingFactor)
});
_assertSharesAfterBeaconSlash({
- staker: defaultStaker,
+ staker: defaultStaker2,
withdrawableSharesBefore: beaconSharesBeforeSlash,
expectedWithdrawableShares: expectedWithdrawableShares,
prevBeaconSlashingFactor: prevBeaconChainSlashingFactor
@@ -7719,12 +7574,9 @@ contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests
////////////////////////////
// 3. Confirm withdrawable shares are the same regardless of order of operations in Test 1 or Test 2
////////////////////////////
- (withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, beaconChainETHStrategy.toArray());
- assertEq(
- withdrawableShares[0],
- sharesAfterAllSlashing,
- "shares after all slashing should be the same"
- );
+ (withdrawableShares,) =
+ delegationManager.getWithdrawableShares(defaultStaker2, beaconChainETHStrategy.toArray());
+ assertEq(withdrawableShares[0], sharesAfterAllSlashing, "shares after all slashing should be the same");
}
}
@@ -7743,7 +7595,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
function testFuzz_slashDepositRepeatedly(
Randomness r
) public rand(r) {
- uint64 initMagnitude = r.Uint64(10000, WAD);
+ uint64 initMagnitude = r.Uint64(10_000, WAD);
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES);
cheats.assume(initMagnitude % 2 != 0);
cheats.assume(shares % 2 != 0);
@@ -7751,7 +7603,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
// register *this contract* as an operator
_registerOperatorWithBaseDetails(defaultOperator);
_setOperatorMagnitude(defaultOperator, strategyMock, initMagnitude);
-
+
// Set the staker deposits in the strategies
IStrategy[] memory strategies = strategyMock.toArray();
{
@@ -7764,13 +7616,11 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
// delegate from the `defaultStaker` to the operator
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
-
// Slash and deposit more for each iteration
uint64 currMagnitude = initMagnitude;
{
uint256 newDepositShares = shares;
for (uint256 i = 0; i < 100; ++i) {
-
// 1. slash operator for 100 magnitude
uint64 slashMagnitude = 100;
currMagnitude -= slashMagnitude;
@@ -7796,7 +7646,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
}
}
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategies);
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, strategies);
assertLe(
withdrawableShares[0],
delegationManager.operatorShares(defaultOperator, strategyMock),
@@ -7806,13 +7656,23 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
if (cheats.envOr("WRITE_CSV_TESTS", false)) {
cheats.writeLine(
"./test.csv",
- string(abi.encodePacked(
- cheats.toString(initMagnitude), ", ",
- cheats.toString(shares), ", ",
- cheats.toString(delegationManager.operatorShares(defaultOperator, strategyMock)), ", ",
- cheats.toString(withdrawableShares[0]), ", ",
- cheats.toString(stdMath.delta(delegationManager.operatorShares(defaultOperator, strategyMock), withdrawableShares[0]))
- ))
+ string(
+ abi.encodePacked(
+ cheats.toString(initMagnitude),
+ ", ",
+ cheats.toString(shares),
+ ", ",
+ cheats.toString(delegationManager.operatorShares(defaultOperator, strategyMock)),
+ ", ",
+ cheats.toString(withdrawableShares[0]),
+ ", ",
+ cheats.toString(
+ stdMath.delta(
+ delegationManager.operatorShares(defaultOperator, strategyMock), withdrawableShares[0]
+ )
+ )
+ )
+ )
);
}
}
@@ -7822,11 +7682,11 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
* Single staker with fuzzed starting shares and magnitude.
* Slash 100 magnitude and fuzz deposit amount for 100 iterations.
*/
- /// forge-config: default.fuzz.runs = 50
+ /// forge-config: default.fuzz.runs = 50
function testFuzz_slashDepositRepeatedly_randDeposits(
Randomness r
) public rand(r) {
- uint64 initMagnitude = r.Uint64(10000, WAD);
+ uint64 initMagnitude = r.Uint64(10_000, WAD);
uint256 depositAmount = r.Uint256(1, 1e34);
uint256 shares = r.Uint256(1, MAX_STRATEGY_SHARES / 1e4);
cheats.assume(initMagnitude % 2 != 0);
@@ -7835,7 +7695,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
// register *this contract* as an operator
_registerOperatorWithBaseDetails(defaultOperator);
_setOperatorMagnitude(defaultOperator, strategyMock, initMagnitude);
-
+
// Set the staker deposits in the strategies
IStrategy[] memory strategies = strategyMock.toArray();
{
@@ -7848,13 +7708,11 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
// delegate from the `defaultStaker` to the operator
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
-
// Slash and deposit more for each iteration
uint64 currMagnitude = initMagnitude;
{
uint256 newDepositShares = shares;
for (uint256 i = 0; i < 100; ++i) {
-
// 1. slash operator for 100 magnitude
uint64 slashMagnitude = 100;
currMagnitude -= slashMagnitude;
@@ -7879,7 +7737,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
}
}
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(defaultStaker, strategies);
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, strategies);
assertLe(
withdrawableShares[0],
delegationManager.operatorShares(defaultOperator, strategyMock),
@@ -7889,29 +7747,39 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
if (cheats.envOr("WRITE_CSV_TESTS", false)) {
cheats.writeLine(
"./test2.csv",
- string(abi.encodePacked(
- cheats.toString(initMagnitude), ", ",
- cheats.toString(shares), ", ",
- cheats.toString(depositAmount), ", ",
- cheats.toString(delegationManager.operatorShares(defaultOperator, strategyMock)), ", ",
- cheats.toString(withdrawableShares[0]), ", ",
- cheats.toString(stdMath.delta(delegationManager.operatorShares(defaultOperator, strategyMock), withdrawableShares[0]))
- ))
+ string(
+ abi.encodePacked(
+ cheats.toString(initMagnitude),
+ ", ",
+ cheats.toString(shares),
+ ", ",
+ cheats.toString(depositAmount),
+ ", ",
+ cheats.toString(delegationManager.operatorShares(defaultOperator, strategyMock)),
+ ", ",
+ cheats.toString(withdrawableShares[0]),
+ ", ",
+ cheats.toString(
+ stdMath.delta(
+ delegationManager.operatorShares(defaultOperator, strategyMock), withdrawableShares[0]
+ )
+ )
+ )
+ )
);
}
}
-
/**
* @notice Fuzzed tests
* For 500 stakers, deposit `shares` amount and delegate to the operator. After each staker delegates,
* slash 100 magnitude.
*/
- /// forge-config: default.fuzz.runs = 50
+ /// forge-config: default.fuzz.runs = 50
function testFuzz_depositMultipleStakers_slash_repeatedly(
Randomness r
) public rand(r) {
- uint64 initMagnitude = r.Uint64(50000, WAD);
+ uint64 initMagnitude = r.Uint64(50_000, WAD);
uint256 shares = r.Uint256(MAX_STRATEGY_SHARES / 1e7, MAX_STRATEGY_SHARES / 1e4);
cheats.assume(initMagnitude % 2 != 0);
cheats.assume(shares % 2 != 0);
@@ -7919,7 +7787,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
// register *this contract* as an operator
_registerOperatorWithBaseDetails(defaultOperator);
_setOperatorMagnitude(defaultOperator, strategyMock, initMagnitude);
-
+
// Set the staker deposits in the strategies
IStrategy[] memory strategies = strategyMock.toArray();
uint256[] memory sharesToSet = new uint256[](1);
@@ -7954,7 +7822,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock);
uint256 totalWithdrawableShares = 0;
for (uint256 i = 0; i < numStakers; ++i) {
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(stakers[i], strategies);
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(stakers[i], strategies);
totalWithdrawableShares += withdrawableShares[0];
}
assertLe(
@@ -7963,17 +7831,22 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
"withdrawableShares should be less than or equal to operatorShares"
);
-
if (cheats.envOr("WRITE_CSV_TESTS", false)) {
cheats.writeLine(
"./test3.csv",
- string(abi.encodePacked(
- cheats.toString(initMagnitude), ", ", // initial magnitude
- cheats.toString(shares), ", ", // amount each staker deposits
- cheats.toString(operatorSharesAfter), ", ", // operator shares after all slashing and deposits
- cheats.toString(totalWithdrawableShares), ", ", // total withdrawable shares from all stakers
- cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable
- ))
+ string(
+ abi.encodePacked(
+ cheats.toString(initMagnitude),
+ ", ", // initial magnitude
+ cheats.toString(shares),
+ ", ", // amount each staker deposits
+ cheats.toString(operatorSharesAfter),
+ ", ", // operator shares after all slashing and deposits
+ cheats.toString(totalWithdrawableShares),
+ ", ", // total withdrawable shares from all stakers
+ cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable
+ )
+ )
);
}
}
@@ -7987,7 +7860,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
function testFuzz_depositMultipleStakers_slashLargeMagnitudes(
Randomness r
) public rand(r) {
- uint64 initMagnitude = r.Uint64(50000, WAD);
+ uint64 initMagnitude = r.Uint64(50_000, WAD);
uint256 shares = r.Uint256(MAX_STRATEGY_SHARES / 1e7, MAX_STRATEGY_SHARES / 1e4);
cheats.assume(initMagnitude % 2 != 0);
cheats.assume(shares % 2 != 0);
@@ -7995,7 +7868,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
// register *this contract* as an operator
_registerOperatorWithBaseDetails(defaultOperator);
_setOperatorMagnitude(defaultOperator, strategyMock, initMagnitude);
-
+
// Set the staker deposits in the strategies
IStrategy[] memory strategies = strategyMock.toArray();
uint256[] memory sharesToSet = new uint256[](1);
@@ -8008,7 +7881,6 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
uint64 currMagnitude = initMagnitude;
{
for (uint256 i = 0; i < numStakers; ++i) {
-
// 1. deposit and delegate new staker
stakers[i] = random().Address();
strategyManagerMock.setDeposits(stakers[i], strategies, sharesToSet);
@@ -8031,7 +7903,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock);
uint256 totalWithdrawableShares = 0;
for (uint256 i = 0; i < numStakers; ++i) {
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(stakers[i], strategies);
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(stakers[i], strategies);
totalWithdrawableShares += withdrawableShares[0];
}
assertLe(
@@ -8043,13 +7915,19 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
if (cheats.envOr("WRITE_CSV_TESTS", false)) {
cheats.writeLine(
"./test4.csv",
- string(abi.encodePacked(
- cheats.toString(initMagnitude), ", ", // initial magnitude
- cheats.toString(shares), ", ", // amount each staker deposits
- cheats.toString(operatorSharesAfter), ", ", // operator shares after all slashing and deposits
- cheats.toString(totalWithdrawableShares), ", ", // total withdrawable shares from all stakers
- cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable
- ))
+ string(
+ abi.encodePacked(
+ cheats.toString(initMagnitude),
+ ", ", // initial magnitude
+ cheats.toString(shares),
+ ", ", // amount each staker deposits
+ cheats.toString(operatorSharesAfter),
+ ", ", // operator shares after all slashing and deposits
+ cheats.toString(totalWithdrawableShares),
+ ", ", // total withdrawable shares from all stakers
+ cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable
+ )
+ )
);
}
}
@@ -8070,7 +7948,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
// register *this contract* as an operator
_registerOperatorWithBaseDetails(defaultOperator);
_setOperatorMagnitude(defaultOperator, strategyMock, initMagnitude);
-
+
// Set the staker deposits in the strategies
IStrategy[] memory strategies = strategyMock.toArray();
uint256[] memory sharesToSet = new uint256[](1);
@@ -8083,7 +7961,6 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
uint64 currMagnitude = initMagnitude;
{
for (uint256 i = 0; i < numStakers; ++i) {
-
// 1. deposit and delegate new staker
stakers[i] = random().Address();
strategyManagerMock.setDeposits(stakers[i], strategies, sharesToSet);
@@ -8106,7 +7983,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock);
uint256 totalWithdrawableShares = 0;
for (uint256 i = 0; i < numStakers; ++i) {
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(stakers[i], strategies);
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(stakers[i], strategies);
totalWithdrawableShares += withdrawableShares[0];
}
assertLe(
@@ -8114,17 +7991,23 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
operatorSharesAfter,
"withdrawableShares should be less than or equal to operatorShares"
);
-
+
if (cheats.envOr("WRITE_CSV_TESTS", false)) {
cheats.writeLine(
"./test5.csv",
- string(abi.encodePacked(
- cheats.toString(initMagnitude), ", ", // initial magnitude
- cheats.toString(shares), ", ", // amount each staker deposits
- cheats.toString(operatorSharesAfter), ", ", // operator shares after all slashing and deposits
- cheats.toString(totalWithdrawableShares), ", ", // total withdrawable shares from all stakers
- cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable
- ))
+ string(
+ abi.encodePacked(
+ cheats.toString(initMagnitude),
+ ", ", // initial magnitude
+ cheats.toString(shares),
+ ", ", // amount each staker deposits
+ cheats.toString(operatorSharesAfter),
+ ", ", // operator shares after all slashing and deposits
+ cheats.toString(totalWithdrawableShares),
+ ", ", // total withdrawable shares from all stakers
+ cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable
+ )
+ )
);
}
}
@@ -8145,7 +8028,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
// register *this contract* as an operator
_registerOperatorWithBaseDetails(defaultOperator);
_setOperatorMagnitude(defaultOperator, strategyMock, initMagnitude);
-
+
// Set the staker deposits in the strategies
IStrategy[] memory strategies = strategyMock.toArray();
uint256[] memory sharesToSet = new uint256[](1);
@@ -8156,7 +8039,6 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
address[] memory stakers = new address[](numStakers);
// deposit all stakers one time
for (uint256 i = 0; i < numStakers; ++i) {
-
// 1. deposit and delegate new staker
stakers[i] = random().Address();
strategyManagerMock.setDeposits(stakers[i], strategies, sharesToSet);
@@ -8167,7 +8049,6 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
uint64 currMagnitude = initMagnitude;
{
for (uint256 i = 0; i < numStakers; ++i) {
-
// 2. slash operator for 100 magnitude
uint64 slashMagnitude = 1;
currMagnitude -= slashMagnitude;
@@ -8185,7 +8066,7 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock);
uint256 totalWithdrawableShares = 0;
for (uint256 i = 0; i < numStakers; ++i) {
- (uint256[] memory withdrawableShares, ) = delegationManager.getWithdrawableShares(stakers[i], strategies);
+ (uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(stakers[i], strategies);
totalWithdrawableShares += withdrawableShares[0];
}
assertLe(
@@ -8197,13 +8078,19 @@ contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUn
if (cheats.envOr("WRITE_CSV_TESTS", false)) {
cheats.writeLine(
"./test6.csv",
- string(abi.encodePacked(
- cheats.toString(initMagnitude), ", ", // initial magnitude
- cheats.toString(shares), ", ", // amount each staker deposits
- cheats.toString(operatorSharesAfter), ", ", // operator shares after all slashing and deposits
- cheats.toString(totalWithdrawableShares), ", ", // total withdrawable shares from all stakers
- cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable
- ))
+ string(
+ abi.encodePacked(
+ cheats.toString(initMagnitude),
+ ", ", // initial magnitude
+ cheats.toString(shares),
+ ", ", // amount each staker deposits
+ cheats.toString(operatorSharesAfter),
+ ", ", // operator shares after all slashing and deposits
+ cheats.toString(totalWithdrawableShares),
+ ", ", // total withdrawable shares from all stakers
+ cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable
+ )
+ )
);
}
}
@@ -8213,25 +8100,26 @@ contract DelegationManagerUnitTests_Rounding is DelegationManagerUnitTests {}
/**
* @notice TODO Lifecycle tests - These tests combine multiple functionalities of the DelegationManager
- 1. Old SigP test - registerAsOperator, separate staker delegate to operator, as operator undelegate (reverts),
- checks that staker is still delegated and operator still registered, staker undelegates, checks staker not delegated and operator
- is still registered
- 2. RegisterOperator, Deposit, Delegate, Queue, Complete
- 3. RegisterOperator, Mock Slash(set maxMagnitudes), Deposit/Delegate, Queue, Complete
- 4. RegisterOperator, Deposit/Delegate, Mock Slash(set maxMagnitudes), Queue, Complete
- 5. RegisterOperator, Mock Slash(set maxMagnitudes), Deposit/Delegate, Queue, Mock Slash(set maxMagnitudes), Complete
- 7. RegisterOperator, Deposit/Delegate, Mock Slash 100% (set maxMagnitudes), Undelegate, Complete non 100% slashed strategies
- 8. RegisterOperator, Deposit/Delegate, Undelegate, Re delegate to another operator, Mock Slash 100% (set maxMagnitudes), Complete as shares
- (withdrawals should have been slashed even though delegated to a new operator)
- 9. Invariant check getWithdrawableShares = sum(deposits), Multiple deposits with operator who has never been slashed
- 10. Invariant check getWithdrawableShares = sum(deposits), Multiple deposits with operator who HAS been been slashed
+ * 1. Old SigP test - registerAsOperator, separate staker delegate to operator, as operator undelegate (reverts),
+ * checks that staker is still delegated and operator still registered, staker undelegates, checks staker not delegated and operator
+ * is still registered
+ * 2. RegisterOperator, Deposit, Delegate, Queue, Complete
+ * 3. RegisterOperator, Mock Slash(set maxMagnitudes), Deposit/Delegate, Queue, Complete
+ * 4. RegisterOperator, Deposit/Delegate, Mock Slash(set maxMagnitudes), Queue, Complete
+ * 5. RegisterOperator, Mock Slash(set maxMagnitudes), Deposit/Delegate, Queue, Mock Slash(set maxMagnitudes), Complete
+ * 7. RegisterOperator, Deposit/Delegate, Mock Slash 100% (set maxMagnitudes), Undelegate, Complete non 100% slashed strategies
+ * 8. RegisterOperator, Deposit/Delegate, Undelegate, Re delegate to another operator, Mock Slash 100% (set maxMagnitudes), Complete as shares
+ * (withdrawals should have been slashed even though delegated to a new operator)
+ * 9. Invariant check getWithdrawableShares = sum(deposits), Multiple deposits with operator who has never been slashed
+ * 10. Invariant check getWithdrawableShares = sum(deposits), Multiple deposits with operator who HAS been been slashed
*/
-
contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests {
using ArrayLib for *;
// 2. RegisterOperator, Deposit, Delegate, Queue, Complete
- function test_register_operator_deposit_delegate_queue_complete(Randomness r) public rand(r) {
+ function test_register_operator_deposit_delegate_queue_complete(
+ Randomness r
+ ) public rand(r) {
address operator = r.Address();
address staker = r.Address();
IStrategy[] memory strategies = strategyMock.toArray();
@@ -8242,10 +8130,10 @@ contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests {
// 2) Mock deposit into SM.
strategyManagerMock.setDeposits(staker, strategies, depositShares);
-
+
// 3) Staker delegates to operator.
_delegateToOperatorWhoAcceptsAllStakers(staker, operator);
-
+
// 3) Staker queues withdrawals.
QueuedWithdrawalParams[] memory queuedWithdrawalParams = new QueuedWithdrawalParams[](1);
queuedWithdrawalParams[0] = QueuedWithdrawalParams({
@@ -8272,13 +8160,17 @@ contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests {
cheats.roll(block.number + delegationManager.minWithdrawalDelayBlocks() + 1);
cheats.prank(staker);
- delegationManager.completeQueuedWithdrawal(withdrawal, tokenMock.toArray(), false);
+ delegationManager.completeQueuedWithdrawal(withdrawal, tokenMock.toArray(), false);
assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should not be pending");
// Checks
- assertEq(delegationManager.cumulativeWithdrawalsQueued(staker), 1, "staker nonce should have incremented");
- assertEq(delegationManager.operatorShares(operator, strategies[0]), 100 ether, "operator shares should be 0 after withdrawal");
+ assertEq(delegationManager.cumulativeWithdrawalsQueued(staker), 1, "staker nonce should have incremented");
+ assertEq(
+ delegationManager.operatorShares(operator, strategies[0]),
+ 100 ether,
+ "operator shares should be 0 after withdrawal"
+ );
}
/**
@@ -8315,11 +8207,7 @@ contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests {
assertEq(operatorSharesAfterSlash, 0, "operator shares not fully slashed");
}
- (
- ,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (, Withdrawal memory withdrawal, bytes32 withdrawalRoot) = _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategy,
depositSharesToWithdraw: shares
@@ -8329,20 +8217,10 @@ contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests {
assertEq(depositScalingFactor, WAD, "bad test setup");
// Get withdrawable and deposit shares
{
- (
- uint256[] memory withdrawableSharesBefore,
- uint256[] memory depositSharesBefore
- ) = delegationManager.getWithdrawableShares(defaultStaker, strategyArray);
- assertEq(
- withdrawableSharesBefore[0],
- 0,
- "withdrawable shares should be 0 after being slashed fully"
- );
- assertEq(
- depositSharesBefore[0],
- shares,
- "deposit shares should be unchanged after being slashed fully"
- );
+ (uint256[] memory withdrawableSharesBefore, uint256[] memory depositSharesBefore) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategyArray);
+ assertEq(withdrawableSharesBefore[0], 0, "withdrawable shares should be 0 after being slashed fully");
+ assertEq(depositSharesBefore[0], shares, "deposit shares should be unchanged after being slashed fully");
}
// Undelegate the staker
@@ -8371,11 +8249,11 @@ contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests {
assertFalse(delegationManager.isDelegated(defaultStaker), "staker not undelegated");
// Checks - operator & staker shares
- assertEq(delegationManager.operatorShares(defaultOperator, strategy), 0, "operator shares not decreased correctly");
- (
- uint256[] memory stakerWithdrawableShares,
- uint256[] memory depositShares
- ) = delegationManager.getWithdrawableShares(defaultStaker, strategyArray);
+ assertEq(
+ delegationManager.operatorShares(defaultOperator, strategy), 0, "operator shares not decreased correctly"
+ );
+ (uint256[] memory stakerWithdrawableShares, uint256[] memory depositShares) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategyArray);
assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly");
assertEq(depositShares[0], 0, "staker deposit shares not reset correctly");
@@ -8384,7 +8262,8 @@ contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests {
_registerOperatorWithBaseDetails(newOperator);
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, newOperator);
- (stakerWithdrawableShares, depositShares) = delegationManager.getWithdrawableShares(defaultStaker, strategyArray);
+ (stakerWithdrawableShares, depositShares) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategyArray);
assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly");
assertEq(depositShares[0], 0, "staker deposit shares not reset correctly");
@@ -8392,7 +8271,8 @@ contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests {
cheats.prank(defaultStaker);
delegationManager.completeQueuedWithdrawal(withdrawal, tokenMock.toArray(), false);
- (stakerWithdrawableShares, depositShares) = delegationManager.getWithdrawableShares(defaultStaker, strategyArray);
+ (stakerWithdrawableShares, depositShares) =
+ delegationManager.getWithdrawableShares(defaultStaker, strategyArray);
assertEq(stakerWithdrawableShares[0], 0, "staker withdrawable shares not calculated correctly");
assertEq(depositShares[0], 0, "staker deposit shares not reset correctly");
assertEq(delegationManager.operatorShares(newOperator, strategy), 0, "new operator shares should be unchanged");
@@ -8403,7 +8283,7 @@ contract DelegationManagerUnitTests_ConvertToDepositShares is DelegationManagerU
using ArrayLib for *;
function test_convertToDepositShares_noSlashing() public {
- uint shares = 100 ether;
+ uint256 shares = 100 ether;
// Set the staker deposits in the strategies
strategyManagerMock.addDeposit(defaultStaker, strategyMock, shares);
@@ -8420,9 +8300,9 @@ contract DelegationManagerUnitTests_ConvertToDepositShares is DelegationManagerU
// register *this contract* as an operator
_registerOperatorWithBaseDetails(defaultOperator);
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
- _setOperatorMagnitude(defaultOperator, strategyMock, WAD/3);
+ _setOperatorMagnitude(defaultOperator, strategyMock, WAD / 3);
- _checkDepositSharesConvertCorrectly(strategies, shares);
+ _checkDepositSharesConvertCorrectly(strategies, shares);
// queue and complete a withdrawal for half the deposit shares
(uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, strategies);
@@ -8446,12 +8326,12 @@ contract DelegationManagerUnitTests_ConvertToDepositShares is DelegationManagerU
// delegate to an operator and slash
_registerOperatorWithBaseDetails(defaultOperator);
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
- _setOperatorMagnitude(defaultOperator, beaconChainETHStrategy, WAD/3);
+ _setOperatorMagnitude(defaultOperator, beaconChainETHStrategy, WAD / 3);
_checkDepositSharesConvertCorrectly(strategies, shares);
// slash on beacon chain by 1/3
- _decreaseBeaconChainShares(defaultStaker, int256(shares[0]), shares[0]/3);
+ _decreaseBeaconChainShares(defaultStaker, int256(shares[0]), shares[0] / 3);
_checkDepositSharesConvertCorrectly(strategies, shares);
@@ -8464,20 +8344,21 @@ contract DelegationManagerUnitTests_ConvertToDepositShares is DelegationManagerU
_checkDepositSharesConvertCorrectly(strategies, shares);
}
- function _checkDepositSharesConvertCorrectly(IStrategy[] memory strategies, uint256[] memory expectedDepositShares) public view {
+ function _checkDepositSharesConvertCorrectly(
+ IStrategy[] memory strategies,
+ uint256[] memory expectedDepositShares
+ ) public view {
(uint256[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, strategies);
// get the deposit shares
- uint256[] memory depositShares = delegationManager.convertToDepositShares(defaultStaker, strategies, withdrawableShares);
+ uint256[] memory depositShares =
+ delegationManager.convertToDepositShares(defaultStaker, strategies, withdrawableShares);
for (uint256 i = 0; i < strategies.length; i++) {
assertApproxEqRel(
- expectedDepositShares[i],
- depositShares[i],
- APPROX_REL_DIFF,
- "deposit shares not converted correctly"
+ expectedDepositShares[i], depositShares[i], APPROX_REL_DIFF, "deposit shares not converted correctly"
);
- // make sure that the deposit shares are less than or equal to the shares,
+ // make sure that the deposit shares are less than or equal to the shares,
// so this value is sane to input into `completeQueuedWithdrawals`
assertLe(
depositShares[i],
@@ -8489,12 +8370,13 @@ contract DelegationManagerUnitTests_ConvertToDepositShares is DelegationManagerU
// get the deposit shares
uint256[] memory oneThirdWithdrawableShares = new uint256[](strategies.length);
for (uint256 i = 0; i < strategies.length; i++) {
- oneThirdWithdrawableShares[i] = withdrawableShares[i]/3;
+ oneThirdWithdrawableShares[i] = withdrawableShares[i] / 3;
}
- uint256[] memory oneThirdDepositShares = delegationManager.convertToDepositShares(defaultStaker, strategies, oneThirdWithdrawableShares);
+ uint256[] memory oneThirdDepositShares =
+ delegationManager.convertToDepositShares(defaultStaker, strategies, oneThirdWithdrawableShares);
for (uint256 i = 0; i < strategies.length; i++) {
assertApproxEqRel(
- expectedDepositShares[i]/3,
+ expectedDepositShares[i] / 3,
oneThirdDepositShares[i],
APPROX_REL_DIFF,
"deposit shares not converted correctly"
@@ -8503,11 +8385,8 @@ contract DelegationManagerUnitTests_ConvertToDepositShares is DelegationManagerU
}
function _queueAndCompleteWithdrawalForSingleStrategy(IStrategy strategy, uint256 shares) public {
- (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) = _setUpQueueWithdrawalsSingleStrat({
- staker: defaultStaker,
- strategy: strategy,
- depositSharesToWithdraw: shares
- });
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) =
+ _setUpQueueWithdrawalsSingleStrat({staker: defaultStaker, strategy: strategy, depositSharesToWithdraw: shares});
cheats.prank(defaultStaker);
delegationManager.queueWithdrawals(queuedWithdrawalParams);
@@ -8522,17 +8401,17 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni
using ArrayLib for *;
using SlashingLib for *;
- function _withdrawalRoot(Withdrawal memory withdrawal) internal pure returns (bytes32) {
+ function _withdrawalRoot(
+ Withdrawal memory withdrawal
+ ) internal pure returns (bytes32) {
return keccak256(abi.encode(withdrawal));
}
- function test_getQueuedWithdrawals_Correctness(Randomness r) public rand(r) {
+ function test_getQueuedWithdrawals_Correctness(
+ Randomness r
+ ) public rand(r) {
uint256 numStrategies = r.Uint256(2, 8);
- uint256[] memory depositShares = r.Uint256Array({
- len: numStrategies,
- min: 2,
- max: 100 ether
- });
+ uint256[] memory depositShares = r.Uint256Array({len: numStrategies, min: 2, max: 100 ether});
IStrategy[] memory strategies = _deployAndDepositIntoStrategies(defaultStaker, depositShares, false);
_registerOperatorWithBaseDetails(defaultOperator);
@@ -8548,28 +8427,26 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni
}
// Queue withdrawals.
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawals({
- staker: defaultStaker,
- strategies: strategies,
- depositWithdrawalAmounts: depositShares
- });
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) =
+ _setUpQueueWithdrawals({staker: defaultStaker, strategies: strategies, depositWithdrawalAmounts: depositShares});
cheats.prank(defaultStaker);
delegationManager.queueWithdrawals(queuedWithdrawalParams);
-
+
// Get queued withdrawals.
- (Withdrawal[] memory withdrawals, uint256[][] memory shares) = delegationManager.getQueuedWithdrawals(defaultStaker);
+ (Withdrawal[] memory withdrawals, uint256[][] memory shares) =
+ delegationManager.getQueuedWithdrawals(defaultStaker);
// Checks
for (uint256 i; i < strategies.length; ++i) {
uint256 newStakerShares = depositShares[i] / 2;
assertApproxEqAbs(shares[0][i], newStakerShares, 1, "staker shares should be decreased by half +- 1");
}
-
- assertEq(_withdrawalRoot(withdrawal), _withdrawalRoot(withdrawals[0]), "_withdrawalRoot(withdrawal) != _withdrawalRoot(withdrawals[0])");
+
+ assertEq(
+ _withdrawalRoot(withdrawal),
+ _withdrawalRoot(withdrawals[0]),
+ "_withdrawalRoot(withdrawal) != _withdrawalRoot(withdrawals[0])"
+ );
assertEq(_withdrawalRoot(withdrawal), withdrawalRoot, "_withdrawalRoot(withdrawal) != withdrawalRoot");
}
@@ -8581,7 +8458,7 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni
_registerOperatorWithBaseDetails(defaultOperator);
strategyManagerMock.addDeposit(defaultStaker, strategyMock, totalDepositShares);
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
-
+
uint256 newStakerShares = totalDepositShares / 2;
_setOperatorMagnitude(defaultOperator, strategyMock, 0.5 ether);
cheats.prank(address(allocationManagerMock));
@@ -8610,14 +8487,15 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni
) = _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategyMock,
- depositSharesToWithdraw: totalDepositShares / 2
+ depositSharesToWithdraw: totalDepositShares / 2
});
cheats.prank(defaultStaker);
delegationManager.queueWithdrawals(queuedWithdrawalParams1);
// Get queued withdrawals.
- (Withdrawal[] memory withdrawals, uint256[][] memory shares) = delegationManager.getQueuedWithdrawals(defaultStaker);
+ (Withdrawal[] memory withdrawals, uint256[][] memory shares) =
+ delegationManager.getQueuedWithdrawals(defaultStaker);
// Sanity
assertEq(withdrawals.length, 2, "withdrawal.length != 2");
@@ -8639,7 +8517,9 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni
* expected withdrawn shares from the view function.
* Slashing on the completableBlock of the withdrawal should have no affect on the withdrawn shares.
*/
- function test_getQueuedWithdrawals_SlashAfterWithdrawalCompletion(Randomness r) public rand(r) {
+ function test_getQueuedWithdrawals_SlashAfterWithdrawalCompletion(
+ Randomness r
+ ) public rand(r) {
uint256 depositAmount = r.Uint256(1, MAX_STRATEGY_SHARES);
// Deposit Staker
@@ -8650,11 +8530,8 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni
_delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
// Queue withdrawal
- (
- QueuedWithdrawalParams[] memory queuedWithdrawalParams,
- Withdrawal memory withdrawal,
- bytes32 withdrawalRoot
- ) = _setUpQueueWithdrawalsSingleStrat({
+ (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) =
+ _setUpQueueWithdrawalsSingleStrat({
staker: defaultStaker,
strategy: strategyMock,
depositSharesToWithdraw: depositAmount
@@ -8681,7 +8558,7 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni
// Slash operator 50% while staker has queued withdrawal
{
uint256 operatorSharesAfterQueue = delegationManager.operatorShares(defaultOperator, strategyMock);
- (uint256 sharesToDecrement, ) = _calcSlashedAmount({
+ (uint256 sharesToDecrement,) = _calcSlashedAmount({
operatorShares: operatorSharesAfterQueue,
prevMaxMagnitude: uint64(WAD),
newMaxMagnitude: 50e16
@@ -8699,7 +8576,8 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni
// Assert that the getQueuedWithdrawals returns shares that are halved as a result of being slashed 50%
{
- (Withdrawal[] memory withdrawals, uint256[][] memory shares) = delegationManager.getQueuedWithdrawals(defaultStaker);
+ (Withdrawal[] memory withdrawals, uint256[][] memory shares) =
+ delegationManager.getQueuedWithdrawals(defaultStaker);
assertEq(withdrawals.length, 1, "withdrawals.length != 1");
assertEq(withdrawals[0].strategies.length, 1, "withdrawals[0].strategies.length != 1");
assertEq(shares[0][0], depositAmount / 2, "shares[0][0] != depositAmount / 2");
@@ -8712,11 +8590,8 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni
// slash operator 50% again
{
uint256 operatorShares = delegationManager.operatorShares(defaultOperator, strategyMock);
- (uint256 sharesToDecrement, ) = _calcSlashedAmount({
- operatorShares: operatorShares,
- prevMaxMagnitude: 50e16,
- newMaxMagnitude: 25e16
- });
+ (uint256 sharesToDecrement,) =
+ _calcSlashedAmount({operatorShares: operatorShares, prevMaxMagnitude: 50e16, newMaxMagnitude: 25e16});
_setOperatorMagnitude(defaultOperator, strategyMock, 25e16);
cheats.prank(address(allocationManagerMock));
delegationManager.slashOperatorShares(defaultOperator, withdrawal.strategies[0], 50e16, 25e16);
@@ -8733,7 +8608,8 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni
uint256 expectedSharesIncrease = depositAmount / 2;
uint256 queuedWithdrawableShares;
{
- (Withdrawal[] memory withdrawals, uint256[][] memory shares) = delegationManager.getQueuedWithdrawals(defaultStaker);
+ (Withdrawal[] memory withdrawals, uint256[][] memory shares) =
+ delegationManager.getQueuedWithdrawals(defaultStaker);
queuedWithdrawableShares = shares[0][0];
assertEq(withdrawals.length, 1, "withdrawals.length != 1");
assertEq(withdrawals[0].strategies.length, 1, "withdrawals[0].strategies.length != 1");
@@ -8741,10 +8617,12 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni
}
// Complete queued Withdrawal with shares added back. Since total deposit slashed by 50% and not 75%
- (uint256[] memory withdrawableSharesBefore, ) = delegationManager.getWithdrawableShares(defaultStaker, withdrawal.strategies);
+ (uint256[] memory withdrawableSharesBefore,) =
+ delegationManager.getWithdrawableShares(defaultStaker, withdrawal.strategies);
cheats.prank(defaultStaker);
delegationManager.completeQueuedWithdrawal(withdrawal, tokenMock.toArray(), false);
- (uint256[] memory withdrawableSharesAfter, ) = delegationManager.getWithdrawableShares(defaultStaker, withdrawal.strategies);
+ (uint256[] memory withdrawableSharesAfter,) =
+ delegationManager.getWithdrawableShares(defaultStaker, withdrawal.strategies);
// Added shares
assertEq(
@@ -8757,10 +8635,164 @@ contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUni
queuedWithdrawableShares,
"expectedSharesIncrease should be equal to queuedWithdrawableShares"
);
- assertEq(
- block.number,
- completableBlock,
- "block.number should be the completableBlock"
- );
+ assertEq(block.number, completableBlock, "block.number should be the completableBlock");
+ }
+
+ function test_getQueuedWithdrawals_UsesCorrectOperatorMagnitude() public {
+ // Alice deposits 100 shares into strategy
+ uint256 depositAmount = 100e18;
+ _depositIntoStrategies(defaultStaker, strategyMock.toArray(), depositAmount.toArrayU256());
+
+ // Register operator with magnitude of 0.5 and delegate Alice to them
+ _registerOperatorWithBaseDetails(defaultOperator);
+ _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
+ _setOperatorMagnitude(defaultOperator, strategyMock, 0.5 ether);
+
+ // Alice queues withdrawal of all 100 shares while operator magnitude is 0.5
+ // This means she should get back 50 shares (100 * 0.5)
+ (
+ QueuedWithdrawalParams[] memory queuedWithdrawalParams,
+ Withdrawal memory withdrawal,
+ bytes32 withdrawalRoot
+ ) = _setUpQueueWithdrawalsSingleStrat({
+ staker: defaultStaker,
+ strategy: strategyMock,
+ depositSharesToWithdraw: depositAmount
+ });
+
+ cheats.prank(defaultStaker);
+ delegationManager.queueWithdrawals(queuedWithdrawalParams);
+
+ // Alice undelegates, which would normally update operator's magnitude to 1.0
+ // This tests that the withdrawal still uses the original 0.5 magnitude from when it was queued
+ cheats.prank(defaultStaker);
+ delegationManager.undelegate(defaultStaker);
+
+ // Get shares from withdrawal - should return 50 shares (100 * 0.5) using original magnitude
+ // rather than incorrectly returning 100 shares (100 * 1.0) using new magnitude
+ (, uint256[] memory shares) = delegationManager.getQueuedWithdrawal(withdrawalRoot);
+ assertEq(shares[0], 50e18, "shares should be 50e18 (100e18 * 0.5) using original magnitude");
+ }
+}
+
+contract DelegationManagerUnitTests_getQueuedWithdrawal is DelegationManagerUnitTests {
+ using ArrayLib for *;
+ using SlashingLib for *;
+
+ function test_getQueuedWithdrawal_Correctness(Randomness r) public rand(r) {
+ // Set up initial deposit
+ uint256 depositAmount = r.Uint256(1 ether, 100 ether);
+ _depositIntoStrategies(defaultStaker, strategyMock.toArray(), depositAmount.toArrayU256());
+
+ // Register operator and delegate
+ _registerOperatorWithBaseDetails(defaultOperator);
+ _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
+
+ // Queue withdrawal
+ (
+ QueuedWithdrawalParams[] memory queuedWithdrawalParams,
+ Withdrawal memory withdrawal,
+ bytes32 withdrawalRoot
+ ) = _setUpQueueWithdrawalsSingleStrat({
+ staker: defaultStaker,
+ strategy: strategyMock,
+ depositSharesToWithdraw: depositAmount
+ });
+
+ cheats.prank(defaultStaker);
+ delegationManager.queueWithdrawals(queuedWithdrawalParams);
+
+ // Get shares from queued withdrawal
+ (, uint256[] memory shares) = delegationManager.getQueuedWithdrawal(withdrawalRoot);
+
+ // Verify withdrawal details match
+ assertEq(shares.length, 1, "incorrect shares array length");
+ assertEq(shares[0], depositAmount, "incorrect shares amount");
+ }
+
+ function test_getQueuedWithdrawal_AfterSlashing(Randomness r) public rand(r) {
+ // Set up initial deposit
+ uint256 depositAmount = r.Uint256(1 ether, 100 ether);
+ _depositIntoStrategies(defaultStaker, strategyMock.toArray(), depositAmount.toArrayU256());
+
+ // Register operator and delegate
+ _registerOperatorWithBaseDetails(defaultOperator);
+ _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
+
+ // Queue withdrawal
+ (
+ QueuedWithdrawalParams[] memory queuedWithdrawalParams,
+ Withdrawal memory withdrawal,
+ bytes32 withdrawalRoot
+ ) = _setUpQueueWithdrawalsSingleStrat({
+ staker: defaultStaker,
+ strategy: strategyMock,
+ depositSharesToWithdraw: depositAmount
+ });
+
+ cheats.prank(defaultStaker);
+ delegationManager.queueWithdrawals(queuedWithdrawalParams);
+
+ // Slash operator by 50%
+ _setOperatorMagnitude(defaultOperator, strategyMock, 0.5 ether);
+ cheats.prank(address(allocationManagerMock));
+ delegationManager.slashOperatorShares(defaultOperator, strategyMock, WAD, 0.5 ether);
+
+ // Get shares from queued withdrawal
+ (, uint256[] memory shares) = delegationManager.getQueuedWithdrawal(withdrawalRoot);
+
+ // Verify withdrawal details match and shares are slashed
+ assertEq(shares.length, 1, "incorrect shares array length");
+ assertEq(shares[0], depositAmount / 2, "shares not properly slashed");
+ }
+
+ function test_getQueuedWithdrawal_NonexistentWithdrawal() public {
+ bytes32 nonexistentRoot = bytes32(uint256(1));
+ (, uint256[] memory shares) = delegationManager.getQueuedWithdrawal(nonexistentRoot);
+ assertEq(shares.length, 0, "shares array should be empty");
+ }
+
+ function test_getQueuedWithdrawal_MultipleStrategies(Randomness r) public rand(r) {
+ // Set up multiple strategies with deposits
+ uint256 numStrategies = r.Uint256(2, 5);
+ uint256[] memory depositShares = r.Uint256Array({
+ len: numStrategies,
+ min: 1 ether,
+ max: 100 ether
+ });
+
+ IStrategy[] memory strategies = _deployAndDepositIntoStrategies(defaultStaker, depositShares, false);
+
+ // Register operator and delegate
+ _registerOperatorWithBaseDetails(defaultOperator);
+ _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
+
+ // Queue withdrawals for multiple strategies
+ (
+ QueuedWithdrawalParams[] memory queuedWithdrawalParams,
+ Withdrawal memory withdrawal,
+ bytes32 withdrawalRoot
+ ) = _setUpQueueWithdrawals({
+ staker: defaultStaker,
+ strategies: strategies,
+ depositWithdrawalAmounts: depositShares
+ });
+
+ cheats.prank(defaultStaker);
+ delegationManager.queueWithdrawals(queuedWithdrawalParams);
+
+ // Get shares from queued withdrawal
+ (, uint256[] memory shares) = delegationManager.getQueuedWithdrawal(withdrawalRoot);
+
+ // Verify withdrawal details and shares for each strategy
+ assertEq(shares.length, numStrategies, "incorrect shares array length");
+ for (uint256 i = 0; i < numStrategies; i++) {
+ assertEq(shares[i], depositShares[i], "incorrect shares amount for strategy");
+ }
+ }
+
+ function testFuzz_getQueuedWithdrawal_EmptyWithdrawal(bytes32 withdrawalRoot) public {
+ (, uint256[] memory shares) = delegationManager.getQueuedWithdrawal(withdrawalRoot);
+ assertEq(shares.length, 0, "sanity check");
}
}
diff --git a/src/test/unit/EigenPodManagerUnit.t.sol b/src/test/unit/EigenPodManagerUnit.t.sol
index e73087e523..f10dc60955 100644
--- a/src/test/unit/EigenPodManagerUnit.t.sol
+++ b/src/test/unit/EigenPodManagerUnit.t.sol
@@ -44,7 +44,8 @@ contract EigenPodManagerUnitTests is EigenLayerUnitTestSetup, IEigenPodManagerEv
ethPOSMock,
eigenPodBeacon,
IDelegationManager(address(delegationManagerMock)),
- pauserRegistry
+ pauserRegistry,
+ "v9.9.9"
);
eigenPodManager = EigenPodManager(
address(
@@ -78,7 +79,7 @@ contract EigenPodManagerUnitTests is EigenLayerUnitTestSetup, IEigenPodManagerEv
if (shares >= 0) {
cheats.prank(address(delegationManagerMock));
- eigenPodManager.addShares(podOwner, beaconChainETHStrategy, IERC20(address(0)), uint256(shares));
+ eigenPodManager.addShares(podOwner, beaconChainETHStrategy, uint256(shares));
} else {
EigenPodManagerWrapper(address(eigenPodManager)).setPodOwnerShares(podOwner, shares);
}
@@ -185,6 +186,23 @@ contract EigenPodManagerUnitTests_StakeTests is EigenPodManagerUnitTests {
contract EigenPodManagerUnitTests_ShareUpdateTests is EigenPodManagerUnitTests {
+ // Wrapper contract that exposes the internal `_calculateChangeInDelegatableShares` function
+ EigenPodManagerWrapper public eigenPodManagerWrapper;
+
+ function setUp() virtual override public {
+ super.setUp();
+
+ // Upgrade eigenPodManager to wrapper
+ eigenPodManagerWrapper = new EigenPodManagerWrapper(
+ ethPOSMock,
+ eigenPodBeacon,
+ IDelegationManager(address(delegationManagerMock)),
+ pauserRegistry,
+ "v9.9.9"
+ );
+ eigenLayerProxyAdmin.upgrade(ITransparentUpgradeableProxy(payable(address(eigenPodManager))), address(eigenPodManagerWrapper));
+ }
+
/*******************************************************************************
Add Shares Tests
*******************************************************************************/
@@ -193,20 +211,20 @@ contract EigenPodManagerUnitTests_ShareUpdateTests is EigenPodManagerUnitTests {
cheats.assume(notDelegationManager != address(delegationManagerMock));
cheats.prank(notDelegationManager);
cheats.expectRevert(IEigenPodManagerErrors.OnlyDelegationManager.selector);
- eigenPodManager.addShares(defaultStaker, IStrategy(address(0)), IERC20(address(0)), 0);
+ eigenPodManager.addShares(defaultStaker, IStrategy(address(0)), 0);
}
function test_addShares_revert_podOwnerZeroAddress() public {
cheats.prank(address(delegationManagerMock));
cheats.expectRevert(IEigenPodErrors.InputAddressZero.selector);
- eigenPodManager.addShares(address(0), beaconChainETHStrategy, IERC20(address(0)), 0);
+ eigenPodManager.addShares(address(0), beaconChainETHStrategy, 0);
}
function testFuzz_addShares_revert_sharesNegative(int256 shares) public {
cheats.assume(shares < 0);
cheats.prank(address(delegationManagerMock));
cheats.expectRevert(IEigenPodManagerErrors.SharesNegative.selector);
- eigenPodManager.addShares(defaultStaker, beaconChainETHStrategy, IERC20(address(0)), uint256(shares));
+ eigenPodManager.addShares(defaultStaker, beaconChainETHStrategy, uint256(shares));
}
function testFuzz_addShares(uint256 shares) public {
@@ -217,12 +235,60 @@ contract EigenPodManagerUnitTests_ShareUpdateTests is EigenPodManagerUnitTests {
// Add shares
cheats.prank(address(delegationManagerMock));
- eigenPodManager.addShares(defaultStaker, beaconChainETHStrategy, IERC20(address(0)), shares);
+ eigenPodManager.addShares(defaultStaker, beaconChainETHStrategy, shares);
// Check storage update
assertEq(eigenPodManager.podOwnerDepositShares(defaultStaker), int256(shares), "Incorrect number of shares added");
}
+ function test_addShares_negativeInitial() public {
+ _initializePodWithShares(defaultStaker, -1);
+
+ cheats.prank(address(delegationManagerMock));
+
+ (uint256 prevDepositShares, uint256 addedShares) = eigenPodManager.addShares(
+ defaultStaker,
+ beaconChainETHStrategy,
+ 5
+ );
+
+ assertEq(prevDepositShares, 0);
+ assertEq(addedShares, 4);
+ }
+
+ function testFuzz_addShares_negativeSharesInitial(int256 sharesToStart, int256 sharesToAdd) public {
+ cheats.assume(sharesToStart < 0);
+ cheats.assume(sharesToAdd >= 0);
+
+ _initializePodWithShares(defaultStaker, sharesToStart);
+ int256 expectedDepositShares = sharesToStart + sharesToAdd;
+
+ cheats.prank(address(delegationManagerMock));
+
+ cheats.expectEmit(true, true, true, true, address(eigenPodManager));
+ emit PodSharesUpdated(defaultStaker, sharesToAdd);
+ cheats.expectEmit(true, true, true, true, address(eigenPodManager));
+ emit NewTotalShares(defaultStaker, expectedDepositShares);
+
+ (uint256 prevDepositShares, uint256 addedShares) = eigenPodManager.addShares(
+ defaultStaker,
+ beaconChainETHStrategy,
+ uint256(sharesToAdd)
+ );
+
+ // validate that prev shares return 0 since we started from a negative balance
+ assertEq(prevDepositShares, 0);
+
+ // If we now have positive shares, expect return
+ if (expectedDepositShares > 0) {
+ assertEq(addedShares, uint256(expectedDepositShares));
+ }
+ // We still have negative shares, return 0
+ else {
+ assertEq(addedShares, 0);
+ }
+ }
+
/*******************************************************************************
Remove Shares Tests
******************************************************************************/
@@ -304,7 +370,8 @@ contract EigenPodManagerUnitTests_WithdrawSharesAsTokensTests is EigenPodManager
ethPOSMock,
eigenPodBeacon,
IDelegationManager(address(delegationManagerMock)),
- pauserRegistry
+ pauserRegistry,
+ "v9.9.9"
);
eigenLayerProxyAdmin.upgrade(ITransparentUpgradeableProxy(payable(address(eigenPodManager))), address(eigenPodManagerWrapper));
}
@@ -426,7 +493,8 @@ contract EigenPodManagerUnitTests_BeaconChainETHBalanceUpdateTests is EigenPodMa
ethPOSMock,
eigenPodBeacon,
IDelegationManager(address(delegationManagerMock)),
- pauserRegistry
+ pauserRegistry,
+ "v9.9.9"
);
eigenLayerProxyAdmin.upgrade(ITransparentUpgradeableProxy(payable(address(eigenPodManager))), address(eigenPodManagerWrapper));
}
diff --git a/src/test/unit/EigenPodUnit.t.sol b/src/test/unit/EigenPodUnit.t.sol
index 002ff9419f..eb098cfa94 100644
--- a/src/test/unit/EigenPodUnit.t.sol
+++ b/src/test/unit/EigenPodUnit.t.sol
@@ -59,7 +59,8 @@ contract EigenPodUnitTests is EigenLayerUnitTestSetup, EigenPodPausingConstants,
podImplementation = new EigenPod(
ethPOSDepositMock,
IEigenPodManager(address(eigenPodManagerMock)),
- GENESIS_TIME_LOCAL
+ GENESIS_TIME_LOCAL,
+ "v9.9.9"
);
// Deploy Beacon
@@ -324,7 +325,7 @@ contract EigenPodUnitTests is EigenLayerUnitTestSetup, EigenPodPausingConstants,
contract EigenPodUnitTests_Initialization is EigenPodUnitTests {
function test_constructor() public {
- EigenPod pod = new EigenPod(ethPOSDepositMock, IEigenPodManager(address(eigenPodManagerMock)), GENESIS_TIME_LOCAL);
+ EigenPod pod = new EigenPod(ethPOSDepositMock, IEigenPodManager(address(eigenPodManagerMock)), GENESIS_TIME_LOCAL, "v9.9.9");
assertTrue(pod.ethPOS() == ethPOSDepositMock, "should have set ethPOS correctly");
assertTrue(address(pod.eigenPodManager()) == address(eigenPodManagerMock), "should have set eigenpodmanager correctly");
@@ -352,7 +353,7 @@ contract EigenPodUnitTests_Initialization is EigenPodUnitTests {
}
function test_initialize_revert_emptyPodOwner() public {
- EigenPod pod = new EigenPod(ethPOSDepositMock, IEigenPodManager(address(eigenPodManagerMock)), GENESIS_TIME_LOCAL);
+ EigenPod pod = new EigenPod(ethPOSDepositMock, IEigenPodManager(address(eigenPodManagerMock)), GENESIS_TIME_LOCAL, "v9.9.9");
// un-initialize pod
cheats.store(address(pod), 0, 0);
@@ -1726,7 +1727,8 @@ contract EigenPodHarnessSetup is EigenPodUnitTests {
eigenPodHarnessImplementation = new EigenPodHarness(
ethPOSDepositMock,
IEigenPodManager(address(eigenPodManagerMock)),
- GENESIS_TIME_LOCAL
+ GENESIS_TIME_LOCAL,
+ "v9.9.9"
);
// Upgrade eigenPod to harness
diff --git a/src/test/unit/RewardsCoordinatorUnit.t.sol b/src/test/unit/RewardsCoordinatorUnit.t.sol
index 4358e094bc..6f6a153510 100644
--- a/src/test/unit/RewardsCoordinatorUnit.t.sol
+++ b/src/test/unit/RewardsCoordinatorUnit.t.sol
@@ -108,17 +108,21 @@ contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordin
// Deploy RewardsCoordinator proxy and implementation
rewardsCoordinatorImplementation = new RewardsCoordinator(
- IDelegationManager(address(delegationManagerMock)),
- IStrategyManager(address(strategyManagerMock)),
- IAllocationManager(address(allocationManagerMock)),
- pauserRegistry,
- IPermissionController(address(permissionController)),
- CALCULATION_INTERVAL_SECONDS,
- MAX_REWARDS_DURATION,
- MAX_RETROACTIVE_LENGTH,
- MAX_FUTURE_LENGTH,
- GENESIS_REWARDS_TIMESTAMP
+ IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams({
+ delegationManager: IDelegationManager(address(delegationManagerMock)),
+ strategyManager: IStrategyManager(address(strategyManagerMock)),
+ allocationManager: IAllocationManager(address(allocationManagerMock)),
+ pauserRegistry: pauserRegistry,
+ permissionController: IPermissionController(address(permissionController)),
+ CALCULATION_INTERVAL_SECONDS: CALCULATION_INTERVAL_SECONDS,
+ MAX_REWARDS_DURATION: MAX_REWARDS_DURATION,
+ MAX_RETROACTIVE_LENGTH: MAX_RETROACTIVE_LENGTH,
+ MAX_FUTURE_LENGTH: MAX_FUTURE_LENGTH,
+ GENESIS_REWARDS_TIMESTAMP: GENESIS_REWARDS_TIMESTAMP,
+ version: "v9.9.9"
+ })
);
+
rewardsCoordinator = RewardsCoordinator(
address(
new TransparentUpgradeableProxy(
@@ -141,7 +145,7 @@ contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordin
token2 = new ERC20PresetFixedSupply("jeo boden", "MOCK2", mockTokenInitialSupply, address(this));
token3 = new ERC20PresetFixedSupply("pepe wif avs", "MOCK3", mockTokenInitialSupply, address(this));
- strategyImplementation = new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry);
+ strategyImplementation = new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry, "v9.9.9");
strategyMock1 = StrategyBase(
address(
new TransparentUpgradeableProxy(
diff --git a/src/test/unit/StrategyBaseTVLLimitsUnit.sol b/src/test/unit/StrategyBaseTVLLimitsUnit.sol
index 797621b681..531be01dae 100644
--- a/src/test/unit/StrategyBaseTVLLimitsUnit.sol
+++ b/src/test/unit/StrategyBaseTVLLimitsUnit.sol
@@ -24,7 +24,7 @@ contract StrategyBaseTVLLimitsUnitTests is StrategyBaseUnitTests {
StrategyBaseUnitTests.setUp();
// depoloy the TVL-limited strategy
- strategyBaseTVLLimitsImplementation = new StrategyBaseTVLLimits(strategyManager, pauserRegistry);
+ strategyBaseTVLLimitsImplementation = new StrategyBaseTVLLimits(strategyManager, pauserRegistry, "v9.9.9");
strategyWithTVLLimits = StrategyBaseTVLLimits(
address(
new TransparentUpgradeableProxy(
diff --git a/src/test/unit/StrategyBaseUnit.t.sol b/src/test/unit/StrategyBaseUnit.t.sol
index 13a80673b3..60caa46201 100644
--- a/src/test/unit/StrategyBaseUnit.t.sol
+++ b/src/test/unit/StrategyBaseUnit.t.sol
@@ -55,7 +55,7 @@ contract StrategyBaseUnitTests is Test {
underlyingToken = new ERC20PresetFixedSupply("Test Token", "TEST", initialSupply, initialOwner);
- strategyImplementation = new StrategyBase(strategyManager, pauserRegistry);
+ strategyImplementation = new StrategyBase(strategyManager, pauserRegistry, "v9.9.9");
strategy = StrategyBase(
address(
@@ -161,7 +161,7 @@ contract StrategyBaseUnitTests is Test {
// Deploy token with 1e39 total supply
underlyingToken = new ERC20PresetFixedSupply("Test Token", "TEST", 1e39, initialOwner);
- strategyImplementation = new StrategyBase(strategyManager, pauserRegistry);
+ strategyImplementation = new StrategyBase(strategyManager, pauserRegistry, "v9.9.9");
strategy = StrategyBase(
address(
diff --git a/src/test/unit/StrategyFactoryUnit.t.sol b/src/test/unit/StrategyFactoryUnit.t.sol
index 5775851163..6843c39d20 100644
--- a/src/test/unit/StrategyFactoryUnit.t.sol
+++ b/src/test/unit/StrategyFactoryUnit.t.sol
@@ -46,12 +46,12 @@ contract StrategyFactoryUnitTests is EigenLayerUnitTestSetup {
underlyingToken = new ERC20PresetFixedSupply("Test Token", "TEST", initialSupply, initialOwner);
- strategyImplementation = new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry);
+ strategyImplementation = new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry, "v9.9.9");
strategyBeacon = new UpgradeableBeacon(address(strategyImplementation));
strategyBeacon.transferOwnership(beaconProxyOwner);
- strategyFactoryImplementation = new StrategyFactory(IStrategyManager(address(strategyManagerMock)), pauserRegistry);
+ strategyFactoryImplementation = new StrategyFactory(IStrategyManager(address(strategyManagerMock)), pauserRegistry, "v9.9.9");
strategyFactory = StrategyFactory(
address(
diff --git a/src/test/unit/StrategyManagerUnit.t.sol b/src/test/unit/StrategyManagerUnit.t.sol
index d5ba4146ee..9e58282aaa 100644
--- a/src/test/unit/StrategyManagerUnit.t.sol
+++ b/src/test/unit/StrategyManagerUnit.t.sol
@@ -38,7 +38,7 @@ contract StrategyManagerUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEv
function setUp() public override {
EigenLayerUnitTestSetup.setUp();
strategyManagerImplementation = new StrategyManager(
- IDelegationManager(address(delegationManagerMock)), pauserRegistry
+ IDelegationManager(address(delegationManagerMock)), pauserRegistry, "v9.9.9"
);
strategyManager = StrategyManager(
address(
@@ -88,7 +88,7 @@ contract StrategyManagerUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEv
IPauserRegistry _pauserRegistry,
address admin
) public returns (StrategyBase) {
- StrategyBase newStrategyImplementation = new StrategyBase(_strategyManager, _pauserRegistry);
+ StrategyBase newStrategyImplementation = new StrategyBase(_strategyManager, _pauserRegistry, "v9.9.9");
StrategyBase newStrategy = StrategyBase(address(new TransparentUpgradeableProxy(address(newStrategyImplementation), address(admin), "")));
newStrategy.initialize(_token);
return newStrategy;
@@ -120,7 +120,7 @@ contract StrategyManagerUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEv
token.approve(address(strategyManager), amount);
cheats.expectEmit(true, true, true, true, address(strategyManager));
- emit Deposit(staker, token, strategy, expectedDepositShares);
+ emit Deposit(staker, strategy, expectedDepositShares);
uint256 shares = strategyManager.depositIntoStrategy(strategy, token, amount);
cheats.stopPrank();
@@ -177,12 +177,12 @@ contract StrategyManagerUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEv
if (!expectedRevertMessageIsempty) {
cheats.expectRevert(expectedRevertMessage);
} else if (expiry < block.timestamp) {
- cheats.expectRevert(ISignatureUtils.SignatureExpired.selector);
+ cheats.expectRevert(ISignatureUtilsMixinErrors.SignatureExpired.selector);
} else {
// needed for expecting an event with the right parameters
uint256 expectedDepositShares = amount;
cheats.expectEmit(true, true, true, true, address(strategyManager));
- emit Deposit(staker, dummyToken, dummyStrat, expectedDepositShares);
+ emit Deposit(staker, dummyStrat, expectedDepositShares);
}
uint256 shares = strategyManager.depositIntoStrategyWithSignature(
dummyStrat,
@@ -263,6 +263,20 @@ contract StrategyManagerUnitTests_initialize is StrategyManagerUnitTests {
address(pauserRegistry),
"strategyManager.pauserRegistry() != pauserRegistry"
);
+
+ bytes memory v = bytes(strategyManager.version());
+
+ bytes32 expectedDomainSeparator = keccak256(
+ abi.encode(
+ EIP712_DOMAIN_TYPEHASH,
+ keccak256(bytes("EigenLayer")),
+ keccak256(bytes(bytes.concat(v[0], v[1]))),
+ block.chainid,
+ address(strategyManager)
+ )
+ );
+
+ assertEq(strategyManager.domainSeparator(), expectedDomainSeparator, "sanity check");
}
}
@@ -297,7 +311,7 @@ contract StrategyManagerUnitTests_depositIntoStrategy is StrategyManagerUnitTest
token.approve(address(strategyManager), amount);
cheats.expectEmit(true, true, true, true, address(strategyManager));
- emit Deposit(staker, token, strategy, expectedDepositShares);
+ emit Deposit(staker, strategy, expectedDepositShares);
uint256 depositedShares = strategyManager.depositIntoStrategy(strategy, token, amount);
cheats.stopPrank();
@@ -836,7 +850,7 @@ contract StrategyManagerUnitTests_depositIntoStrategyWithSignature is StrategyMa
uint256 depositSharesBefore = strategyManager.stakerDepositShares(staker, strategy);
- cheats.expectRevert(ISignatureUtils.InvalidSignature.selector);
+ cheats.expectRevert(ISignatureUtilsMixinErrors.InvalidSignature.selector);
// call with `notStaker` as input instead of `staker` address
address notStaker = address(3333);
strategyManager.depositIntoStrategyWithSignature(strategy, token, amount, notStaker, expiry, signature);
@@ -866,7 +880,7 @@ contract StrategyManagerUnitTests_depositIntoStrategyWithSignature is StrategyMa
// not expecting a revert, so input an empty string
bytes memory signature = _depositIntoStrategyWithSignature(staker, amount, expiry, "");
- cheats.expectRevert(ISignatureUtils.InvalidSignature.selector);
+ cheats.expectRevert(ISignatureUtilsMixinErrors.InvalidSignature.selector);
strategyManager.depositIntoStrategyWithSignature(dummyStrat, dummyToken, amount, staker, expiry, signature);
}
@@ -906,7 +920,7 @@ contract StrategyManagerUnitTests_depositIntoStrategyWithSignature is StrategyMa
signature = abi.encodePacked(r, s, v);
}
- cheats.expectRevert(ISignatureUtils.InvalidSignature.selector);
+ cheats.expectRevert(ISignatureUtilsMixinErrors.InvalidSignature.selector);
strategyManager.depositIntoStrategyWithSignature(strategy, token, amount, staker, expiry, signature);
}
@@ -1074,7 +1088,7 @@ contract StrategyManagerUnitTests_depositIntoStrategyWithSignature is StrategyMa
uint256 depositSharesBefore = strategyManager.stakerDepositShares(staker, strategy);
- cheats.expectRevert(ISignatureUtils.SignatureExpired.selector);
+ cheats.expectRevert(ISignatureUtilsMixinErrors.SignatureExpired.selector);
strategyManager.depositIntoStrategyWithSignature(strategy, token, amount, staker, expiry, signature);
uint256 depositSharesAfter = strategyManager.stakerDepositShares(staker, strategy);
@@ -1300,18 +1314,18 @@ contract StrategyManagerUnitTests_addShares is StrategyManagerUnitTests {
function test_Revert_DelegationManagerModifier() external {
DelegationManagerMock invalidDelegationManager = new DelegationManagerMock();
cheats.expectRevert(IStrategyManagerErrors.OnlyDelegationManager.selector);
- invalidDelegationManager.addShares(strategyManager, address(this), dummyToken, dummyStrat, 1);
+ invalidDelegationManager.addShares(strategyManager, address(this), dummyStrat, 1);
}
function testFuzz_Revert_StakerZeroAddress(uint256 amount) external {
cheats.expectRevert(IStrategyManagerErrors.StakerAddressZero.selector);
- delegationManagerMock.addShares(strategyManager, address(0), dummyToken, dummyStrat, amount);
+ delegationManagerMock.addShares(strategyManager, address(0), dummyStrat, amount);
}
function testFuzz_Revert_ZeroShares(address staker) external filterFuzzedAddressInputs(staker) {
cheats.assume(staker != address(0));
cheats.expectRevert(IStrategyManagerErrors.SharesAmountZero.selector);
- delegationManagerMock.addShares(strategyManager, staker, dummyToken, dummyStrat, 0);
+ delegationManagerMock.addShares(strategyManager, staker, dummyStrat, 0);
}
function testFuzz_AppendsStakerStrategyList(
@@ -1324,7 +1338,7 @@ contract StrategyManagerUnitTests_addShares is StrategyManagerUnitTests {
assertEq(depositSharesBefore, 0, "Staker has already deposited into this strategy");
assertFalse(_isDepositedStrategy(staker, dummyStrat), "strategy should not be deposited");
- delegationManagerMock.addShares(strategyManager, staker, dummyToken, dummyStrat, amount);
+ delegationManagerMock.addShares(strategyManager, staker, dummyStrat, amount);
uint256 stakerStrategyListLengthAfter = strategyManager.stakerStrategyListLength(staker);
uint256 depositSharesAfter = strategyManager.stakerDepositShares(staker, dummyStrat);
assertEq(
@@ -1349,7 +1363,7 @@ contract StrategyManagerUnitTests_addShares is StrategyManagerUnitTests {
assertEq(depositSharesBefore, initialAmount, "Staker has not deposited amount into strategy");
assertTrue(_isDepositedStrategy(staker, strategy), "strategy should be deposited");
- delegationManagerMock.addShares(strategyManager, staker, dummyToken, dummyStrat, sharesAmount);
+ delegationManagerMock.addShares(strategyManager, staker, dummyStrat, sharesAmount);
uint256 stakerStrategyListLengthAfter = strategyManager.stakerStrategyListLength(staker);
uint256 depositSharesAfter = strategyManager.stakerDepositShares(staker, dummyStrat);
assertEq(
@@ -1397,7 +1411,7 @@ contract StrategyManagerUnitTests_addShares is StrategyManagerUnitTests {
cheats.prank(staker);
cheats.expectRevert(IStrategyManagerErrors.MaxStrategiesExceeded.selector);
- delegationManagerMock.addShares(strategyManager, staker, dummyToken, strategy, amount);
+ delegationManagerMock.addShares(strategyManager, staker, strategy, amount);
cheats.expectRevert(IStrategyManagerErrors.MaxStrategiesExceeded.selector);
strategyManager.depositIntoStrategy(strategy, token, amount);
@@ -1466,7 +1480,7 @@ contract StrategyManagerUnitTests_increaseBurnableShares is StrategyManagerUnitT
cheats.prank(address(delegationManagerMock));
strategyManager.increaseBurnableShares(strategy, addedSharesToBurn);
assertEq(
- strategyManager.burnableShares(strategy),
+ strategyManager.getBurnableShares(strategy),
addedSharesToBurn,
"strategyManager.burnableShares(strategy) != addedSharesToBurn"
);
@@ -1487,7 +1501,7 @@ contract StrategyManagerUnitTests_increaseBurnableShares is StrategyManagerUnitT
emit BurnableSharesIncreased(strategy, existingBurnableShares);
strategyManager.increaseBurnableShares(strategy, existingBurnableShares);
assertEq(
- strategyManager.burnableShares(strategy),
+ strategyManager.getBurnableShares(strategy),
existingBurnableShares,
"strategyManager.burnableShares(strategy) != existingBurnableShares"
);
@@ -1498,7 +1512,7 @@ contract StrategyManagerUnitTests_increaseBurnableShares is StrategyManagerUnitT
strategyManager.increaseBurnableShares(strategy, addedSharesToBurn);
assertEq(
- strategyManager.burnableShares(strategy),
+ strategyManager.getBurnableShares(strategy),
existingBurnableShares + addedSharesToBurn,
"strategyManager.burnableShares(strategy) != existingBurnableShares + addedSharesToBurn"
);
@@ -1543,6 +1557,11 @@ contract StrategyManagerUnitTests_burnShares is StrategyManagerUnitTests {
burnAddressBalanceBefore + sharesToBurn,
"balanceAfter != balanceBefore + sharesAmount"
);
+
+ // Verify strategy was removed from burnable shares
+ (address[] memory strategiesAfterBurn, uint256[] memory sharesAfterBurn) = strategyManager.getStrategiesWithBurnableShares();
+ assertEq(strategiesAfterBurn.length, 0, "Should have no strategies after burning");
+ assertEq(strategyManager.getBurnableShares(strategy), 0, "getBurnableShares should return 0 after burning");
}
/// @notice check that balances are unchanged with a reverting token but burnShares doesn't revert
@@ -1572,7 +1591,7 @@ contract StrategyManagerUnitTests_burnShares is StrategyManagerUnitTests {
strategyManager.burnShares(strategy);
assertEq(
- strategyManager.burnableShares(strategy),
+ strategyManager.getBurnableShares(strategy),
sharesToBurn,
"burnable shares should be unchanged"
);
@@ -1751,4 +1770,78 @@ contract StrategyManagerUnitTests_removeStrategiesFromDepositWhitelist is Strate
}
}
}
+}
+
+contract StrategyManagerUnitTests_getStrategiesWithBurnableShares is StrategyManagerUnitTests {
+
+ function test_getStrategiesWithBurnableShares_Empty() public {
+ (address[] memory strategies, uint256[] memory shares) = strategyManager.getStrategiesWithBurnableShares();
+ assertEq(strategies.length, 0, "Should have no strategies when empty");
+ assertEq(shares.length, 0, "Should have no shares when empty");
+ }
+
+ function testFuzz_getStrategiesWithBurnableShares_Single(uint256 sharesToAdd) public {
+ //ensure non-zero
+ cheats.assume(sharesToAdd > 0);
+
+ // Add burnable shares
+ cheats.prank(address(delegationManagerMock));
+ strategyManager.increaseBurnableShares(dummyStrat, sharesToAdd);
+
+ // Get strategies with burnable shares
+ (address[] memory strategies, uint256[] memory shares) = strategyManager.getStrategiesWithBurnableShares();
+
+ // Verify results
+ assertEq(strategies.length, 1, "Should have one strategy");
+ assertEq(shares.length, 1, "Should have one share amount");
+ assertEq(strategies[0], address(dummyStrat), "Wrong strategy address");
+ assertEq(shares[0], sharesToAdd, "Wrong shares amount");
+ }
+
+ function testFuzz_getStrategiesWithBurnableShares_Multiple(
+ uint256[3] calldata sharesToAdd
+ ) public {
+ IStrategy[] memory strategies = new IStrategy[](3);
+ strategies[0] = dummyStrat;
+ strategies[1] = dummyStrat2;
+ strategies[2] = dummyStrat3;
+ uint256[3] memory expectedShares;
+ uint256 expectedLength = 0;
+
+ // Add non-zero shares to strategies
+ for (uint256 i = 0; i < 3; i++) {
+ expectedShares[i] = sharesToAdd[i];
+ if (sharesToAdd[i] > 0) {
+ expectedLength++;
+ cheats.prank(address(delegationManagerMock));
+ strategyManager.increaseBurnableShares(strategies[i], sharesToAdd[i]);
+ }
+ }
+
+ // Get strategies with burnable shares
+ (address[] memory returnedStrategies, uint256[] memory returnedShares) =
+ strategyManager.getStrategiesWithBurnableShares();
+
+ // Verify lengths match
+ assertEq(returnedStrategies.length, expectedLength, "Wrong number of strategies returned");
+ assertEq(returnedShares.length, expectedLength, "Wrong number of share amounts returned");
+
+ // For all strategies with non-zero shares, verify they are in the returned arrays
+ uint256 foundCount = 0;
+ for (uint256 i = 0; i < 3; i++) {
+ if (expectedShares[i] > 0) {
+ bool found = false;
+ for (uint256 j = 0; j < returnedStrategies.length; j++) {
+ if (returnedStrategies[j] == address(strategies[i])) {
+ assertEq(returnedShares[j], expectedShares[i], "Wrong share amount");
+ found = true;
+ foundCount++;
+ break;
+ }
+ }
+ assertTrue(found, "Strategy with non-zero shares not found in returned array");
+ }
+ }
+ assertEq(foundCount, expectedLength, "Number of found strategies doesn't match expected length");
+ }
}
\ No newline at end of file
diff --git a/src/test/unit/libraries/SnapshotsUnit.t.sol b/src/test/unit/libraries/SnapshotsUnit.t.sol
index 086241c09b..be6eb40d38 100644
--- a/src/test/unit/libraries/SnapshotsUnit.t.sol
+++ b/src/test/unit/libraries/SnapshotsUnit.t.sol
@@ -51,6 +51,7 @@ contract SnapshotsUnitTests is Test {
harness = new SnapshotsHarness();
}
+ /// forge-config: default.allow_internal_expect_revert = true
function test_Revert_InvalidSnapshotOrdering(uint256 r) public {
uint32 key = uint32(bound(r, 1, type(uint32).max));
uint32 smallerKey = uint32(bound(r, 0, key - 1));
diff --git a/src/test/unit/mixins/SemVerMixin.t.sol b/src/test/unit/mixins/SemVerMixin.t.sol
new file mode 100644
index 0000000000..bd217fd1d3
--- /dev/null
+++ b/src/test/unit/mixins/SemVerMixin.t.sol
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.0;
+
+import {Test} from "forge-std/Test.sol";
+import {SemVerMixin} from "src/contracts/mixins/SemVerMixin.sol";
+
+// Helper contract to test the abstract SemVerMixin
+contract SemVerMixinMock is SemVerMixin {
+ constructor(string memory version) SemVerMixin(version) {}
+
+ // Expose internal function for testing
+ function majorVersion() public view returns (string memory) {
+ return _majorVersion();
+ }
+}
+
+contract SemVerMixinTest is Test {
+ SemVerMixinMock public semVer;
+
+ function test_version_returnsCorrectVersion() public {
+ semVer = new SemVerMixinMock("v1.2.3");
+ assertEq(semVer.version(), "v1.2.3");
+ }
+
+ function test_majorVersion_returnsCorrectMajorVersion() public {
+ semVer = new SemVerMixinMock("v1.2.3");
+ assertEq(semVer.majorVersion(), "v1");
+ }
+}
\ No newline at end of file
diff --git a/src/test/unit/mixins/SignatureUtilsUnit.t.sol b/src/test/unit/mixins/SignatureUtilsUnit.t.sol
index 645a2d9ec2..c2b959b39a 100644
--- a/src/test/unit/mixins/SignatureUtilsUnit.t.sol
+++ b/src/test/unit/mixins/SignatureUtilsUnit.t.sol
@@ -2,7 +2,7 @@
pragma solidity ^0.8.27;
import "forge-std/Test.sol";
-import "src/contracts/mixins/SignatureUtils.sol";
+import "src/contracts/mixins/SignatureUtilsMixin.sol";
contract MockSigner {
mapping(bytes32 => mapping(bytes => bool)) public validSignatures;
@@ -16,24 +16,7 @@ contract MockSigner {
}
}
-contract SignatureUtilsHarness is SignatureUtils {
- function calculateSignableDigest(bytes32 hash) public view returns (bytes32) {
- return _calculateSignableDigest(hash);
- }
-
- function checkIsValidSignatureNow(
- address signer,
- bytes32 digest,
- bytes memory signature,
- uint256 expiry
- ) public view {
- _checkIsValidSignatureNow(signer, digest, signature, expiry);
- }
-}
-
-contract SignatureUtilsUnit is Test {
- SignatureUtilsHarness harness;
- MockSigner mockSigner;
+contract SignatureUtilsMixinUnit is Test, SignatureUtilsMixin("v0.0.0") {
uint256 signerPk;
address signer;
bytes32 hash;
@@ -43,36 +26,35 @@ contract SignatureUtilsUnit is Test {
function setUp() public {
vm.chainId(1);
- harness = new SignatureUtilsHarness();
- mockSigner = new MockSigner();
signerPk = 1;
signer = vm.addr(signerPk);
hash = keccak256("");
- digest = harness.calculateSignableDigest(hash);
+ digest = _calculateSignableDigest(hash);
expectedDomainSeparator = keccak256(
abi.encode(
- keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"),
+ keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes("EigenLayer")),
+ keccak256(bytes(_majorVersion())),
block.chainid,
- address(harness)
+ address(this)
)
);
}
- function test_domainSeparator_NonZero() public view {
- assertTrue(harness.domainSeparator() != 0, "The domain separator should be non-zero");
- assertTrue(harness.domainSeparator() == expectedDomainSeparator, "The domain separator should be as expected");
+ function test_domainSeparator_NonZero() public {
+ assertTrue(domainSeparator() != 0, "The domain separator should be non-zero");
+ assertTrue(domainSeparator() == expectedDomainSeparator, "The domain separator should be as expected");
}
function test_domainSeparator_NewChainId() public {
- bytes32 initialDomainSeparator = harness.domainSeparator();
+ bytes32 initialDomainSeparator = domainSeparator();
// Change the chain ID
vm.chainId(9999);
- bytes32 newDomainSeparator = harness.domainSeparator();
+ bytes32 newDomainSeparator = domainSeparator();
assertTrue(newDomainSeparator != 0, "The new domain separator should be non-zero");
assertTrue(
@@ -81,15 +63,15 @@ contract SignatureUtilsUnit is Test {
);
}
+ /// forge-config: default.allow_internal_expect_revert = true
function test_checkIsValidSignatureNow_Expired() public {
(uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPk, digest);
- vm.expectRevert(ISignatureUtils.SignatureExpired.selector);
- harness.checkIsValidSignatureNow(signer, digest, abi.encode(r, s, v), block.timestamp - 1);
+ vm.expectRevert(ISignatureUtilsMixinErrors.SignatureExpired.selector);
+ _checkIsValidSignatureNow(signer, digest, abi.encode(r, s, v), block.timestamp - 1);
}
- function test_Revert_checkIsValidSignatureNow_InvalidSignature() public {
- vm.expectRevert(ISignatureUtils.InvalidSignature.selector);
- harness.checkIsValidSignatureNow(signer, digest, "", block.timestamp);
- }
+ // function testFail_checkIsValidSignatureNow_InvalidSignature() public {
+ // _checkIsValidSignatureNow(signer, digest, "", block.timestamp);
+ // }
}
\ No newline at end of file
diff --git a/src/test/utils/EigenLayerUnitTestSetup.sol b/src/test/utils/EigenLayerUnitTestSetup.sol
index a8ac0e187f..80d48dc3d4 100644
--- a/src/test/utils/EigenLayerUnitTestSetup.sol
+++ b/src/test/utils/EigenLayerUnitTestSetup.sol
@@ -71,7 +71,7 @@ abstract contract EigenLayerUnitTestSetup is Test {
eigenLayerProxyAdmin = new ProxyAdmin();
// Deploy permission controller
- permissionControllerImplementation = new PermissionController();
+ permissionControllerImplementation = new PermissionController("v9.9.9");
permissionController = PermissionController(address(new TransparentUpgradeableProxy(
address(permissionControllerImplementation),
address(eigenLayerProxyAdmin),
diff --git a/src/test/utils/Logger.t.sol b/src/test/utils/Logger.t.sol
index c3fd148c25..7a5aab8f99 100644
--- a/src/test/utils/Logger.t.sol
+++ b/src/test/utils/Logger.t.sol
@@ -46,10 +46,30 @@ abstract contract Logger is Test {
/// Modifiers
/// -----------------------------------------------------------------------
+ // Address used to store a trace counter to allow us to use noTracing
+ // across any contract that inherits Logger
+ address constant LOG_STATE_ADDR = address(0xDEADBEEF);
+ bytes32 constant LOG_STATE_SLOT = bytes32(0);
+
modifier noTracing() {
- cheats.pauseTracing();
+ uint traceCounter = _getTraceCounter();
+ if (traceCounter == 0) {
+ cheats.pauseTracing();
+ }
+
+ traceCounter++;
+ _setTraceCounter(traceCounter);
+
_;
- cheats.resumeTracing();
+
+ traceCounter = _getTraceCounter();
+ traceCounter--;
+ _setTraceCounter(traceCounter);
+
+ if (traceCounter == 0) {
+ cheats.resumeTracing();
+ }
+
}
modifier noLogging() {
@@ -77,7 +97,7 @@ abstract contract Logger is Test {
/// @dev Returns `name` colored based logging its role.
function colorByRole(
string memory name
- ) public view noTracing returns (string memory colored) {
+ ) public view returns (string memory colored) {
bool isOperator = _contains(name, "operator");
bool isStaker = _contains(name, "staker");
bool isAVS = _contains(name, "avs");
@@ -105,8 +125,15 @@ abstract contract Logger is Test {
function rollForward(
uint256 blocks
) internal {
- cheats.roll(block.timestamp + blocks);
- console.log("%s.roll(%d)", colorByRole("cheats"), block.timestamp);
+ cheats.roll(block.number + blocks);
+ console.log("%s.roll(+ %d blocks)", colorByRole("cheats"), blocks);
+ }
+
+ function rollBackward(
+ uint256 blocks
+ ) internal {
+ cheats.roll(block.number - blocks);
+ console.log("%s.roll(- %d blocks)", colorByRole("cheats"), blocks);
}
/// -----------------------------------------------------------------------
@@ -117,6 +144,18 @@ abstract contract Logger is Test {
logging = !logging;
console.log("\n%s logging %s...", NAME_COLORED(), logging ? "enabled" : "disabled");
}
+
+ /// -----------------------------------------------------------------------
+ /// Trace Counter get/set
+ /// -----------------------------------------------------------------------
+
+ function _getTraceCounter() internal view returns (uint) {
+ return uint(cheats.load(LOG_STATE_ADDR, LOG_STATE_SLOT));
+ }
+
+ function _setTraceCounter(uint _newValue) internal {
+ cheats.store(LOG_STATE_ADDR, LOG_STATE_SLOT, bytes32(_newValue));
+ }
}
/// @dev Assumes the user is a `Logger`.