diff --git a/.github/workflows/validate-deployment-scripts.yml b/.github/workflows/validate-deployment-scripts.yml
index 06a4a4be78..6dd1e50452 100644
--- a/.github/workflows/validate-deployment-scripts.yml
+++ b/.github/workflows/validate-deployment-scripts.yml
@@ -16,7 +16,7 @@ jobs:
test:
runs-on: protocol-x64-16core
strategy:
- fail-fast: true
+ fail-fast: false
matrix:
env: [mainnet, testnet-sepolia, testnet-hoodi, testnet-base-sepolia, base, preprod-hoodi]
diff --git a/.gitignore b/.gitignore
index cf968e92e4..a905ad98d1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,6 +17,7 @@ artifacts
#Foundry files
out
cache
+snapshots
*.DS_Store
diff --git a/docs/core/DurationVaultStrategy.md b/docs/core/DurationVaultStrategy.md
new file mode 100644
index 0000000000..2d0a7a19ed
--- /dev/null
+++ b/docs/core/DurationVaultStrategy.md
@@ -0,0 +1,535 @@
+# DurationVaultStrategy
+
+| File | Notes |
+| -------- | -------- |
+| [`DurationVaultStrategy.sol`](../../src/contracts/strategies/DurationVaultStrategy.sol) | Main implementation |
+| [`DurationVaultStrategyStorage.sol`](../../src/contracts/strategies/DurationVaultStrategyStorage.sol) | State variables |
+| [`IDurationVaultStrategy.sol`](../../src/contracts/interfaces/IDurationVaultStrategy.sol) | Interface |
+
+Related Contracts:
+
+| File | Notes |
+| -------- | -------- |
+| [`StrategyFactory.sol`](../../src/contracts/strategies/StrategyFactory.sol) | Deployment of duration vaults |
+| [`StrategyBase.sol`](../../src/contracts/strategies/StrategyBase.sol) | Base strategy with hooks |
+| [`StrategyManager.sol`](../../src/contracts/core/StrategyManager.sol) | Hook integration for share movements |
+
+## Prior Reading
+
+* [StrategyManager](./StrategyManager.md)
+* [AllocationManager](./AllocationManager.md)
+* [DelegationManager](./DelegationManager.md)
+
+## Overview
+
+The `DurationVaultStrategy` is a **time-bound, single-use EigenLayer strategy** designed for use cases requiring guaranteed stake commitments (e.g., insurance pools). Unlike standard strategies where stakers delegate to operators, a duration vault **acts as its own operator** — stakers must delegate to the vault before depositing. The vault registers for a single AVS operator set and allocates 100% of its magnitude to that set during a locked period.
+
+### High-Level Flow
+
+1. **AVS creates vault** via `StrategyFactory` with duration, caps, and operator set config
+2. **Vault self-registers as operator** — stakers must delegate to the vault before depositing
+3. **Stakers deposit** during the open window, subject to per-deposit and total caps
+4. **Admin locks the vault** — deposits/withdrawal queuing blocked; full magnitude allocated to operator set
+5. **AVS submits rewards** — stakers can claim rewards via normal EigenLayer reward flow
+6. **Vault exits lock**:
+ - **Normal exit**: duration elapses and anyone calls `markMatured()` to deallocate and enable withdrawals
+ - **Early exit**: arbitrator calls `advanceToWithdrawals()` after lock but before duration elapses
+7. **Stakers withdraw** — receive principal minus any slashing that occurred
+
+> **Note**: Duration vaults are **single-use**. Once matured, a vault cannot be re-locked. Deploy a new vault for new duration commitments.
+
+**Table of Contents:**
+
+| Section | Methods |
+|---------|---------|
+| [Contract Architecture](#contract-architecture) | — |
+| [Deployment](#deployment) | [`deployDurationVaultStrategy`](#deployment) |
+| [Vault Lifecycle](#vault-lifecycle) | — |
+| [Configuration](#configuration) | [`updateTVLLimits`](#updatetvllimits), [`setTVLLimits`](#settvllimits), [`updateMetadataURI`](#updatemetadatauri) |
+| [State: DEPOSITS](#state-deposits) | [`beforeAddShares`](#beforeaddshares), [`beforeRemoveShares`](#beforeremoveshares) |
+| [State: ALLOCATIONS](#state-allocations) | [`lock`](#lock) |
+| [State: WITHDRAWALS](#state-withdrawals) | [`markMatured`](#markmatured), [`advanceToWithdrawals`](#advancetowithdrawals) |
+
+---
+
+## Contract Architecture
+
+The `DurationVaultStrategy` extends `StrategyBase` and integrates with EigenLayer core contracts to act as both a strategy and an operator.
+
+```mermaid
+flowchart TB
+ subgraph Deployment
+ SF[StrategyFactory] -->|deploys| DVS
+ end
+
+ subgraph DurationVaultStrategy
+ DVS[DurationVaultStrategy]
+ DVS -->|inherits| SB[StrategyBase]
+ DVS -->|storage| DVSS[DurationVaultStrategyStorage]
+ end
+
+ subgraph Core["EigenLayer Core"]
+ SM[StrategyManager]
+ DM[DelegationManager]
+ AM[AllocationManager]
+ RC[RewardsCoordinator]
+ end
+
+ SM <-->|hooks| DVS
+ DVS -->|registers as operator| DM
+ DVS -->|allocates magnitude| AM
+ DVS -->|sets 0% split| RC
+```
+
+### Vault as Operator
+
+The vault registers itself as an EigenLayer operator on initialization. Stakers must delegate to the vault before depositing. The vault allocates its own magnitude to the configured AVS operator set and sets operator reward splits (operator AVS split, operatorSet split, and PI split) to 0% so 100% of rewards goes to its stakers.
+
+### Strategy Hooks
+
+Previously, strategies had no control over share movements after deposit — shares could be re-delegated, withdrawn, or moved without the strategy's knowledge. To enable lifecycle-aware strategies like duration vaults, two hooks were added:
+
+| Contract | Change |
+|----------|--------|
+| `StrategyBase` | Added virtual `beforeAddShares` and `beforeRemoveShares` hooks (default no-op) |
+| `StrategyManager` | Calls `strategy.beforeAddShares()` in `_addShares()` and `strategy.beforeRemoveShares()` in `_removeDepositShares()` |
+
+The `DurationVaultStrategy` overrides these hooks to enforce deposit/withdrawal constraints based on vault state.
+
+---
+
+## Deployment
+
+Duration strategy vaults deployment is permissionless via `StrategyFactory.deployDurationVaultStrategy()`. Unlike standard strategies (which are 1:1 with tokens), **multiple duration vaults can exist per token**.
+
+```js
+/**
+ * @notice Deploys a new duration vault strategy backed by the configured beacon.
+ */
+function deployDurationVaultStrategy(
+ IDurationVaultStrategy.VaultConfig calldata config
+) external onlyWhenNotPaused(PAUSED_NEW_STRATEGIES) returns (IDurationVaultStrategy newVault)
+```
+
+## Configuration
+
+### VaultConfig
+
+```js
+struct VaultConfig {
+ IERC20 underlyingToken; // Token stakers deposit
+ address vaultAdmin; // Address that can lock the vault
+ address arbitrator; // Address that can advance to withdrawals early (after lock, pre-duration)
+ uint32 duration; // Lock duration in seconds
+ uint256 maxPerDeposit; // Max deposit per transaction
+ uint256 stakeCap; // Max total deposits (TVL cap)
+ string metadataURI; // Vault metadata
+ OperatorSet operatorSet; // Target AVS operator set
+ bytes operatorSetRegistrationData; // Data for AVS registrar
+ address delegationApprover; // Delegation approval address (0x0 for open)
+ string operatorMetadataURI; // Operator metadata for the vault
+}
+```
+
+*Effects*:
+* Deploys a `BeaconProxy` pointing to `durationVaultBeacon`
+* Calls `initialize(config)` on the new vault
+* Registers the vault in `durationVaultsByToken[token]`
+* Whitelists the vault in `StrategyManager` for deposits
+* Emits `DurationVaultDeployed` event
+
+*Requirements*:
+* Pause status MUST NOT be set: `PAUSED_NEW_STRATEGIES`
+* Token MUST NOT be blacklisted
+* `vaultAdmin` MUST NOT be zero address
+* `arbitrator` MUST NOT be zero address
+* `duration` MUST be non-zero and <= `MAX_DURATION` (2 years for now)
+* `maxPerDeposit` MUST be <= `stakeCap`
+* `operatorSet.avs` MUST NOT be zero address
+
+### `updateTVLLimits`
+
+```js
+function updateTVLLimits(
+ uint256 newMaxPerDeposit,
+ uint256 newStakeCap
+) external onlyVaultAdmin
+```
+
+Allows the vault admin to update deposit limits.
+
+*Effects*:
+* Updates `maxPerDeposit` and `maxTotalDeposits`
+* Emits `MaxPerDepositUpdated` and `MaxTotalDepositsUpdated`
+
+*Requirements*:
+* Caller MUST be `vaultAdmin`
+* State MUST be `DEPOSITS`
+* `newMaxPerDeposit` MUST be <= `newStakeCap`
+
+### `setTVLLimits`
+
+
+```js
+function setTVLLimits(
+ uint256 newMaxPerDeposit,
+ uint256 newMaxTotalDeposits
+) external onlyUnpauser
+```
+
+Allows the unpauser to update TVL limits (for parity with `StrategyBaseTVLLimits`).
+
+*Effects*:
+* Updates `maxPerDeposit` and `maxTotalDeposits`
+* Emits `MaxPerDepositUpdated` and `MaxTotalDepositsUpdated`
+
+*Requirements*:
+* Caller MUST have unpauser role
+* State MUST be `DEPOSITS`
+* `newMaxPerDeposit` MUST be <= `newMaxTotalDeposits`
+
+### `updateMetadataURI`
+
+```js
+function updateMetadataURI(
+ string calldata newMetadataURI
+) external onlyVaultAdmin
+```
+
+Updates the vault's metadata URI. Can be called at any time.
+
+*Effects*:
+* Updates `metadataURI`
+* Emits `MetadataURIUpdated(newMetadataURI)`
+
+*Requirements*:
+* Caller MUST be `vaultAdmin`
+
+
+---
+
+## Vault Lifecycle
+
+The vault progresses through three states with forward-only transitions:
+
+---
+
+```mermaid
+stateDiagram-v2
+ direction LR
+
+ DEPOSITS: DEPOSITS
+ ALLOCATIONS: ALLOCATIONS
+ WITHDRAWALS: WITHDRAWALS
+
+ DEPOSITS --> ALLOCATIONS: lock()
vaultAdmin only
+ ALLOCATIONS --> WITHDRAWALS: markMatured()
anyone, after duration
+ ALLOCATIONS --> WITHDRAWALS: advanceToWithdrawals()
arbitrator only, before duration
+
+ note right of DEPOSITS
+ ✓ Deposits
+ ✓ Queue withdrawals
+ ✗ Slashable
+ end note
+
+ note right of ALLOCATIONS
+ ✗ Deposits
+ ✗ Queue withdrawals
+ ✓ Slashable*
+ end note
+
+ note right of WITHDRAWALS
+ ✗ Deposits
+ ✓ Queue withdrawals
+ ✓ Slashable**
+ end note
+```
+
+_* Slashable after allocation delay passes. ** Slashable until deallocation delay passes._
+
+---
+
+| State | Deposits | Queue Withdrawals | Slashable | Trigger | Who |
+|-------|:--------:|:-----------------:|:---------:|---------|-----|
+| `DEPOSITS` | ✓ | ✓ | ✗ | — | — |
+| `ALLOCATIONS` | ✗ | ✗ | ✓* | `lock()` | `vaultAdmin` |
+| `WITHDRAWALS` | ✗ | ✓ | ✓** | `markMatured()` / `advanceToWithdrawals()` | Anyone / `arbitrator` |
+
+---
+
+## State: DEPOSITS
+
+The initial state after deployment. Accepts deposits and allows withdrawal queuing.
+
+### `beforeAddShares`
+
+```js
+function beforeAddShares(
+ address staker,
+ uint256 shares
+) external view override onlyStrategyManager
+```
+
+Called by `StrategyManager` on deposit or when re-adding shares when completing a withdrawal.
+
+*Requirements* (all must pass):
+* State *MUST* be `DEPOSITS` (vault not locked)
+* Strategy underlying token *MUST NOT* be blacklisted in `StrategyFactory`
+* Staker *MUST* be delegated to the vault
+* Deposit amount (in underlying) *MUST NOT* exceed `maxPerDeposit`
+* Post-deposit total active shares (in underlying) *MUST NOT* exceed `maxTotalDeposits`
+
+> **Note on TVL Cap**: The cap is checked against `operatorShares` which represents active shares delegated to the duration vault at any given time. Withdrawals that have been queued reduce `operatorShares` even though the funds remain in the duration strategy, so they don't count toward the cap.
+
+### `beforeRemoveShares`
+
+```js
+function beforeRemoveShares(
+ address,
+ uint256
+) external view override onlyStrategyManager
+```
+
+Called when a staker attempts to undelegate or queue a withdrawal.
+
+*Requirements*:
+* State MUST NOT be `ALLOCATIONS`
+
+> **Note**: Withdrawals queued during `DEPOSITS` can still be *completed* during `ALLOCATIONS`. The hook only blocks *new* withdrawal queuing.
+
+---
+
+## State: ALLOCATIONS
+
+The locked state where funds are allocated to the AVS operator set and slashable.
+
+### `lock`
+
+```js
+function lock() external onlyVaultAdmin
+```
+
+Transitions the vault from `DEPOSITS` to `ALLOCATIONS`. This action:
+1. Blocks new deposits
+2. Blocks new withdrawal queuing
+3. Allocates 100% magnitude to the configured operator set
+
+*Effects*:
+* Sets `lockedAt` to current timestamp
+* Sets `unlockAt` to `lockedAt + duration`
+* Transitions state to `ALLOCATIONS`
+* Allocates full magnitude (`1e18`) to the operator set
+* Emits `VaultLocked(lockedAt, unlockAt)`
+
+*Requirements*:
+* Caller MUST be `vaultAdmin`
+* State MUST be `DEPOSITS`
+* No pending allocation modification may exist
+
+### Allocation Delay Protection
+
+The vault's allocation delay is set to `minWithdrawalDelayBlocks + 1` during initialization. This ensures that stakers who queued withdrawals during `DEPOSITS` won't be subject to slashing.
+
+---
+
+## State: WITHDRAWALS
+
+The matured state where withdrawals are enabled and deposits remain blocked.
+
+### `markMatured`
+
+```js
+function markMatured() external
+```
+
+Transitions the vault from `ALLOCATIONS` to `WITHDRAWALS`. Callable by anyone once the duration has elapsed.
+
+*Effects*:
+* Sets `maturedAt` to current timestamp
+* Transitions state to `WITHDRAWALS`
+* Attempts to deallocate magnitude to 0 (best-effort)
+* Attempts to deregister from operator set (best-effort)
+* Emits `VaultMatured(maturedAt)`
+
+*Requirements*:
+* State MUST be `ALLOCATIONS`
+* `block.timestamp` MUST be >= `unlockAt`
+
+> **NOTE**: Both deallocation and deregistration are wrapped in `try/catch`. If they fail (e.g., `AllocationManager` paused), the function still succeeds. This ensures users can always withdraw after maturity regardless of external conditions.
+
+> **NOTE**: Even after `markMatured()`, the vault **remains slashable** for `DEALLOCATION_DELAY` blocks until the deallocation takes effect on the `AllocationManager`. This is standard EigenLayer behavior for any deallocation.
+
+### `advanceToWithdrawals`
+
+```js
+function advanceToWithdrawals() external
+```
+
+Transitions the vault from `ALLOCATIONS` to `WITHDRAWALS` **early**, after lock but before `unlockAt`. This is intended for use cases where an external agreement is violated (e.g., premiums not paid) and the vault should allow stakers to exit before the duration elapses.
+
+*Effects*:
+* Sets `maturedAt` to current timestamp
+* Transitions state to `WITHDRAWALS`
+* Attempts to deallocate magnitude to 0 (best-effort)
+* Attempts to deregister from operator set (best-effort)
+* Emits `VaultAdvancedToWithdrawals(arbitrator, maturedAt)` (and `VaultMatured(maturedAt)`)
+
+*Requirements*:
+* Caller MUST be `arbitrator`
+* State MUST be `ALLOCATIONS` (i.e., vault must be locked)
+* `block.timestamp` MUST be < `unlockAt`
+
+### Withdrawals
+
+After maturity, stakers can queue and complete withdrawals through the standard EigenLayer flow via `DelegationManager`. The `beforeRemoveShares` hook allows withdrawal queuing when state is `WITHDRAWALS`.
+
+### Rewards
+
+Rewards follow the standard EigenLayer flow:
+1. AVS submits rewards to `RewardsCoordinator` targeting the operator set
+2. Stakers claim rewards normally through `RewardsCoordinator`
+3. Operator split is set to 0% at initialization, so 100% of rewards go to stakers
+4. Reward claims are **not blocked** by vault state
+
+---
+
+## View Functions
+
+| Function | Returns |
+|----------|---------|
+| `state()` | Current `VaultState` enum |
+| `vaultAdmin()` | Vault administrator address |
+| `arbitrator()` | Vault arbitrator address |
+| `duration()` | Configured lock duration in seconds |
+| `lockedAt()` | Timestamp when vault was locked (0 if not locked) |
+| `unlockTimestamp()` | Timestamp when vault matures (0 if not locked) |
+| `maturedAt()` | Timestamp when vault was marked matured |
+| `isLocked()` | `true` if state != `DEPOSITS` |
+| `isMatured()` | `true` if state == `WITHDRAWALS` |
+| `depositsOpen()` | `true` if state == `DEPOSITS` |
+| `withdrawalsOpen()` | `true` if state != `ALLOCATIONS` |
+| `allocationsActive()` | `true` if state == `ALLOCATIONS` |
+| `stakeCap()` | Maximum total deposits (alias for `maxTotalDeposits`) |
+| `maxPerDeposit()` | Maximum deposit per transaction |
+| `maxTotalDeposits()` | Maximum total deposits |
+| `getTVLLimits()` | Returns `(maxPerDeposit, maxTotalDeposits)` |
+| `metadataURI()` | Vault metadata URI |
+| `operatorSetInfo()` | Returns `(avs, operatorSetId)` |
+| `operatorIntegrationConfigured()` | Always returns `true` |
+| `operatorSetRegistered()` | `true` if in `DEPOSITS` or `ALLOCATIONS` state |
+| `delegationManager()` | Reference to `DelegationManager` |
+| `allocationManager()` | Reference to `AllocationManager` |
+| `rewardsCoordinator()` | Reference to `RewardsCoordinator` |
+
+---
+
+## Parameterization
+
+| Parameter | Value | Description |
+|-----------|-------|-------------|
+| `FULL_ALLOCATION` | `1e18` | Full magnitude for allocation (1 WAD) |
+| `MAX_DURATION` | `2 * 365 days` | Maximum allowable vault duration (~2 years) |
+| `allocationDelay` | `minWithdrawalDelayBlocks + 1` | Set during initialization to protect pre-lock withdrawals |
+| `operatorSplit` | `0` | Set to 0% so 100% of rewards go to stakers |
+
+---
+
+## Events
+
+| Event | Description |
+|-------|-------------|
+| `VaultInitialized(vaultAdmin, arbitrator, underlyingToken, duration, maxPerDeposit, stakeCap, metadataURI)` | Vault initialized with configuration |
+| `VaultLocked(lockedAt, unlockAt)` | Vault transitioned to `ALLOCATIONS` |
+| `VaultMatured(maturedAt)` | Vault transitioned to `WITHDRAWALS` |
+| `VaultAdvancedToWithdrawals(arbitrator, maturedAt)` | Vault transitioned to `WITHDRAWALS` early by the arbitrator |
+| `MetadataURIUpdated(newMetadataURI)` | Metadata URI changed |
+| `MaxPerDepositUpdated(previousValue, newValue)` | Per-deposit cap changed |
+| `MaxTotalDepositsUpdated(previousValue, newValue)` | Total deposit cap changed |
+
+---
+
+## Errors
+
+| Error | When Thrown |
+|-------|-------------|
+| `InvalidVaultAdmin` | Zero-address vault admin in config |
+| `InvalidArbitrator` | Zero-address arbitrator in config |
+| `InvalidDuration` | Zero or excessive duration (> `MAX_DURATION`) in config |
+| `OnlyVaultAdmin` | Non-admin calls admin-only function |
+| `OnlyArbitrator` | Non-arbitrator calls arbitrator-only function |
+| `VaultAlreadyLocked` | Attempting to lock an already locked vault |
+| `DepositsLocked` | Deposit attempted after vault is locked |
+| `WithdrawalsLockedDuringAllocations` | Withdrawal queuing attempted during `ALLOCATIONS` state |
+| `MustBeDelegatedToVaultOperator` | Staker not delegated to vault before deposit |
+| `DurationNotElapsed` | `markMatured()` called before `unlockAt` timestamp |
+| `DurationAlreadyElapsed` | `advanceToWithdrawals()` called at/after `unlockAt` timestamp |
+| `VaultNotLocked` | `advanceToWithdrawals()` called before the vault is locked |
+| `OperatorIntegrationInvalid` | Invalid operator integration config (zero AVS address) |
+| `UnderlyingTokenBlacklisted` | Deposit attempted with blacklisted token |
+| `PendingAllocation` | `lock()` attempted with pending allocation modification |
+| `MaxPerDepositExceedsMax` | `maxPerDeposit > maxTotalDeposits` or deposit exceeds per-deposit cap |
+| `BalanceExceedsMaxTotalDeposits` | Post-deposit balance exceeds TVL cap |
+
+---
+
+## Main Invariants
+
+| # | Invariant |
+|---|-----------|
+| 1 | State only progresses forward: `DEPOSITS → ALLOCATIONS → WITHDRAWALS` |
+| 2 | `lockedAt > 0` ⟹ `state ≠ DEPOSITS` |
+| 3 | `maturedAt > 0` ⟹ `state == WITHDRAWALS` |
+| 4 | `unlockAt == lockedAt + duration` when locked |
+| 5 | Any successful deposit requires staker delegated to the vault |
+| 6 | Any user with active shares in this strategy MUST be delegated to the vault |
+| 7 | Vault shares cannot be delegated to any operator other than the vault itself |
+| 8 | Normal deposits cannot exceed `maxPerDeposit` |
+| 9 | Post-deposit active shares (in underlying) cannot exceed `maxTotalDeposits` |
+| 10 | `maxPerDeposit <= maxTotalDeposits` always |
+| 11 | Users can always queue withdrawals before lock or after maturity |
+| 12 | Vault delegated shares may only decrease due to slashing during `ALLOCATIONS` |
+| 13 | Withdrawals queued before `lockedAt` are not subject to slashing |
+
+---
+
+## Known Issues
+
+### 1. Cap Bypass via Direct Token Transfer
+
+**Issue**: Donations (direct token transfers) to the vault bypass `beforeAddShares()` and inflate the share value without triggering cap checks.
+
+- The `beforeAddShares` hook is only called through the `StrategyManager` deposit flow. Direct ERC20 transfers to the strategy contract increase the underlying balance without minting new shares, which inflates the exchange rate.
+
+- The attacker gains nothing —and they should be the first depositor or they'll be donating value to existing shareholders. While this can be used to exceed the TVL cap in underlying terms, the cap's primary purpose is to limit protocol risk exposure, and donations don't really increase that risk.
+
+---
+
+### 2. Best-Effort Cleanup State Inconsistency
+
+**Issue**: If `_deallocateAll()` or `_deregisterFromOperatorSet()` silently fails during `markMatured()`, the vault transitions to `WITHDRAWALS` state but may still have active allocation/registration on `AllocationManager`.
+
+- These calls are wrapped in `try/catch` to prevent external conditions (e.g., `AllocationManager` paused, AVS already deregistered the vault) from blocking user withdrawals after maturity.
+
+---
+
+### 3. Short Duration Edge Case
+
+**Issue**: The allocation delay is set to `minWithdrawalDelayBlocks + 1` to protect pre-lock withdrawals. If the vault's duration is shorter than this delay, the vault matures before the allocation becomes active.
+
+- AVSs deploying duration vaults should ensure the duration is meaningful for their use case, and stakers can always check the duration of each duration strategy vault.
+
+---
+
+### 4. Front-Run Lock
+
+**Issue**: A depositor can front-run the admin's `lock()` call to queue a withdrawal, causing the vault to lock with less capital than expected.
+
+- During `DEPOSITS` state, withdrawal queuing is allowed (so users aren't trapped if admin never locks). It's the admin's responsibility to avoid front-running and make sure that they lock the strategy with the desired capital.
+
+---
+
+### 5. Admin Can Set Cap Below Current
+
+**Issue**: The `vaultAdmin` or `unpauser` can set the TVL limit to a value less than currently invested funds.
+
+- This is intentional flexibility. Setting a lower cap doesn't affect existing deposits — it only blocks new deposits until withdrawals bring the balance below the new cap.
\ No newline at end of file
diff --git a/foundry.toml b/foundry.toml
index bf8f7cd18f..c6c9d5b327 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.30'
# If enabled, treats Solidity compiler warnings as errors, preventing artifact generation if warnings are present.
- deny_warnings = true
+ deny = "warnings"
# 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 37bc2f9e16..c3d9d27ce6 100644
--- a/pkg/bindings/AVSDirectory/binding.go
+++ b/pkg/bindings/AVSDirectory/binding.go
@@ -39,7 +39,7 @@ type ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry struct {
// AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract.
var AVSDirectoryMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"isSpent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToEigenLayer\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
- Bin: "0x60e060405234801561000f575f5ffd5b5060405161185938038061185983398101604081905261002e916101b3565b808084846001600160a01b038116610059576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0526100748161008a565b60c0525061008290506100d0565b5050506102e4565b5f5f829050601f815111156100bd578260405163305a27a960e01b81526004016100b49190610289565b60405180910390fd5b80516100c8826102be565b179392505050565b5f54610100900460ff16156101375760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100b4565b5f5460ff90811614610186575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461019c575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101c5575f5ffd5b83516101d081610188565b60208501519093506101e181610188565b60408501519092506001600160401b038111156101fc575f5ffd5b8401601f8101861361020c575f5ffd5b80516001600160401b038111156102255761022561019f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102535761025361019f565b60405281815282820160200188101561026a575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102de575f198160200360031b1b821691505b50919050565b60805160a05160c05161152f61032a5f395f81816104240152610d4d01525f8181610360015261053901525f818161023c01528181610ac90152610dbc015261152f5ff3fe608060405234801561000f575f5ffd5b5060043610610148575f3560e01c8063a1060c88116100bf578063dce974b911610079578063dce974b914610334578063df5cf7231461035b578063ec76f44214610382578063f2fde38b146103b5578063f698da25146103c8578063fabc1cbc146103d0575f5ffd5b8063a1060c881461029a578063a364f4da146102ad578063a98fb355146102c0578063c825fe68146102d3578063cd6dc687146102fa578063d79aceab1461030d575f5ffd5b80635ac86ab7116101105780635ac86ab7146101fa5780635c975abb1461021d578063715018a61461022f578063886f1195146102375780638da5cb5b146102765780639926ee7d14610287575f5ffd5b8063136439dd1461014c578063374823b51461016157806349075da3146101a357806354fd4d50146101dd578063595c6a67146101f2575b5f5ffd5b61015f61015a3660046110dc565b6103e3565b005b61018e61016f366004611107565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101d06101b1366004611131565b609860209081525f928352604080842090915290825290205460ff1681565b60405161019a919061117c565b6101e561041d565b60405161019a91906111d0565b61015f61044d565b61018e6102083660046111e9565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161019a565b61015f610461565b61025e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161019a565b6033546001600160a01b031661025e565b61015f610295366004611277565b610472565b6102216102a8366004611364565b610673565b61015f6102bb3660046113a7565b6106f2565b61015f6102ce3660046113c2565b6107b9565b6102217f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b61015f610308366004611107565b610800565b6102217fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102217f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61025e7f000000000000000000000000000000000000000000000000000000000000000081565b61015f6103903660046110dc565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b61015f6103c33660046113a7565b61091c565b610221610995565b61015f6103de3660046110dc565b610a4e565b6103eb610ab4565b60665481811681146104105760405163c61dca5d60e01b815260040160405180910390fd5b61041982610b57565b5050565b60606104487f0000000000000000000000000000000000000000000000000000000000000000610b94565b905090565b610455610ab4565b61045f5f19610b57565b565b610469610bd1565b61045f5f610c2b565b5f61047c81610c7c565b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156104b5576104b5611168565b036104d357604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561051a57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa15801561057e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a29190611430565b6105bf57604051639f88c8af60e01b815260040160405180910390fd5b6105e3836105d7853386602001518760400151610673565b84516040860151610ca7565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610666919061117c565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f906106e99060c00160405160208183030381529060405280519060200120610cff565b95945050505050565b5f6106fc81610c7c565b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561073557610735611168565b14610753576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916107ad919061117c565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516107f492919061144f565b60405180910390a25050565b5f54610100900460ff161580801561081e57505f54600160ff909116105b806108375750303b15801561083757505f5460ff166001145b61089f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156108c0575f805461ff0019166101001790555b6108c982610b57565b6108d283610c2b565b8015610917575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610924610bd1565b6001600160a01b0381166109895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610896565b61099281610c2b565b50565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea610a02610d45565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b610a56610dba565b60665480198219811614610a7d5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107f4565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3a9190611430565b61045f57604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b60605f610ba083610e6b565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6033546001600160a01b0316331461045f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610896565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606654600160ff83161b908116036109925760405163840a48d560e01b815260040160405180910390fd5b42811015610cc857604051630819bdcd60e01b815260040160405180910390fd5b610cdc6001600160a01b0385168484610e98565b610cf957604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610d08610995565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60605f610d717f0000000000000000000000000000000000000000000000000000000000000000610b94565b9050805f81518110610d8557610d8561147d565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3a9190611491565b6001600160a01b0316336001600160a01b03161461045f5760405163794821ff60e01b815260040160405180910390fd5b5f60ff8216601f811115610e9257604051632cd44ac360e21b815260040160405180910390fd5b92915050565b5f5f5f610ea58585610ef6565b90925090505f816004811115610ebd57610ebd611168565b148015610edb5750856001600160a01b0316826001600160a01b0316145b80610eec5750610eec868686610f38565b9695505050505050565b5f5f8251604103610f2a576020830151604084015160608501515f1a610f1e8782858561101f565b94509450505050610f31565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401610f609291906114ac565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f9e91906114cc565b5f60405180830381855afa9150503d805f8114610fd6576040519150601f19603f3d011682016040523d82523d5f602084013e610fdb565b606091505b5091509150818015610fef57506020815110155b8015610eec57508051630b135d3f60e11b9061101490830160209081019084016114e2565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561105457505f905060036110d3565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156110a5573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166110cd575f600192509250506110d3565b91505f90505b94509492505050565b5f602082840312156110ec575f5ffd5b5035919050565b6001600160a01b0381168114610992575f5ffd5b5f5f60408385031215611118575f5ffd5b8235611123816110f3565b946020939093013593505050565b5f5f60408385031215611142575f5ffd5b823561114d816110f3565b9150602083013561115d816110f3565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061119c57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6111e260208301846111a2565b9392505050565b5f602082840312156111f9575f5ffd5b813560ff811681146111e2575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561124057611240611209565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561126f5761126f611209565b604052919050565b5f5f60408385031215611288575f5ffd5b8235611293816110f3565b9150602083013567ffffffffffffffff8111156112ae575f5ffd5b8301606081860312156112bf575f5ffd5b6112c761121d565b813567ffffffffffffffff8111156112dd575f5ffd5b8201601f810187136112ed575f5ffd5b803567ffffffffffffffff81111561130757611307611209565b61131a601f8201601f1916602001611246565b81815288602083850101111561132e575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f60808587031215611377575f5ffd5b8435611382816110f3565b93506020850135611392816110f3565b93969395505050506040820135916060013590565b5f602082840312156113b7575f5ffd5b81356111e2816110f3565b5f5f602083850312156113d3575f5ffd5b823567ffffffffffffffff8111156113e9575f5ffd5b8301601f810185136113f9575f5ffd5b803567ffffffffffffffff81111561140f575f5ffd5b856020828401011115611420575f5ffd5b6020919091019590945092505050565b5f60208284031215611440575f5ffd5b815180151581146111e2575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156114a1575f5ffd5b81516111e2816110f3565b828152604060208201525f6114c460408301846111a2565b949350505050565b5f82518060208501845e5f920191825250919050565b5f602082840312156114f2575f5ffd5b505191905056fea26469706673582212208c5d16c5bfd901fcabd7227c688591bcedfb540680c462b67a42ce12289dd0fd64736f6c634300081e0033",
+ Bin: "0x60e060405234801561000f575f5ffd5b5060405161185938038061185983398101604081905261002e916101b3565b808084846001600160a01b038116610059576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0526100748161008a565b60c0525061008290506100d0565b5050506102e4565b5f5f829050601f815111156100bd578260405163305a27a960e01b81526004016100b49190610289565b60405180910390fd5b80516100c8826102be565b179392505050565b5f54610100900460ff16156101375760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100b4565b5f5460ff90811614610186575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461019c575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101c5575f5ffd5b83516101d081610188565b60208501519093506101e181610188565b60408501519092506001600160401b038111156101fc575f5ffd5b8401601f8101861361020c575f5ffd5b80516001600160401b038111156102255761022561019f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102535761025361019f565b60405281815282820160200188101561026a575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102de575f198160200360031b1b821691505b50919050565b60805160a05160c05161152f61032a5f395f81816104240152610d4d01525f8181610360015261053901525f818161023c01528181610ac90152610dbc015261152f5ff3fe608060405234801561000f575f5ffd5b5060043610610148575f3560e01c8063a1060c88116100bf578063dce974b911610079578063dce974b914610334578063df5cf7231461035b578063ec76f44214610382578063f2fde38b146103b5578063f698da25146103c8578063fabc1cbc146103d0575f5ffd5b8063a1060c881461029a578063a364f4da146102ad578063a98fb355146102c0578063c825fe68146102d3578063cd6dc687146102fa578063d79aceab1461030d575f5ffd5b80635ac86ab7116101105780635ac86ab7146101fa5780635c975abb1461021d578063715018a61461022f578063886f1195146102375780638da5cb5b146102765780639926ee7d14610287575f5ffd5b8063136439dd1461014c578063374823b51461016157806349075da3146101a357806354fd4d50146101dd578063595c6a67146101f2575b5f5ffd5b61015f61015a3660046110dc565b6103e3565b005b61018e61016f366004611107565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101d06101b1366004611131565b609860209081525f928352604080842090915290825290205460ff1681565b60405161019a919061117c565b6101e561041d565b60405161019a91906111d0565b61015f61044d565b61018e6102083660046111e9565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161019a565b61015f610461565b61025e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161019a565b6033546001600160a01b031661025e565b61015f610295366004611277565b610472565b6102216102a8366004611364565b610673565b61015f6102bb3660046113a7565b6106f2565b61015f6102ce3660046113c2565b6107b9565b6102217f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b61015f610308366004611107565b610800565b6102217fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102217f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61025e7f000000000000000000000000000000000000000000000000000000000000000081565b61015f6103903660046110dc565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b61015f6103c33660046113a7565b61091c565b610221610995565b61015f6103de3660046110dc565b610a4e565b6103eb610ab4565b60665481811681146104105760405163c61dca5d60e01b815260040160405180910390fd5b61041982610b57565b5050565b60606104487f0000000000000000000000000000000000000000000000000000000000000000610b94565b905090565b610455610ab4565b61045f5f19610b57565b565b610469610bd1565b61045f5f610c2b565b5f61047c81610c7c565b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156104b5576104b5611168565b036104d357604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561051a57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa15801561057e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a29190611430565b6105bf57604051639f88c8af60e01b815260040160405180910390fd5b6105e3836105d7853386602001518760400151610673565b84516040860151610ca7565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610666919061117c565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f906106e99060c00160405160208183030381529060405280519060200120610cff565b95945050505050565b5f6106fc81610c7c565b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561073557610735611168565b14610753576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916107ad919061117c565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516107f492919061144f565b60405180910390a25050565b5f54610100900460ff161580801561081e57505f54600160ff909116105b806108375750303b15801561083757505f5460ff166001145b61089f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156108c0575f805461ff0019166101001790555b6108c982610b57565b6108d283610c2b565b8015610917575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610924610bd1565b6001600160a01b0381166109895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610896565b61099281610c2b565b50565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea610a02610d45565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b610a56610dba565b60665480198219811614610a7d5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107f4565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3a9190611430565b61045f57604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b60605f610ba083610e6b565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6033546001600160a01b0316331461045f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610896565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606654600160ff83161b908116036109925760405163840a48d560e01b815260040160405180910390fd5b42811015610cc857604051630819bdcd60e01b815260040160405180910390fd5b610cdc6001600160a01b0385168484610e98565b610cf957604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610d08610995565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60605f610d717f0000000000000000000000000000000000000000000000000000000000000000610b94565b9050805f81518110610d8557610d8561147d565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3a9190611491565b6001600160a01b0316336001600160a01b03161461045f5760405163794821ff60e01b815260040160405180910390fd5b5f60ff8216601f811115610e9257604051632cd44ac360e21b815260040160405180910390fd5b92915050565b5f5f5f610ea58585610ef6565b90925090505f816004811115610ebd57610ebd611168565b148015610edb5750856001600160a01b0316826001600160a01b0316145b80610eec5750610eec868686610f38565b9695505050505050565b5f5f8251604103610f2a576020830151604084015160608501515f1a610f1e8782858561101f565b94509450505050610f31565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401610f609291906114ac565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f9e91906114cc565b5f60405180830381855afa9150503d805f8114610fd6576040519150601f19603f3d011682016040523d82523d5f602084013e610fdb565b606091505b5091509150818015610fef57506020815110155b8015610eec57508051630b135d3f60e11b9061101490830160209081019084016114e2565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561105457505f905060036110d3565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156110a5573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166110cd575f600192509250506110d3565b91505f90505b94509492505050565b5f602082840312156110ec575f5ffd5b5035919050565b6001600160a01b0381168114610992575f5ffd5b5f5f60408385031215611118575f5ffd5b8235611123816110f3565b946020939093013593505050565b5f5f60408385031215611142575f5ffd5b823561114d816110f3565b9150602083013561115d816110f3565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061119c57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6111e260208301846111a2565b9392505050565b5f602082840312156111f9575f5ffd5b813560ff811681146111e2575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561124057611240611209565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561126f5761126f611209565b604052919050565b5f5f60408385031215611288575f5ffd5b8235611293816110f3565b9150602083013567ffffffffffffffff8111156112ae575f5ffd5b8301606081860312156112bf575f5ffd5b6112c761121d565b813567ffffffffffffffff8111156112dd575f5ffd5b8201601f810187136112ed575f5ffd5b803567ffffffffffffffff81111561130757611307611209565b61131a601f8201601f1916602001611246565b81815288602083850101111561132e575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f60808587031215611377575f5ffd5b8435611382816110f3565b93506020850135611392816110f3565b93969395505050506040820135916060013590565b5f602082840312156113b7575f5ffd5b81356111e2816110f3565b5f5f602083850312156113d3575f5ffd5b823567ffffffffffffffff8111156113e9575f5ffd5b8301601f810185136113f9575f5ffd5b803567ffffffffffffffff81111561140f575f5ffd5b856020828401011115611420575f5ffd5b6020919091019590945092505050565b5f60208284031215611440575f5ffd5b815180151581146111e2575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156114a1575f5ffd5b81516111e2816110f3565b828152604060208201525f6114c460408301846111a2565b949350505050565b5f82518060208501845e5f920191825250919050565b5f602082840312156114f2575f5ffd5b505191905056fea26469706673582212204c1e718020b5e4a38dda4e5d9c0f923e3401c11a90171f2535812f908ee1627164736f6c634300081e0033",
}
// AVSDirectoryABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/AllocationManager/binding.go b/pkg/bindings/AllocationManager/binding.go
index af155d7c78..85b47c5da1 100644
--- a/pkg/bindings/AllocationManager/binding.go
+++ b/pkg/bindings/AllocationManager/binding.go
@@ -88,7 +88,7 @@ type OperatorSet struct {
// AllocationManagerMetaData contains all meta data concerning the AllocationManager contract.
var AllocationManagerMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_allocationManagerView\",\"type\":\"address\",\"internalType\":\"contractIAllocationManagerView\"},{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_eigenStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_DEALLOCATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_ALLOCATION_CONFIGURATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"SLASHER_CONFIGURATION_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\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParamsV2[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"slasher\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRedistributingOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]},{\"name\":\"redistributionRecipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRedistributingOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParamsV2[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"slasher\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"redistributionRecipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"allocatableMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"\",\"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\":\"getAllocatedStake\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"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\":\"getAllocation\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"allocation\",\"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\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"allocations\",\"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\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"maxMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"maxMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"maxMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"memberCount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"\",\"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\":\"\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingSlasher\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"pendingSlasher\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRedistributionRecipient\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashCount\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"slashCount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlasher\",\"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\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"\",\"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\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"allocations\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"result\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorRedistributable\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"result\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSlashable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRedistributingOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateSlashers\",\"inputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateSlasher\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slasher\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"viewImplementation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RedistributionAddressSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"redistributionRecipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlasherMigrated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slasher\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlasherUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slasher\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Empty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAVSRegistrar\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRedistributionRecipient\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonexistentAVSMetadata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorSetAlreadyMigrated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SlasherNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]",
- Bin: "0x610180604052348015610010575f5ffd5b50604051615a31380380615a3183398101604081905261002f91610198565b868387878585896001600160a01b03811661005d576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05263ffffffff90811660e05216610100819052610120529081166101405216610160526100a16100ad565b50505050505050610227565b5f54610100900460ff16156101185760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610167575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461017d575f5ffd5b50565b805163ffffffff81168114610193575f5ffd5b919050565b5f5f5f5f5f5f5f60e0888a0312156101ae575f5ffd5b87516101b981610169565b60208901519097506101ca81610169565b60408901519096506101db81610169565b60608901519095506101ec81610169565b60808901519094506101fd81610169565b925061020b60a08901610180565b915061021960c08901610180565b905092959891949750929550565b60805160a05160c05160e0516101005161012051610140516101605161571561031c5f395f81816103910152818161097101528181610a5101528181610a8001528181610aca01528181610af501528181610d5101528181610ff501528181612125015261240001525f818161058b015281816119bc01526137c801525f818161067601526136aa01525f81816106e9015261347701525f818161048601528181611325015261174601525f818161087f01526132fd01525f81816108b401528181610ef701528181610f4501528181611c4f0152612eed01525f81816107100152818161264f0152613c8501526157155ff3fe608060405234801561000f575f5ffd5b5060043610610388575f3560e01c80636c9d7c58116101df578063b66bd98911610109578063d7794857116100a9578063f231bd0811610079578063f231bd08146108d6578063f605ce08146106ab578063fabc1cbc146108e9578063fe4b84df146108fc575f5ffd5b8063d779485714610843578063db4df7611461087a578063dc2af692146108a1578063df5cf723146108af575f5ffd5b8063c221d8ae116100e4578063c221d8ae146107f7578063d1a83f541461080a578063d3d96ff41461081d578063d4a3fcce14610830575f5ffd5b8063b66bd989146107a7578063b9fbaed1146107ba578063ba1a84e5146107e9575f5ffd5b80638ce648541161017f578063a9333ec81161014f578063a9333ec8146106ab578063a982182114610781578063adc2e3d914610794578063b2447af7146105db575f5ffd5b80638ce648541461073257806394d7d00c1461074d578063952899ee1461075b578063957dc50b1461076e575f5ffd5b80636e875dba116101ba5780636e875dba1461056b57806379ae50cd1461043b5780637bc1ef61146106e4578063886f11951461070b575f5ffd5b80636c9d7c58146106985780636cfb4481146106ab5780636e3492b5146106d1575f5ffd5b80633dff8e7d116102c057806350feea20116102605780635ac86ab7116102305780635ac86ab7146106335780635c975abb14610656578063670d3ba21461065e57806367aeaa5314610671575f5ffd5b806350feea20146105f7578063547afb871461060a57806356c483e614610618578063595c6a671461062b575f5ffd5b80634657e26a1161029b5780634657e26a146105865780634a10ffe5146105ad5780634b5046ef146105c85780634cfd2939146105db575f5ffd5b80633dff8e7d1461053757806340120dab1461054a5780634177a87c1461056b575f5ffd5b8063261f84e01161032b5780632bab2c4a116103065780632bab2c4a146104dd578063304c10cd146104f057806332a879e4146105035780633635205714610516575f5ffd5b8063261f84e01461046e5780632981eb77146104815780632b453a9a146104bd575f5ffd5b80631352c3e6116103665780631352c3e614610403578063136439dd1461042657806315fe50281461043b578063260dc7581461045b575f5ffd5b80630b156bb61461038c5780630f3df50e146103d057806310e1b9b8146103e3575b5f5ffd5b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6103b36103de36600461442d565b61090f565b6103f66103f1366004614447565b610950565b6040516103c7919061448e565b6104166104113660046144c1565b610995565b60405190151581526020016103c7565b6104396104343660046144f5565b610a10565b005b61044e61044936600461450c565b610a4a565b6040516103c7919061458a565b61041661046936600461442d565b610a7a565b61043961047c3660046145dc565b610aa4565b6104a87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103c7565b6104d06104cb3660046146c1565b610ac3565b6040516103c79190614764565b6104d06104eb3660046147c7565b610aee565b6103b36104fe36600461450c565b610b21565b61043961051136600461484b565b610b50565b6105296105243660046148cb565b610b78565b6040516103c792919061491d565b610439610545366004614a13565b610ccd565b61055d610558366004614a5f565b610d49565b6040516103c7929190614aec565b61057961044936600461442d565b6040516103c79190614b10565b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b6105bb6104cb366004614b5b565b6040516103c79190614ba2565b6104396105d636600461484b565b610d7c565b6105e961046936600461442d565b6040519081526020016103c7565b610439610605366004614be2565b610e18565b6105bb6104cb3660046145dc565b610439610626366004614c40565b610eec565b610439610fdb565b610416610641366004614c6a565b606654600160ff9092169190911b9081161490565b6066546105e9565b61041661066c3660046144c1565b610fef565b6104a87f000000000000000000000000000000000000000000000000000000000000000081565b6104396106a6366004614c8a565b611019565b6106b961066c366004614a5f565b6040516001600160401b0390911681526020016103c7565b6104396106df366004614ccb565b6110af565b6104a87f000000000000000000000000000000000000000000000000000000000000000081565b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b6107406104cb366004614cfc565b6040516103c79190614d3f565b6105bb6104eb366004614d51565b610439610769366004614da8565b61146a565b61043961077c366004614f51565b6118fb565b61043961078f366004614fe1565b611b86565b6104396107a236600461505f565b611c1b565b6104396107b5366004614be2565b611f47565b6107cd6107c836600461450c565b612084565b60408051921515835263ffffffff9091166020830152016103c7565b6105e961046936600461450c565b6105796108053660046144c1565b61211e565b6104396108183660046150a1565b612149565b61043961082b366004614a5f565b612262565b6103b361083e36600461442d565b612372565b61085661085136600461442d565b6123f9565b604080516001600160a01b03909316835263ffffffff9091166020830152016103c7565b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b61041661046936600461450c565b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b6104166108e436600461442d565b612429565b6104396108f73660046144f5565b612448565b61043961090a3660046144f5565b6124b5565b5f5f60a65f61091d856125c6565b815260208101919091526040015f20546001600160a01b0316905080156109445780610949565b620e16e45b9392505050565b604080516060810182525f80825260208201819052918101919091526109497f0000000000000000000000000000000000000000000000000000000000000000612629565b6001600160a01b0382165f908152609e602052604081208190816109b8856125c6565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff1692820192909252915080610a065750806020015163ffffffff164311155b9150505b92915050565b610a1861263a565b6066548181168114610a3d5760405163c61dca5d60e01b815260040160405180910390fd5b610a46826126dd565b5050565b6060610a757f0000000000000000000000000000000000000000000000000000000000000000612629565b919050565b5f610a757f0000000000000000000000000000000000000000000000000000000000000000612629565b82610aae8161271a565b610abd84610545858588612743565b50505050565b60606109497f0000000000000000000000000000000000000000000000000000000000000000612629565b6060610b197f0000000000000000000000000000000000000000000000000000000000000000612629565b949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610b495780610949565b5090919050565b84610b5a8161271a565b610b7086610b6987878a612743565b8585612149565b505050505050565b5f60606001610b86816128ba565b5f6040518060400160405280876001600160a01b03168152602001866020016020810190610bb49190615100565b63ffffffff1690529050610bcb6060860186615119565b9050610bda6040870187615119565b905014610bfa576040516343714afd60e01b815260040160405180910390fd5b60208082015182516001600160a01b03165f90815260989092526040909120610c2c9163ffffffff908116906128e516565b610c4957604051631fb1705560e21b815260040160405180910390fd5b610c5f610c59602087018761450c565b82610995565b610c7c5760405163ebbff49760e01b815260040160405180910390fd5b610c8581612372565b6001600160a01b0316336001600160a01b031614610cb6576040516348f5c3ed60e01b815260040160405180910390fd5b610cc085826128fc565b9350935050509250929050565b81610cd78161271a565b6001600160a01b0383165f90815260a4602052604090205460ff16610d0f576040516348f7dbb960e01b815260040160405180910390fd5b5f5b8251811015610abd57610d4184848381518110610d3057610d3061515e565b6020026020010151620e16e4613057565b600101610d11565b606080610d757f0000000000000000000000000000000000000000000000000000000000000000612629565b9250929050565b5f610d86816128ba565b838214610da6576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015610e0f57610e0787878784818110610dc657610dc661515e565b9050602002016020810190610ddb919061450c565b868685818110610ded57610ded61515e565b9050602002016020810190610e029190615172565b6131c9565b600101610da8565b50505050505050565b83610e228161271a565b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192610e6192916128e516565b610e7e57604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610e0f57610ee482868684818110610e9e57610e9e61515e565b9050602002016020810190610eb3919061450c565b610edf60405180604001604052808c6001600160a01b031681526020018b63ffffffff16815250612429565b6132cd565b600101610e80565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610fcb57610f268361271a565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610f8a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fae9190615193565b610fcb5760405163ccea9e6f60e01b815260040160405180910390fd5b610fd68383836133ad565b505050565b610fe361263a565b610fed5f196126dd565b565b5f610a0a7f0000000000000000000000000000000000000000000000000000000000000000612629565b81516110248161271a565b60208084015184516001600160a01b03165f908152609890925260409091206110569163ffffffff908116906128e516565b61107357604051631fb1705560e21b815260040160405180910390fd5b5f61107d84612372565b6001600160a01b0316036110a45760405163255b0f4160e01b815260040160405180910390fd5b610fd683835f613589565b60026110ba816128ba565b6110cf6110ca602084018461450c565b61378a565b806110e857506110e86110ca604084016020850161450c565b611105576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b6111146040840184615119565b90508110156113d6575f604051806040016040528085602001602081019061113c919061450c565b6001600160a01b031681526020016111576040870187615119565b858181106111675761116761515e565b905060200201602081019061117c9190615100565b63ffffffff1681525090506111c9816020015163ffffffff1660985f8760200160208101906111ab919061450c565b6001600160a01b0316815260208101919091526040015f20906128e5565b6111e657604051631fb1705560e21b815260040160405180910390fd5b609e5f6111f6602087018761450c565b6001600160a01b03166001600160a01b031681526020019081526020015f205f61121f836125c6565b815260208101919091526040015f205460ff1661124f576040516325131d4f60e01b815260040160405180910390fd5b61128961125b826125c6565b609c5f61126b602089018961450c565b6001600160a01b0316815260208101919091526040015f2090613833565b506112c161129a602086018661450c565b609a5f6112a6856125c6565b81526020019081526020015f2061383e90919063ffffffff16565b506112cf602085018561450c565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe8260405161130791906151b2565b60405180910390a2604080518082019091525f81526020810161134a7f0000000000000000000000000000000000000000000000000000000000000000436151d4565b63ffffffff169052609e5f611362602088018861450c565b6001600160a01b03166001600160a01b031681526020019081526020015f205f61138b846125c6565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101611107565b506113ea6104fe604084016020850161450c565b6001600160a01b031663303ca956611405602085018561450c565b611415604086016020870161450c565b6114226040870187615119565b6040518563ffffffff1660e01b81526004016114419493929190615229565b5f604051808303815f87803b158015611458575f5ffd5b505af1158015610b70573d5f5f3e3d5ffd5b5f611474816128ba565b61147d8361271a565b5f5f5f61148986612084565b91509150816114ab5760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b83518110156118f4578381815181106114cc576114cc61515e565b602002602001015160400151518482815181106114eb576114eb61515e565b6020026020010151602001515114611516576040516343714afd60e01b815260040160405180910390fd5b5f8482815181106115295761152961515e565b602090810291909101810151518082015181516001600160a01b03165f908152609890935260409092209092506115699163ffffffff908116906128e516565b61158657604051631fb1705560e21b815260040160405180910390fd5b5f6115918783610995565b90505f5b8684815181106115a7576115a761515e565b602002602001015160200151518110156118e9575f8785815181106115ce576115ce61515e565b60200260200101516020015182815181106115eb576115eb61515e565b60200260200101519050611602898261ffff6131c9565b5f5f6116178b611611886125c6565b85613852565b91509150806040015163ffffffff165f1461164557604051630d8fcbe360e41b815260040160405180910390fd5b5f611652878584896139be565b9050611697825f01518c8a8151811061166d5761166d61515e565b602002602001015160400151878151811061168a5761168a61515e565b60200260200101516139f6565b600f0b602083018190525f036116c057604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b1215611804578015611786576117416116e1886125c6565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b61176b7f0000000000000000000000000000000000000000000000000000000000000000436151d4565b6117769060016151d4565b63ffffffff166040830152611871565b61179883602001518360200151613a0d565b6001600160401b031660208401528a518b90899081106117ba576117ba61515e565b60200260200101516040015185815181106117d7576117d761515e565b6020908102919091018101516001600160401b031683525f9083015263ffffffff43166040830152611871565b5f8260200151600f0b13156118715761182583602001518360200151613a0d565b6001600160401b03908116602085018190528451909116101561185b57604051636c9be0bf60e01b815260040160405180910390fd5b61186589436151d4565b63ffffffff1660408301525b6118868c61187e896125c6565b868686613a2c565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c88866118bb865f01518760200151613a0d565b86604001516040516118d1959493929190615255565b60405180910390a15050600190920191506115959050565b5050506001016114b1565b5050505050565b5f5b8151811015610a465761197a82828151811061191b5761191b61515e565b60200260200101516020015163ffffffff1660985f8585815181106119425761194261515e565b60200260200101515f01516001600160a01b03166001600160a01b031681526020019081526020015f206128e590919063ffffffff16565b15611b7e575f6001600160a01b03166119ab83838151811061199e5761199e61515e565b6020026020010151612372565b6001600160a01b031603611b7e575f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fddbdefd8484815181106119fb576119fb61515e565b6020908102919091010151516040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152633635205760e01b60448201526064015f60405180830381865afa158015611a5b573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a8291908101906152a6565b90505f81515f1480611abe57505f6001600160a01b0316825f81518110611aab57611aab61515e565b60200260200101516001600160a01b0316145b15611ae757838381518110611ad557611ad561515e565b60200260200101515f01519050611b04565b815f81518110611af957611af961515e565b602002602001015190505b611b29848481518110611b1957611b1961515e565b6020026020010151826001613589565b7ff0c8fc7d71f647bd3a88ac369112517f6a4b8038e71913f2d20f71f877dfc725848481518110611b5c57611b5c61515e565b602002602001015182604051611b73929190615335565b60405180910390a150505b6001016118fd565b82611b908161271a565b6001600160a01b0384165f90815260a4602052604090205460ff16611bd2576001600160a01b0384165f90815260a460205260409020805460ff191660011790555b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138484604051611c0d929190615383565b60405180910390a250505050565b6002611c26816128ba565b82611c308161271a565b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611c94573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb89190615193565b611cd55760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b611ce46020850185615119565b9050811015611eac57604080518082019091525f9080611d07602088018861450c565b6001600160a01b03168152602001868060200190611d259190615119565b85818110611d3557611d3561515e565b9050602002016020810190611d4a9190615100565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350611d869291908116906128e516565b611da357604051631fb1705560e21b815260040160405180910390fd5b611dad8682610995565b15611dcb57604051636c6c6e2760e11b815260040160405180910390fd5b611df4611dd7826125c6565b6001600160a01b0388165f908152609c6020526040902090613c64565b50611e2086609a5f611e05856125c6565b81526020019081526020015f20613c6f90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e82604051611e5a91906151b2565b60405180910390a26001600160a01b0386165f908152609e60205260408120600191611e85846125c6565b815260208101919091526040015f20805460ff191691151591909117905550600101611cd7565b50611ebd6104fe602085018561450c565b6001600160a01b031663c63fd50285611ed9602087018761450c565b611ee66020880188615119565b611ef360408a018a615396565b6040518763ffffffff1660e01b8152600401611f14969594939291906153d8565b5f604051808303815f87803b158015611f2b575f5ffd5b505af1158015611f3d573d5f5f3e3d5ffd5b5050505050505050565b83611f518161271a565b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192611f9092916128e516565b611fad57604051631fb1705560e21b815260040160405180910390fd5b5f611fb7826125c6565b90505f5b84811015611f3d57612000868683818110611fd857611fd861515e565b9050602002016020810190611fed919061450c565b5f8481526099602052604090209061383e565b61201d576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee838787848181106120515761205161515e565b9050602002016020810190612066919061450c565b604051612074929190615335565b60405180910390a1600101611fbb565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b9091041660608201819052849391929190158015906121055750826060015163ffffffff164310155b15612114575050604081015160015b9590945092505050565b6060610a0a7f0000000000000000000000000000000000000000000000000000000000000000612629565b836121538161271a565b83518214612174576040516343714afd60e01b815260040160405180910390fd5b6001600160a01b0385165f90815260a4602052604090205460ff166121ac576040516348f7dbb960e01b815260040160405180910390fd5b5f5b8451811015610b70575f8484838181106121ca576121ca61515e565b90506020020160208101906121df919061450c565b90506001600160a01b038116612208576040516339b190bb60e11b815260040160405180910390fd5b620e16e3196001600160a01b03821601612235576040516364be1a3f60e11b815260040160405180910390fd5b6122598787848151811061224b5761224b61515e565b602002602001015183613057565b506001016121ae565b8161226c8161271a565b60405163b526578760e01b81526001600160a01b03848116600483015283169063b526578790602401602060405180830381865afa1580156122b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d49190615193565b6122f157604051631d0b13c160e31b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf858361234981610b21565b604080516001600160a01b039384168152929091166020830152015b60405180910390a1505050565b5f5f60a75f612380856125c6565b815260208082019290925260409081015f20815160608101835281546001600160a01b0390811680835260019093015490811694820194909452600160a01b90930463ffffffff16918301829052919250158015906123e95750816040015163ffffffff164310155b1561094957506020015192915050565b5f5f6124247f0000000000000000000000000000000000000000000000000000000000000000612629565b915091565b5f620e16e46124378361090f565b6001600160a01b0316141592915050565b612450613c83565b606654801982198116146124775760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f54610100900460ff16158080156124d357505f54600160ff909116105b806124ec5750303b1580156124ec57505f5460ff166001145b6125545760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612575575f805461ff0019166101001790555b61257e826126dd565b8015610a46575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b5f815f0151826020015163ffffffff1660405160200161261192919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b604051602081830303815290604052610a0a90615424565b613d3480610fd68363ffffffff8316565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561269c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c09190615193565b610fed57604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6127238161378a565b6127405760405163932d94f760e01b815260040160405180910390fd5b50565b60605f836001600160401b0381111561275e5761275e61433d565b6040519080825280602002602001820160405280156127c057816020015b6127ad60405180606001604052805f63ffffffff168152602001606081526020015f6001600160a01b031681525090565b81526020019060019003908161277c5790505b5090505f5b848110156128b15760405180606001604052808787848181106127ea576127ea61515e565b90506020028101906127fc9190615447565b61280a906020810190615100565b63ffffffff1681526020018787848181106128275761282761515e565b90506020028101906128399190615447565b612847906020810190615119565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152505050908252506001600160a01b038616602090910152825183908390811061289e5761289e61515e565b60209081029190910101526001016127c5565b50949350505050565b606654600160ff83161b908116036127405760405163840a48d560e01b815260040160405180910390fd5b5f8181526001830160205260408120541515610949565b5f60608161290d6040860186615119565b90506001600160401b038111156129265761292661433d565b60405190808252806020026020018201604052801561294f578160200160208202803683370190505b50905061295f6040860186615119565b90506001600160401b038111156129785761297861433d565b6040519080825280602002602001820160405280156129a1578160200160208202803683370190505b50915060a55f6129b0866125c6565b81526020019081526020015f205f81546129c990615465565b918290555092505f5b6129df6040870187615119565b9050811015612fe957801580612a7257506129fd6040870187615119565b612a0860018461547d565b818110612a1757612a1761515e565b9050602002016020810190612a2c919061450c565b6001600160a01b0316612a426040880188615119565b83818110612a5257612a5261515e565b9050602002016020810190612a67919061450c565b6001600160a01b0316115b612a8f57604051639f1c805360e01b815260040160405180910390fd5b612a9c6060870187615119565b82818110612aac57612aac61515e565b905060200201355f108015612aec5750670de0b6b3a7640000612ad26060880188615119565b83818110612ae257612ae261515e565b9050602002013511155b612b0957604051631353603160e01b815260040160405180910390fd5b612b65612b196040880188615119565b83818110612b2957612b2961515e565b9050602002016020810190612b3e919061450c565b60995f612b4a896125c6565b81526020019081526020015f20613d5290919063ffffffff16565b612b82576040516331bc342760e11b815260040160405180910390fd5b5f80612bd4612b9460208a018a61450c565b612b9d896125c6565b612baa60408c018c615119565b87818110612bba57612bba61515e565b9050602002016020810190612bcf919061450c565b613852565b805191935091506001600160401b03165f03612bf1575050612fe1565b5f612c2c612c0260608b018b615119565b86818110612c1257612c1261515e565b85516001600160401b031692602090910201359050613d73565b8351909150612c476001600160401b03808416908316613d89565b868681518110612c5957612c5961515e565b60200260200101818152505081835f01818151612c769190615490565b6001600160401b0316905250835182908590612c93908390615490565b6001600160401b0316905250602084018051839190612cb3908390615490565b6001600160401b031690525060208301515f600f9190910b1215612dcb575f612d16612ce260608d018d615119565b88818110612cf257612cf261515e565b905060200201358560200151612d07906154af565b6001600160801b031690613d73565b9050806001600160401b031684602001818151612d3391906154d3565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd612d6760208d018d61450c565b8b612d7560408f018f615119565b8a818110612d8557612d8561515e565b9050602002016020810190612d9a919061450c565b612dab885f01518960200151613a0d565b8860400151604051612dc1959493929190615255565b60405180910390a1505b612e1d612ddb60208c018c61450c565b612de48b6125c6565b612df160408e018e615119565b89818110612e0157612e0161515e565b9050602002016020810190612e16919061450c565b8787613a2c565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd612e4b60208c018c61450c565b8a612e5960408e018e615119565b89818110612e6957612e6961515e565b9050602002016020810190612e7e919061450c565b8651604051612e9294939291904390615255565b60405180910390a1612ee3612eaa60208c018c61450c565b612eb760408d018d615119565b88818110612ec757612ec761515e565b9050602002016020810190612edc919061450c565b8651613d9d565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635ae679a7612f1f60208d018d61450c565b8b8b8e8060400190612f319190615119565b8b818110612f4157612f4161515e565b9050602002016020810190612f56919061450c565b89516040516001600160e01b031960e088901b168152612f7e95949392918991600401615500565b6020604051808303815f875af1158015612f9a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fbe9190615553565b878681518110612fd057612fd061515e565b602002602001018181525050505050505b6001016129d2565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe5613018602087018761450c565b856130266040890189615119565b8561303460808c018c615396565b604051613047979695949392919061556a565b60405180910390a1509250929050565b6040805180820182526001600160a01b038516808252845163ffffffff90811660208085018290525f938452609890529390912091926130989291613c6416565b6130b557604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c816040516130e491906151b2565b60405180910390a16001600160a01b038216620e16e414801590613179578260a65f61310f856125c6565b81526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055507f90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e8284604051613170929190615335565b60405180910390a15b5f5b8460200151518110156131b8576131b083866020015183815181106131a2576131a261515e565b6020026020010151846132cd565b60010161317b565b506118f48285604001516001613589565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f8111801561321357508261ffff1682105b156118f4576001600160a01b038086165f90815260a360209081526040808320938816835292905290812061324790613e1f565b90505f5f613256888489613852565b91509150806040015163ffffffff16431015613274575050506118f4565b6132818884898585613a2c565b6001600160a01b038089165f90815260a360209081526040808320938b168352929052206132ae90613e71565b506132b885615465565b94506132c384615600565b9350505050613201565b801561334f576001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01480159061333257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b61334f57604051632711b74d60e11b815260040160405180910390fd5b61335f8260995f611e05876125c6565b61337c5760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b8383604051612365929190615335565b6001600160a01b0383165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b9092041660608201819052158015906134295750806060015163ffffffff164310155b1561344357604081015163ffffffff168152600160208201525b63ffffffff8316604082015281156134725763ffffffff808416825260016020830152431660608201526134b3565b61349c7f0000000000000000000000000000000000000000000000000000000000000000436151d4565b6134a79060016151d4565b63ffffffff1660608201525b6001600160a01b0384165f818152609b60209081526040918290208451815486840151878601516060808a015163ffffffff95861664ffffffffff1990951694909417600160201b93151593909302929092176cffffffffffffffff0000000000191665010000000000918516919091026cffffffff000000000000000000191617600160481b92841692830217909355845195865290881692850192909252918301527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db91015b60405180910390a150505050565b6001600160a01b0382166135b0576040516339b190bb60e11b815260040160405180910390fd5b5f60a75f6135bd866125c6565b815260208082019290925260409081015f20815160608101835281546001600160a01b03908116825260019092015491821693810193909352600160a01b900463ffffffff16908201819052909150158015906136245750806040015163ffffffff164310155b1561363a5760208101516001600160a01b031681525b80602001516001600160a01b0316836001600160a01b03161480156136685750806040015163ffffffff1643105b156136735750505050565b6001600160a01b038316602082015281156136a5576001600160a01b038316815263ffffffff431660408201526136e6565b6136cf7f0000000000000000000000000000000000000000000000000000000000000000436151d4565b6136da9060016151d4565b63ffffffff1660408201525b8060a75f6136f3876125c6565b815260208082019290925260409081015f20835181546001600160a01b039182166001600160a01b031990911617825592840151600190910180549483015163ffffffff16600160a01b026001600160c01b031990951691909316179290921790558181015190517f3873f29d7a65a4d75f5ba28909172f486216a1420e77c3c2720815951a6b4f579161357b9187918791615615565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb890608401602060405180830381865afa15801561380f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0a9190615193565b5f6109498383613eee565b5f610949836001600160a01b038416613eee565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906138b290613fd1565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156139545790925090506139b6565b613965815f01518260200151613a0d565b6001600160401b0316815260208101515f600f9190910b12156139a35761399482602001518260200151613a0d565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b5f6139cf8460995f612b4a896125c6565b80156139d85750815b80156139ed575082516001600160401b031615155b95945050505050565b5f6109496001600160401b03808516908416615648565b5f610949613a24836001600160401b0386166154d3565b600f0b613fe4565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b03908116911614613af257602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b15613bd4576001600160a01b0385165f908152609f602090815260408083208784529091529020613bac9084613c6f565b506001600160a01b0385165f908152609d60205260409020613bce9085613c64565b506118f4565b80516001600160401b03165f036118f4576001600160a01b0385165f908152609f602090815260408083208784529091529020613c11908461383e565b506001600160a01b0385165f908152609f602090815260408083208784529091529020613c3d9061404f565b5f036118f4576001600160a01b0385165f908152609d60205260409020610b709085613833565b5f6109498383614058565b5f610949836001600160a01b038416614058565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613cdf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d039190615675565b6001600160a01b0316336001600160a01b031614610fed5760405163794821ff60e01b815260040160405180910390fd5b365f5f375f5f365f845af43d5f5f3e808015613d4e573d5ff35b3d5ffd5b6001600160a01b0381165f9081526001830160205260408120541515610949565b5f6109498383670de0b6b3a764000060016140a4565b5f61094983670de0b6b3a7640000846140fd565b6001600160a01b038084165f90815260a160209081526040808320938616835292905220613dcc9043836141e2565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c90606001612365565b5f613e398254600f81810b600160801b909204900b131590565b15613e5757604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f613e8b8254600f81810b600160801b909204900b131590565b15613ea957604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f8181526001830160205260408120548015613fc8575f613f1060018361547d565b85549091505f90613f239060019061547d565b9050818114613f82575f865f018281548110613f4157613f4161515e565b905f5260205f200154905080875f018481548110613f6157613f6161515e565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613f9357613f93615690565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610a0a565b5f915050610a0a565b5f610a0a82670de0b6b3a76400006141f6565b5f6001600160401b0382111561404b5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b606482015260840161254b565b5090565b5f610a0a825490565b5f81815260018301602052604081205461409d57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610a0a565b505f610a0a565b5f5f6140b18686866140fd565b905060018360028111156140c7576140c76156a4565b1480156140e357505f84806140de576140de6156b8565b868809115b156139ed576140f36001826156cc565b9695505050505050565b5f80805f19858709858702925082811083820303915050805f036141345783828161412a5761412a6156b8565b0492505050610949565b80841161417b5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b604482015260640161254b565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b610fd683836001600160401b03841661423a565b81545f9080156142325761421c8461420f60018461547d565b5f91825260209091200190565b54600160201b90046001600160e01b0316610a06565b509092915050565b825480156142f0575f6142528561420f60018561547d565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b0316602084015291925090851610156142a45760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036142ee57826142c58661420f60018661547d565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156143735761437361433d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156143a1576143a161433d565b604052919050565b6001600160a01b0381168114612740575f5ffd5b803563ffffffff81168114610a75575f5ffd5b5f604082840312156143e0575f5ffd5b604080519081016001600160401b03811182821017156144025761440261433d565b6040529050808235614413816143a9565b8152614421602084016143bd565b60208201525092915050565b5f6040828403121561443d575f5ffd5b61094983836143d0565b5f5f5f60808486031215614459575f5ffd5b8335614464816143a9565b925061447385602086016143d0565b91506060840135614483816143a9565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff169082015260608101610a0a565b5f5f606083850312156144d2575f5ffd5b82356144dd816143a9565b91506144ec84602085016143d0565b90509250929050565b5f60208284031215614505575f5ffd5b5035919050565b5f6020828403121561451c575f5ffd5b8135610949816143a9565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b828110156145805761456a868351614527565b6040959095019460209190910190600101614557565b5093949350505050565b602081525f6109496020830184614545565b5f5f83601f8401126145ac575f5ffd5b5081356001600160401b038111156145c2575f5ffd5b6020830191508360208260051b8501011115610d75575f5ffd5b5f5f5f604084860312156145ee575f5ffd5b83356145f9816143a9565b925060208401356001600160401b03811115614613575f5ffd5b61461f8682870161459c565b9497909650939450505050565b5f6001600160401b038211156146445761464461433d565b5060051b60200190565b5f82601f83011261465d575f5ffd5b813561467061466b8261462c565b614379565b8082825260208201915060208360051b860101925085831115614691575f5ffd5b602085015b838110156146b75780356146a9816143a9565b835260209283019201614696565b5095945050505050565b5f5f5f608084860312156146d3575f5ffd5b6146dd85856143d0565b925060408401356001600160401b038111156146f7575f5ffd5b6147038682870161464e565b92505060608401356001600160401b0381111561471e575f5ffd5b61472a8682870161464e565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614580578151865260209586019590910190600101614746565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156147bb57603f198786030184526147a6858351614734565b9450602093840193919091019060010161478a565b50929695505050505050565b5f5f5f5f60a085870312156147da575f5ffd5b6147e486866143d0565b935060408501356001600160401b038111156147fe575f5ffd5b61480a8782880161464e565b93505060608501356001600160401b03811115614825575f5ffd5b6148318782880161464e565b925050614840608086016143bd565b905092959194509250565b5f5f5f5f5f6060868803121561485f575f5ffd5b853561486a816143a9565b945060208601356001600160401b03811115614884575f5ffd5b6148908882890161459c565b90955093505060408601356001600160401b038111156148ae575f5ffd5b6148ba8882890161459c565b969995985093965092949392505050565b5f5f604083850312156148dc575f5ffd5b82356148e7816143a9565b915060208301356001600160401b03811115614901575f5ffd5b830160a08186031215614912575f5ffd5b809150509250929050565b828152604060208201525f610b196040830184614734565b5f82601f830112614944575f5ffd5b813561495261466b8261462c565b8082825260208201915060208360051b860101925085831115614973575f5ffd5b602085015b838110156146b75780356001600160401b03811115614995575f5ffd5b86016060818903601f190112156149aa575f5ffd5b6149b2614351565b6149be602083016143bd565b815260408201356001600160401b038111156149d8575f5ffd5b6149e78a60208386010161464e565b602083015250606082013591506149fd826143a9565b6040810191909152835260209283019201614978565b5f5f60408385031215614a24575f5ffd5b8235614a2f816143a9565b915060208301356001600160401b03811115614a49575f5ffd5b614a5585828601614935565b9150509250929050565b5f5f60408385031215614a70575f5ffd5b8235614a7b816143a9565b91506020830135614912816143a9565b5f8151808452602084019350602083015f5b8281101561458057614ad686835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101614a9d565b604081525f614afe6040830185614545565b82810360208401526139ed8185614a8b565b602080825282518282018190525f918401906040840190835b81811015614b505783516001600160a01b0316835260209384019390920191600101614b29565b509095945050505050565b5f5f5f60408486031215614b6d575f5ffd5b83356001600160401b03811115614b82575f5ffd5b614b8e8682870161459c565b9094509250506020840135614483816143a9565b602080825282518282018190525f918401906040840190835b81811015614b505783516001600160401b0316835260209384019390920191600101614bbb565b5f5f5f5f60608587031215614bf5575f5ffd5b8435614c00816143a9565b9350614c0e602086016143bd565b925060408501356001600160401b03811115614c28575f5ffd5b614c348782880161459c565b95989497509550505050565b5f5f60408385031215614c51575f5ffd5b8235614c5c816143a9565b91506144ec602084016143bd565b5f60208284031215614c7a575f5ffd5b813560ff81168114610949575f5ffd5b5f5f60608385031215614c9b575f5ffd5b614ca584846143d0565b91506040830135614912816143a9565b5f60608284031215614cc5575f5ffd5b50919050565b5f60208284031215614cdb575f5ffd5b81356001600160401b03811115614cf0575f5ffd5b610a0684828501614cb5565b5f5f5f60808486031215614d0e575f5ffd5b83356001600160401b03811115614d23575f5ffd5b614d2f8682870161464e565b93505061447385602086016143d0565b602081525f6109496020830184614a8b565b5f5f5f5f60608587031215614d64575f5ffd5b8435614d6f816143a9565b935060208501356001600160401b03811115614d89575f5ffd5b614d958782880161459c565b90945092506148409050604086016143bd565b5f5f60408385031215614db9575f5ffd5b8235614dc4816143a9565b915060208301356001600160401b03811115614dde575f5ffd5b8301601f81018513614dee575f5ffd5b8035614dfc61466b8261462c565b8082825260208201915060208360051b850101925087831115614e1d575f5ffd5b602084015b83811015614f425780356001600160401b03811115614e3f575f5ffd5b85016080818b03601f19011215614e54575f5ffd5b614e5c614351565b614e698b602084016143d0565b815260608201356001600160401b03811115614e83575f5ffd5b614e928c60208386010161464e565b60208301525060808201356001600160401b03811115614eb0575f5ffd5b6020818401019250508a601f830112614ec7575f5ffd5b8135614ed561466b8261462c565b8082825260208201915060208360051b86010192508d831115614ef6575f5ffd5b6020850194505b82851015614f2c5784356001600160401b0381168114614f1b575f5ffd5b825260209485019490910190614efd565b6040840152505084525060209283019201614e22565b50809450505050509250929050565b5f60208284031215614f61575f5ffd5b81356001600160401b03811115614f76575f5ffd5b8201601f81018413614f86575f5ffd5b8035614f9461466b8261462c565b8082825260208201915060208360061b850101925086831115614fb5575f5ffd5b6020840193505b828410156140f357614fce87856143d0565b8252602082019150604084019350614fbc565b5f5f5f60408486031215614ff3575f5ffd5b8335614ffe816143a9565b925060208401356001600160401b03811115615018575f5ffd5b8401601f81018613615028575f5ffd5b80356001600160401b0381111561503d575f5ffd5b86602082840101111561504e575f5ffd5b939660209190910195509293505050565b5f5f60408385031215615070575f5ffd5b823561507b816143a9565b915060208301356001600160401b03811115615095575f5ffd5b614a5585828601614cb5565b5f5f5f5f606085870312156150b4575f5ffd5b84356150bf816143a9565b935060208501356001600160401b038111156150d9575f5ffd5b6150e587828801614935565b93505060408501356001600160401b03811115614c28575f5ffd5b5f60208284031215615110575f5ffd5b610949826143bd565b5f5f8335601e1984360301811261512e575f5ffd5b8301803591506001600160401b03821115615147575f5ffd5b6020019150600581901b3603821315610d75575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215615182575f5ffd5b813561ffff81168114610949575f5ffd5b5f602082840312156151a3575f5ffd5b81518015158114610949575f5ffd5b60408101610a0a8284614527565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115610a0a57610a0a6151c0565b8183526020830192505f815f5b848110156145805763ffffffff615213836143bd565b16865260209586019591909101906001016151fd565b6001600160a01b038581168252841660208201526060604082018190525f906140f390830184866151f0565b6001600160a01b038616815260c081016152726020830187614527565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b5f602082840312156152b6575f5ffd5b81516001600160401b038111156152cb575f5ffd5b8201601f810184136152db575f5ffd5b80516152e961466b8261462c565b8082825260208201915060208360051b85010192508683111561530a575f5ffd5b6020840193505b828410156140f3578351615324816143a9565b825260209384019390910190615311565b606081016153438285614527565b6001600160a01b039290921660409190910152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610b1960208301848661535b565b5f5f8335601e198436030181126153ab575f5ffd5b8301803591506001600160401b038211156153c4575f5ffd5b602001915036819003821315610d75575f5ffd5b6001600160a01b038781168252861660208201526080604082018190525f9061540490830186886151f0565b828103606084015261541781858761535b565b9998505050505050505050565b80516020808301519190811015614cc5575f1960209190910360031b1b16919050565b5f8235603e1983360301811261545b575f5ffd5b9190910192915050565b5f60018201615476576154766151c0565b5060010190565b81810381811115610a0a57610a0a6151c0565b6001600160401b038281168282160390811115610a0a57610a0a6151c0565b5f81600f0b60016001607f1b031981036154cb576154cb6151c0565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b031982121715610a0a57610a0a6151c0565b6001600160a01b038716815260e0810161551d6020830188614527565b60608201959095526001600160a01b039390931660808401526001600160401b0391821660a08401521660c09091015292915050565b5f60208284031215615563575f5ffd5b5051919050565b6001600160a01b03881681525f60c08201615588602084018a614527565b60c060608401528690528660e083015f5b888110156155c95782356155ac816143a9565b6001600160a01b0316825260209283019290910190600101615599565b5083810360808501526155dc8188614734565b91505082810360a08401526155f281858761535b565b9a9950505050505050505050565b5f8161560e5761560e6151c0565b505f190190565b608081016156238286614527565b6001600160a01b0393909316604082015263ffffffff91909116606090910152919050565b600f82810b9082900b0360016001607f1b0319811260016001607f1b0382131715610a0a57610a0a6151c0565b5f60208284031215615685575f5ffd5b8151610949816143a9565b634e487b7160e01b5f52603160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b80820180821115610a0a57610a0a6151c056fea26469706673582212201718e832fb5ab045e193ee493fb8713607c22b0ff8d8e6ed0425a08e7eb7912d64736f6c634300081e0033",
+ Bin: "0x610180604052348015610010575f5ffd5b50604051615a31380380615a3183398101604081905261002f91610198565b868387878585896001600160a01b03811661005d576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05263ffffffff90811660e05216610100819052610120529081166101405216610160526100a16100ad565b50505050505050610227565b5f54610100900460ff16156101185760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610167575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461017d575f5ffd5b50565b805163ffffffff81168114610193575f5ffd5b919050565b5f5f5f5f5f5f5f60e0888a0312156101ae575f5ffd5b87516101b981610169565b60208901519097506101ca81610169565b60408901519096506101db81610169565b60608901519095506101ec81610169565b60808901519094506101fd81610169565b925061020b60a08901610180565b915061021960c08901610180565b905092959891949750929550565b60805160a05160c05160e0516101005161012051610140516101605161571561031c5f395f81816103910152818161097101528181610a5101528181610a8001528181610aca01528181610af501528181610d5101528181610ff501528181612125015261240001525f818161058b015281816119bc01526137c801525f818161067601526136aa01525f81816106e9015261347701525f818161048601528181611325015261174601525f818161087f01526132fd01525f81816108b401528181610ef701528181610f4501528181611c4f0152612eed01525f81816107100152818161264f0152613c8501526157155ff3fe608060405234801561000f575f5ffd5b5060043610610388575f3560e01c80636c9d7c58116101df578063b66bd98911610109578063d7794857116100a9578063f231bd0811610079578063f231bd08146108d6578063f605ce08146106ab578063fabc1cbc146108e9578063fe4b84df146108fc575f5ffd5b8063d779485714610843578063db4df7611461087a578063dc2af692146108a1578063df5cf723146108af575f5ffd5b8063c221d8ae116100e4578063c221d8ae146107f7578063d1a83f541461080a578063d3d96ff41461081d578063d4a3fcce14610830575f5ffd5b8063b66bd989146107a7578063b9fbaed1146107ba578063ba1a84e5146107e9575f5ffd5b80638ce648541161017f578063a9333ec81161014f578063a9333ec8146106ab578063a982182114610781578063adc2e3d914610794578063b2447af7146105db575f5ffd5b80638ce648541461073257806394d7d00c1461074d578063952899ee1461075b578063957dc50b1461076e575f5ffd5b80636e875dba116101ba5780636e875dba1461056b57806379ae50cd1461043b5780637bc1ef61146106e4578063886f11951461070b575f5ffd5b80636c9d7c58146106985780636cfb4481146106ab5780636e3492b5146106d1575f5ffd5b80633dff8e7d116102c057806350feea20116102605780635ac86ab7116102305780635ac86ab7146106335780635c975abb14610656578063670d3ba21461065e57806367aeaa5314610671575f5ffd5b806350feea20146105f7578063547afb871461060a57806356c483e614610618578063595c6a671461062b575f5ffd5b80634657e26a1161029b5780634657e26a146105865780634a10ffe5146105ad5780634b5046ef146105c85780634cfd2939146105db575f5ffd5b80633dff8e7d1461053757806340120dab1461054a5780634177a87c1461056b575f5ffd5b8063261f84e01161032b5780632bab2c4a116103065780632bab2c4a146104dd578063304c10cd146104f057806332a879e4146105035780633635205714610516575f5ffd5b8063261f84e01461046e5780632981eb77146104815780632b453a9a146104bd575f5ffd5b80631352c3e6116103665780631352c3e614610403578063136439dd1461042657806315fe50281461043b578063260dc7581461045b575f5ffd5b80630b156bb61461038c5780630f3df50e146103d057806310e1b9b8146103e3575b5f5ffd5b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6103b36103de36600461442d565b61090f565b6103f66103f1366004614447565b610950565b6040516103c7919061448e565b6104166104113660046144c1565b610995565b60405190151581526020016103c7565b6104396104343660046144f5565b610a10565b005b61044e61044936600461450c565b610a4a565b6040516103c7919061458a565b61041661046936600461442d565b610a7a565b61043961047c3660046145dc565b610aa4565b6104a87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103c7565b6104d06104cb3660046146c1565b610ac3565b6040516103c79190614764565b6104d06104eb3660046147c7565b610aee565b6103b36104fe36600461450c565b610b21565b61043961051136600461484b565b610b50565b6105296105243660046148cb565b610b78565b6040516103c792919061491d565b610439610545366004614a13565b610ccd565b61055d610558366004614a5f565b610d49565b6040516103c7929190614aec565b61057961044936600461442d565b6040516103c79190614b10565b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b6105bb6104cb366004614b5b565b6040516103c79190614ba2565b6104396105d636600461484b565b610d7c565b6105e961046936600461442d565b6040519081526020016103c7565b610439610605366004614be2565b610e18565b6105bb6104cb3660046145dc565b610439610626366004614c40565b610eec565b610439610fdb565b610416610641366004614c6a565b606654600160ff9092169190911b9081161490565b6066546105e9565b61041661066c3660046144c1565b610fef565b6104a87f000000000000000000000000000000000000000000000000000000000000000081565b6104396106a6366004614c8a565b611019565b6106b961066c366004614a5f565b6040516001600160401b0390911681526020016103c7565b6104396106df366004614ccb565b6110af565b6104a87f000000000000000000000000000000000000000000000000000000000000000081565b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b6107406104cb366004614cfc565b6040516103c79190614d3f565b6105bb6104eb366004614d51565b610439610769366004614da8565b61146a565b61043961077c366004614f51565b6118fb565b61043961078f366004614fe1565b611b86565b6104396107a236600461505f565b611c1b565b6104396107b5366004614be2565b611f47565b6107cd6107c836600461450c565b612084565b60408051921515835263ffffffff9091166020830152016103c7565b6105e961046936600461450c565b6105796108053660046144c1565b61211e565b6104396108183660046150a1565b612149565b61043961082b366004614a5f565b612262565b6103b361083e36600461442d565b612372565b61085661085136600461442d565b6123f9565b604080516001600160a01b03909316835263ffffffff9091166020830152016103c7565b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b61041661046936600461450c565b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b6104166108e436600461442d565b612429565b6104396108f73660046144f5565b612448565b61043961090a3660046144f5565b6124b5565b5f5f60a65f61091d856125c6565b815260208101919091526040015f20546001600160a01b0316905080156109445780610949565b620e16e45b9392505050565b604080516060810182525f80825260208201819052918101919091526109497f0000000000000000000000000000000000000000000000000000000000000000612629565b6001600160a01b0382165f908152609e602052604081208190816109b8856125c6565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff1692820192909252915080610a065750806020015163ffffffff164311155b9150505b92915050565b610a1861263a565b6066548181168114610a3d5760405163c61dca5d60e01b815260040160405180910390fd5b610a46826126dd565b5050565b6060610a757f0000000000000000000000000000000000000000000000000000000000000000612629565b919050565b5f610a757f0000000000000000000000000000000000000000000000000000000000000000612629565b82610aae8161271a565b610abd84610545858588612743565b50505050565b60606109497f0000000000000000000000000000000000000000000000000000000000000000612629565b6060610b197f0000000000000000000000000000000000000000000000000000000000000000612629565b949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610b495780610949565b5090919050565b84610b5a8161271a565b610b7086610b6987878a612743565b8585612149565b505050505050565b5f60606001610b86816128ba565b5f6040518060400160405280876001600160a01b03168152602001866020016020810190610bb49190615100565b63ffffffff1690529050610bcb6060860186615119565b9050610bda6040870187615119565b905014610bfa576040516343714afd60e01b815260040160405180910390fd5b60208082015182516001600160a01b03165f90815260989092526040909120610c2c9163ffffffff908116906128e516565b610c4957604051631fb1705560e21b815260040160405180910390fd5b610c5f610c59602087018761450c565b82610995565b610c7c5760405163ebbff49760e01b815260040160405180910390fd5b610c8581612372565b6001600160a01b0316336001600160a01b031614610cb6576040516348f5c3ed60e01b815260040160405180910390fd5b610cc085826128fc565b9350935050509250929050565b81610cd78161271a565b6001600160a01b0383165f90815260a4602052604090205460ff16610d0f576040516348f7dbb960e01b815260040160405180910390fd5b5f5b8251811015610abd57610d4184848381518110610d3057610d3061515e565b6020026020010151620e16e4613057565b600101610d11565b606080610d757f0000000000000000000000000000000000000000000000000000000000000000612629565b9250929050565b5f610d86816128ba565b838214610da6576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015610e0f57610e0787878784818110610dc657610dc661515e565b9050602002016020810190610ddb919061450c565b868685818110610ded57610ded61515e565b9050602002016020810190610e029190615172565b6131c9565b600101610da8565b50505050505050565b83610e228161271a565b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192610e6192916128e516565b610e7e57604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610e0f57610ee482868684818110610e9e57610e9e61515e565b9050602002016020810190610eb3919061450c565b610edf60405180604001604052808c6001600160a01b031681526020018b63ffffffff16815250612429565b6132cd565b600101610e80565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610fcb57610f268361271a565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610f8a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fae9190615193565b610fcb5760405163ccea9e6f60e01b815260040160405180910390fd5b610fd68383836133ad565b505050565b610fe361263a565b610fed5f196126dd565b565b5f610a0a7f0000000000000000000000000000000000000000000000000000000000000000612629565b81516110248161271a565b60208084015184516001600160a01b03165f908152609890925260409091206110569163ffffffff908116906128e516565b61107357604051631fb1705560e21b815260040160405180910390fd5b5f61107d84612372565b6001600160a01b0316036110a45760405163255b0f4160e01b815260040160405180910390fd5b610fd683835f613589565b60026110ba816128ba565b6110cf6110ca602084018461450c565b61378a565b806110e857506110e86110ca604084016020850161450c565b611105576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b6111146040840184615119565b90508110156113d6575f604051806040016040528085602001602081019061113c919061450c565b6001600160a01b031681526020016111576040870187615119565b858181106111675761116761515e565b905060200201602081019061117c9190615100565b63ffffffff1681525090506111c9816020015163ffffffff1660985f8760200160208101906111ab919061450c565b6001600160a01b0316815260208101919091526040015f20906128e5565b6111e657604051631fb1705560e21b815260040160405180910390fd5b609e5f6111f6602087018761450c565b6001600160a01b03166001600160a01b031681526020019081526020015f205f61121f836125c6565b815260208101919091526040015f205460ff1661124f576040516325131d4f60e01b815260040160405180910390fd5b61128961125b826125c6565b609c5f61126b602089018961450c565b6001600160a01b0316815260208101919091526040015f2090613833565b506112c161129a602086018661450c565b609a5f6112a6856125c6565b81526020019081526020015f2061383e90919063ffffffff16565b506112cf602085018561450c565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe8260405161130791906151b2565b60405180910390a2604080518082019091525f81526020810161134a7f0000000000000000000000000000000000000000000000000000000000000000436151d4565b63ffffffff169052609e5f611362602088018861450c565b6001600160a01b03166001600160a01b031681526020019081526020015f205f61138b846125c6565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101611107565b506113ea6104fe604084016020850161450c565b6001600160a01b031663303ca956611405602085018561450c565b611415604086016020870161450c565b6114226040870187615119565b6040518563ffffffff1660e01b81526004016114419493929190615229565b5f604051808303815f87803b158015611458575f5ffd5b505af1158015610b70573d5f5f3e3d5ffd5b5f611474816128ba565b61147d8361271a565b5f5f5f61148986612084565b91509150816114ab5760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b83518110156118f4578381815181106114cc576114cc61515e565b602002602001015160400151518482815181106114eb576114eb61515e565b6020026020010151602001515114611516576040516343714afd60e01b815260040160405180910390fd5b5f8482815181106115295761152961515e565b602090810291909101810151518082015181516001600160a01b03165f908152609890935260409092209092506115699163ffffffff908116906128e516565b61158657604051631fb1705560e21b815260040160405180910390fd5b5f6115918783610995565b90505f5b8684815181106115a7576115a761515e565b602002602001015160200151518110156118e9575f8785815181106115ce576115ce61515e565b60200260200101516020015182815181106115eb576115eb61515e565b60200260200101519050611602898261ffff6131c9565b5f5f6116178b611611886125c6565b85613852565b91509150806040015163ffffffff165f1461164557604051630d8fcbe360e41b815260040160405180910390fd5b5f611652878584896139be565b9050611697825f01518c8a8151811061166d5761166d61515e565b602002602001015160400151878151811061168a5761168a61515e565b60200260200101516139f6565b600f0b602083018190525f036116c057604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b1215611804578015611786576117416116e1886125c6565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b61176b7f0000000000000000000000000000000000000000000000000000000000000000436151d4565b6117769060016151d4565b63ffffffff166040830152611871565b61179883602001518360200151613a0d565b6001600160401b031660208401528a518b90899081106117ba576117ba61515e565b60200260200101516040015185815181106117d7576117d761515e565b6020908102919091018101516001600160401b031683525f9083015263ffffffff43166040830152611871565b5f8260200151600f0b13156118715761182583602001518360200151613a0d565b6001600160401b03908116602085018190528451909116101561185b57604051636c9be0bf60e01b815260040160405180910390fd5b61186589436151d4565b63ffffffff1660408301525b6118868c61187e896125c6565b868686613a2c565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c88866118bb865f01518760200151613a0d565b86604001516040516118d1959493929190615255565b60405180910390a15050600190920191506115959050565b5050506001016114b1565b5050505050565b5f5b8151811015610a465761197a82828151811061191b5761191b61515e565b60200260200101516020015163ffffffff1660985f8585815181106119425761194261515e565b60200260200101515f01516001600160a01b03166001600160a01b031681526020019081526020015f206128e590919063ffffffff16565b15611b7e575f6001600160a01b03166119ab83838151811061199e5761199e61515e565b6020026020010151612372565b6001600160a01b031603611b7e575f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fddbdefd8484815181106119fb576119fb61515e565b6020908102919091010151516040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152633635205760e01b60448201526064015f60405180830381865afa158015611a5b573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a8291908101906152a6565b90505f81515f1480611abe57505f6001600160a01b0316825f81518110611aab57611aab61515e565b60200260200101516001600160a01b0316145b15611ae757838381518110611ad557611ad561515e565b60200260200101515f01519050611b04565b815f81518110611af957611af961515e565b602002602001015190505b611b29848481518110611b1957611b1961515e565b6020026020010151826001613589565b7ff0c8fc7d71f647bd3a88ac369112517f6a4b8038e71913f2d20f71f877dfc725848481518110611b5c57611b5c61515e565b602002602001015182604051611b73929190615335565b60405180910390a150505b6001016118fd565b82611b908161271a565b6001600160a01b0384165f90815260a4602052604090205460ff16611bd2576001600160a01b0384165f90815260a460205260409020805460ff191660011790555b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138484604051611c0d929190615383565b60405180910390a250505050565b6002611c26816128ba565b82611c308161271a565b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611c94573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb89190615193565b611cd55760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b611ce46020850185615119565b9050811015611eac57604080518082019091525f9080611d07602088018861450c565b6001600160a01b03168152602001868060200190611d259190615119565b85818110611d3557611d3561515e565b9050602002016020810190611d4a9190615100565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350611d869291908116906128e516565b611da357604051631fb1705560e21b815260040160405180910390fd5b611dad8682610995565b15611dcb57604051636c6c6e2760e11b815260040160405180910390fd5b611df4611dd7826125c6565b6001600160a01b0388165f908152609c6020526040902090613c64565b50611e2086609a5f611e05856125c6565b81526020019081526020015f20613c6f90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e82604051611e5a91906151b2565b60405180910390a26001600160a01b0386165f908152609e60205260408120600191611e85846125c6565b815260208101919091526040015f20805460ff191691151591909117905550600101611cd7565b50611ebd6104fe602085018561450c565b6001600160a01b031663c63fd50285611ed9602087018761450c565b611ee66020880188615119565b611ef360408a018a615396565b6040518763ffffffff1660e01b8152600401611f14969594939291906153d8565b5f604051808303815f87803b158015611f2b575f5ffd5b505af1158015611f3d573d5f5f3e3d5ffd5b5050505050505050565b83611f518161271a565b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192611f9092916128e516565b611fad57604051631fb1705560e21b815260040160405180910390fd5b5f611fb7826125c6565b90505f5b84811015611f3d57612000868683818110611fd857611fd861515e565b9050602002016020810190611fed919061450c565b5f8481526099602052604090209061383e565b61201d576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee838787848181106120515761205161515e565b9050602002016020810190612066919061450c565b604051612074929190615335565b60405180910390a1600101611fbb565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b9091041660608201819052849391929190158015906121055750826060015163ffffffff164310155b15612114575050604081015160015b9590945092505050565b6060610a0a7f0000000000000000000000000000000000000000000000000000000000000000612629565b836121538161271a565b83518214612174576040516343714afd60e01b815260040160405180910390fd5b6001600160a01b0385165f90815260a4602052604090205460ff166121ac576040516348f7dbb960e01b815260040160405180910390fd5b5f5b8451811015610b70575f8484838181106121ca576121ca61515e565b90506020020160208101906121df919061450c565b90506001600160a01b038116612208576040516339b190bb60e11b815260040160405180910390fd5b620e16e3196001600160a01b03821601612235576040516364be1a3f60e11b815260040160405180910390fd5b6122598787848151811061224b5761224b61515e565b602002602001015183613057565b506001016121ae565b8161226c8161271a565b60405163b526578760e01b81526001600160a01b03848116600483015283169063b526578790602401602060405180830381865afa1580156122b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d49190615193565b6122f157604051631d0b13c160e31b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf858361234981610b21565b604080516001600160a01b039384168152929091166020830152015b60405180910390a1505050565b5f5f60a75f612380856125c6565b815260208082019290925260409081015f20815160608101835281546001600160a01b0390811680835260019093015490811694820194909452600160a01b90930463ffffffff16918301829052919250158015906123e95750816040015163ffffffff164310155b1561094957506020015192915050565b5f5f6124247f0000000000000000000000000000000000000000000000000000000000000000612629565b915091565b5f620e16e46124378361090f565b6001600160a01b0316141592915050565b612450613c83565b606654801982198116146124775760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f54610100900460ff16158080156124d357505f54600160ff909116105b806124ec5750303b1580156124ec57505f5460ff166001145b6125545760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612575575f805461ff0019166101001790555b61257e826126dd565b8015610a46575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b5f815f0151826020015163ffffffff1660405160200161261192919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b604051602081830303815290604052610a0a90615424565b613d3480610fd68363ffffffff8316565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561269c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c09190615193565b610fed57604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6127238161378a565b6127405760405163932d94f760e01b815260040160405180910390fd5b50565b60605f836001600160401b0381111561275e5761275e61433d565b6040519080825280602002602001820160405280156127c057816020015b6127ad60405180606001604052805f63ffffffff168152602001606081526020015f6001600160a01b031681525090565b81526020019060019003908161277c5790505b5090505f5b848110156128b15760405180606001604052808787848181106127ea576127ea61515e565b90506020028101906127fc9190615447565b61280a906020810190615100565b63ffffffff1681526020018787848181106128275761282761515e565b90506020028101906128399190615447565b612847906020810190615119565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152505050908252506001600160a01b038616602090910152825183908390811061289e5761289e61515e565b60209081029190910101526001016127c5565b50949350505050565b606654600160ff83161b908116036127405760405163840a48d560e01b815260040160405180910390fd5b5f8181526001830160205260408120541515610949565b5f60608161290d6040860186615119565b90506001600160401b038111156129265761292661433d565b60405190808252806020026020018201604052801561294f578160200160208202803683370190505b50905061295f6040860186615119565b90506001600160401b038111156129785761297861433d565b6040519080825280602002602001820160405280156129a1578160200160208202803683370190505b50915060a55f6129b0866125c6565b81526020019081526020015f205f81546129c990615465565b918290555092505f5b6129df6040870187615119565b9050811015612fe957801580612a7257506129fd6040870187615119565b612a0860018461547d565b818110612a1757612a1761515e565b9050602002016020810190612a2c919061450c565b6001600160a01b0316612a426040880188615119565b83818110612a5257612a5261515e565b9050602002016020810190612a67919061450c565b6001600160a01b0316115b612a8f57604051639f1c805360e01b815260040160405180910390fd5b612a9c6060870187615119565b82818110612aac57612aac61515e565b905060200201355f108015612aec5750670de0b6b3a7640000612ad26060880188615119565b83818110612ae257612ae261515e565b9050602002013511155b612b0957604051631353603160e01b815260040160405180910390fd5b612b65612b196040880188615119565b83818110612b2957612b2961515e565b9050602002016020810190612b3e919061450c565b60995f612b4a896125c6565b81526020019081526020015f20613d5290919063ffffffff16565b612b82576040516331bc342760e11b815260040160405180910390fd5b5f80612bd4612b9460208a018a61450c565b612b9d896125c6565b612baa60408c018c615119565b87818110612bba57612bba61515e565b9050602002016020810190612bcf919061450c565b613852565b805191935091506001600160401b03165f03612bf1575050612fe1565b5f612c2c612c0260608b018b615119565b86818110612c1257612c1261515e565b85516001600160401b031692602090910201359050613d73565b8351909150612c476001600160401b03808416908316613d89565b868681518110612c5957612c5961515e565b60200260200101818152505081835f01818151612c769190615490565b6001600160401b0316905250835182908590612c93908390615490565b6001600160401b0316905250602084018051839190612cb3908390615490565b6001600160401b031690525060208301515f600f9190910b1215612dcb575f612d16612ce260608d018d615119565b88818110612cf257612cf261515e565b905060200201358560200151612d07906154af565b6001600160801b031690613d73565b9050806001600160401b031684602001818151612d3391906154d3565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd612d6760208d018d61450c565b8b612d7560408f018f615119565b8a818110612d8557612d8561515e565b9050602002016020810190612d9a919061450c565b612dab885f01518960200151613a0d565b8860400151604051612dc1959493929190615255565b60405180910390a1505b612e1d612ddb60208c018c61450c565b612de48b6125c6565b612df160408e018e615119565b89818110612e0157612e0161515e565b9050602002016020810190612e16919061450c565b8787613a2c565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd612e4b60208c018c61450c565b8a612e5960408e018e615119565b89818110612e6957612e6961515e565b9050602002016020810190612e7e919061450c565b8651604051612e9294939291904390615255565b60405180910390a1612ee3612eaa60208c018c61450c565b612eb760408d018d615119565b88818110612ec757612ec761515e565b9050602002016020810190612edc919061450c565b8651613d9d565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635ae679a7612f1f60208d018d61450c565b8b8b8e8060400190612f319190615119565b8b818110612f4157612f4161515e565b9050602002016020810190612f56919061450c565b89516040516001600160e01b031960e088901b168152612f7e95949392918991600401615500565b6020604051808303815f875af1158015612f9a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fbe9190615553565b878681518110612fd057612fd061515e565b602002602001018181525050505050505b6001016129d2565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe5613018602087018761450c565b856130266040890189615119565b8561303460808c018c615396565b604051613047979695949392919061556a565b60405180910390a1509250929050565b6040805180820182526001600160a01b038516808252845163ffffffff90811660208085018290525f938452609890529390912091926130989291613c6416565b6130b557604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c816040516130e491906151b2565b60405180910390a16001600160a01b038216620e16e414801590613179578260a65f61310f856125c6565b81526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055507f90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e8284604051613170929190615335565b60405180910390a15b5f5b8460200151518110156131b8576131b083866020015183815181106131a2576131a261515e565b6020026020010151846132cd565b60010161317b565b506118f48285604001516001613589565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f8111801561321357508261ffff1682105b156118f4576001600160a01b038086165f90815260a360209081526040808320938816835292905290812061324790613e1f565b90505f5f613256888489613852565b91509150806040015163ffffffff16431015613274575050506118f4565b6132818884898585613a2c565b6001600160a01b038089165f90815260a360209081526040808320938b168352929052206132ae90613e71565b506132b885615465565b94506132c384615600565b9350505050613201565b801561334f576001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01480159061333257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b61334f57604051632711b74d60e11b815260040160405180910390fd5b61335f8260995f611e05876125c6565b61337c5760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b8383604051612365929190615335565b6001600160a01b0383165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b9092041660608201819052158015906134295750806060015163ffffffff164310155b1561344357604081015163ffffffff168152600160208201525b63ffffffff8316604082015281156134725763ffffffff808416825260016020830152431660608201526134b3565b61349c7f0000000000000000000000000000000000000000000000000000000000000000436151d4565b6134a79060016151d4565b63ffffffff1660608201525b6001600160a01b0384165f818152609b60209081526040918290208451815486840151878601516060808a015163ffffffff95861664ffffffffff1990951694909417600160201b93151593909302929092176cffffffffffffffff0000000000191665010000000000918516919091026cffffffff000000000000000000191617600160481b92841692830217909355845195865290881692850192909252918301527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db91015b60405180910390a150505050565b6001600160a01b0382166135b0576040516339b190bb60e11b815260040160405180910390fd5b5f60a75f6135bd866125c6565b815260208082019290925260409081015f20815160608101835281546001600160a01b03908116825260019092015491821693810193909352600160a01b900463ffffffff16908201819052909150158015906136245750806040015163ffffffff164310155b1561363a5760208101516001600160a01b031681525b80602001516001600160a01b0316836001600160a01b03161480156136685750806040015163ffffffff1643105b156136735750505050565b6001600160a01b038316602082015281156136a5576001600160a01b038316815263ffffffff431660408201526136e6565b6136cf7f0000000000000000000000000000000000000000000000000000000000000000436151d4565b6136da9060016151d4565b63ffffffff1660408201525b8060a75f6136f3876125c6565b815260208082019290925260409081015f20835181546001600160a01b039182166001600160a01b031990911617825592840151600190910180549483015163ffffffff16600160a01b026001600160c01b031990951691909316179290921790558181015190517f3873f29d7a65a4d75f5ba28909172f486216a1420e77c3c2720815951a6b4f579161357b9187918791615615565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb890608401602060405180830381865afa15801561380f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0a9190615193565b5f6109498383613eee565b5f610949836001600160a01b038416613eee565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906138b290613fd1565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156139545790925090506139b6565b613965815f01518260200151613a0d565b6001600160401b0316815260208101515f600f9190910b12156139a35761399482602001518260200151613a0d565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b5f6139cf8460995f612b4a896125c6565b80156139d85750815b80156139ed575082516001600160401b031615155b95945050505050565b5f6109496001600160401b03808516908416615648565b5f610949613a24836001600160401b0386166154d3565b600f0b613fe4565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b03908116911614613af257602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b15613bd4576001600160a01b0385165f908152609f602090815260408083208784529091529020613bac9084613c6f565b506001600160a01b0385165f908152609d60205260409020613bce9085613c64565b506118f4565b80516001600160401b03165f036118f4576001600160a01b0385165f908152609f602090815260408083208784529091529020613c11908461383e565b506001600160a01b0385165f908152609f602090815260408083208784529091529020613c3d9061404f565b5f036118f4576001600160a01b0385165f908152609d60205260409020610b709085613833565b5f6109498383614058565b5f610949836001600160a01b038416614058565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613cdf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d039190615675565b6001600160a01b0316336001600160a01b031614610fed5760405163794821ff60e01b815260040160405180910390fd5b365f5f375f5f365f845af43d5f5f3e808015613d4e573d5ff35b3d5ffd5b6001600160a01b0381165f9081526001830160205260408120541515610949565b5f6109498383670de0b6b3a764000060016140a4565b5f61094983670de0b6b3a7640000846140fd565b6001600160a01b038084165f90815260a160209081526040808320938616835292905220613dcc9043836141e2565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c90606001612365565b5f613e398254600f81810b600160801b909204900b131590565b15613e5757604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f613e8b8254600f81810b600160801b909204900b131590565b15613ea957604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f8181526001830160205260408120548015613fc8575f613f1060018361547d565b85549091505f90613f239060019061547d565b9050818114613f82575f865f018281548110613f4157613f4161515e565b905f5260205f200154905080875f018481548110613f6157613f6161515e565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613f9357613f93615690565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610a0a565b5f915050610a0a565b5f610a0a82670de0b6b3a76400006141f6565b5f6001600160401b0382111561404b5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b606482015260840161254b565b5090565b5f610a0a825490565b5f81815260018301602052604081205461409d57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610a0a565b505f610a0a565b5f5f6140b18686866140fd565b905060018360028111156140c7576140c76156a4565b1480156140e357505f84806140de576140de6156b8565b868809115b156139ed576140f36001826156cc565b9695505050505050565b5f80805f19858709858702925082811083820303915050805f036141345783828161412a5761412a6156b8565b0492505050610949565b80841161417b5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b604482015260640161254b565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b610fd683836001600160401b03841661423a565b81545f9080156142325761421c8461420f60018461547d565b5f91825260209091200190565b54600160201b90046001600160e01b0316610a06565b509092915050565b825480156142f0575f6142528561420f60018561547d565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b0316602084015291925090851610156142a45760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036142ee57826142c58661420f60018661547d565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156143735761437361433d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156143a1576143a161433d565b604052919050565b6001600160a01b0381168114612740575f5ffd5b803563ffffffff81168114610a75575f5ffd5b5f604082840312156143e0575f5ffd5b604080519081016001600160401b03811182821017156144025761440261433d565b6040529050808235614413816143a9565b8152614421602084016143bd565b60208201525092915050565b5f6040828403121561443d575f5ffd5b61094983836143d0565b5f5f5f60808486031215614459575f5ffd5b8335614464816143a9565b925061447385602086016143d0565b91506060840135614483816143a9565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff169082015260608101610a0a565b5f5f606083850312156144d2575f5ffd5b82356144dd816143a9565b91506144ec84602085016143d0565b90509250929050565b5f60208284031215614505575f5ffd5b5035919050565b5f6020828403121561451c575f5ffd5b8135610949816143a9565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b828110156145805761456a868351614527565b6040959095019460209190910190600101614557565b5093949350505050565b602081525f6109496020830184614545565b5f5f83601f8401126145ac575f5ffd5b5081356001600160401b038111156145c2575f5ffd5b6020830191508360208260051b8501011115610d75575f5ffd5b5f5f5f604084860312156145ee575f5ffd5b83356145f9816143a9565b925060208401356001600160401b03811115614613575f5ffd5b61461f8682870161459c565b9497909650939450505050565b5f6001600160401b038211156146445761464461433d565b5060051b60200190565b5f82601f83011261465d575f5ffd5b813561467061466b8261462c565b614379565b8082825260208201915060208360051b860101925085831115614691575f5ffd5b602085015b838110156146b75780356146a9816143a9565b835260209283019201614696565b5095945050505050565b5f5f5f608084860312156146d3575f5ffd5b6146dd85856143d0565b925060408401356001600160401b038111156146f7575f5ffd5b6147038682870161464e565b92505060608401356001600160401b0381111561471e575f5ffd5b61472a8682870161464e565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614580578151865260209586019590910190600101614746565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156147bb57603f198786030184526147a6858351614734565b9450602093840193919091019060010161478a565b50929695505050505050565b5f5f5f5f60a085870312156147da575f5ffd5b6147e486866143d0565b935060408501356001600160401b038111156147fe575f5ffd5b61480a8782880161464e565b93505060608501356001600160401b03811115614825575f5ffd5b6148318782880161464e565b925050614840608086016143bd565b905092959194509250565b5f5f5f5f5f6060868803121561485f575f5ffd5b853561486a816143a9565b945060208601356001600160401b03811115614884575f5ffd5b6148908882890161459c565b90955093505060408601356001600160401b038111156148ae575f5ffd5b6148ba8882890161459c565b969995985093965092949392505050565b5f5f604083850312156148dc575f5ffd5b82356148e7816143a9565b915060208301356001600160401b03811115614901575f5ffd5b830160a08186031215614912575f5ffd5b809150509250929050565b828152604060208201525f610b196040830184614734565b5f82601f830112614944575f5ffd5b813561495261466b8261462c565b8082825260208201915060208360051b860101925085831115614973575f5ffd5b602085015b838110156146b75780356001600160401b03811115614995575f5ffd5b86016060818903601f190112156149aa575f5ffd5b6149b2614351565b6149be602083016143bd565b815260408201356001600160401b038111156149d8575f5ffd5b6149e78a60208386010161464e565b602083015250606082013591506149fd826143a9565b6040810191909152835260209283019201614978565b5f5f60408385031215614a24575f5ffd5b8235614a2f816143a9565b915060208301356001600160401b03811115614a49575f5ffd5b614a5585828601614935565b9150509250929050565b5f5f60408385031215614a70575f5ffd5b8235614a7b816143a9565b91506020830135614912816143a9565b5f8151808452602084019350602083015f5b8281101561458057614ad686835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101614a9d565b604081525f614afe6040830185614545565b82810360208401526139ed8185614a8b565b602080825282518282018190525f918401906040840190835b81811015614b505783516001600160a01b0316835260209384019390920191600101614b29565b509095945050505050565b5f5f5f60408486031215614b6d575f5ffd5b83356001600160401b03811115614b82575f5ffd5b614b8e8682870161459c565b9094509250506020840135614483816143a9565b602080825282518282018190525f918401906040840190835b81811015614b505783516001600160401b0316835260209384019390920191600101614bbb565b5f5f5f5f60608587031215614bf5575f5ffd5b8435614c00816143a9565b9350614c0e602086016143bd565b925060408501356001600160401b03811115614c28575f5ffd5b614c348782880161459c565b95989497509550505050565b5f5f60408385031215614c51575f5ffd5b8235614c5c816143a9565b91506144ec602084016143bd565b5f60208284031215614c7a575f5ffd5b813560ff81168114610949575f5ffd5b5f5f60608385031215614c9b575f5ffd5b614ca584846143d0565b91506040830135614912816143a9565b5f60608284031215614cc5575f5ffd5b50919050565b5f60208284031215614cdb575f5ffd5b81356001600160401b03811115614cf0575f5ffd5b610a0684828501614cb5565b5f5f5f60808486031215614d0e575f5ffd5b83356001600160401b03811115614d23575f5ffd5b614d2f8682870161464e565b93505061447385602086016143d0565b602081525f6109496020830184614a8b565b5f5f5f5f60608587031215614d64575f5ffd5b8435614d6f816143a9565b935060208501356001600160401b03811115614d89575f5ffd5b614d958782880161459c565b90945092506148409050604086016143bd565b5f5f60408385031215614db9575f5ffd5b8235614dc4816143a9565b915060208301356001600160401b03811115614dde575f5ffd5b8301601f81018513614dee575f5ffd5b8035614dfc61466b8261462c565b8082825260208201915060208360051b850101925087831115614e1d575f5ffd5b602084015b83811015614f425780356001600160401b03811115614e3f575f5ffd5b85016080818b03601f19011215614e54575f5ffd5b614e5c614351565b614e698b602084016143d0565b815260608201356001600160401b03811115614e83575f5ffd5b614e928c60208386010161464e565b60208301525060808201356001600160401b03811115614eb0575f5ffd5b6020818401019250508a601f830112614ec7575f5ffd5b8135614ed561466b8261462c565b8082825260208201915060208360051b86010192508d831115614ef6575f5ffd5b6020850194505b82851015614f2c5784356001600160401b0381168114614f1b575f5ffd5b825260209485019490910190614efd565b6040840152505084525060209283019201614e22565b50809450505050509250929050565b5f60208284031215614f61575f5ffd5b81356001600160401b03811115614f76575f5ffd5b8201601f81018413614f86575f5ffd5b8035614f9461466b8261462c565b8082825260208201915060208360061b850101925086831115614fb5575f5ffd5b6020840193505b828410156140f357614fce87856143d0565b8252602082019150604084019350614fbc565b5f5f5f60408486031215614ff3575f5ffd5b8335614ffe816143a9565b925060208401356001600160401b03811115615018575f5ffd5b8401601f81018613615028575f5ffd5b80356001600160401b0381111561503d575f5ffd5b86602082840101111561504e575f5ffd5b939660209190910195509293505050565b5f5f60408385031215615070575f5ffd5b823561507b816143a9565b915060208301356001600160401b03811115615095575f5ffd5b614a5585828601614cb5565b5f5f5f5f606085870312156150b4575f5ffd5b84356150bf816143a9565b935060208501356001600160401b038111156150d9575f5ffd5b6150e587828801614935565b93505060408501356001600160401b03811115614c28575f5ffd5b5f60208284031215615110575f5ffd5b610949826143bd565b5f5f8335601e1984360301811261512e575f5ffd5b8301803591506001600160401b03821115615147575f5ffd5b6020019150600581901b3603821315610d75575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215615182575f5ffd5b813561ffff81168114610949575f5ffd5b5f602082840312156151a3575f5ffd5b81518015158114610949575f5ffd5b60408101610a0a8284614527565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115610a0a57610a0a6151c0565b8183526020830192505f815f5b848110156145805763ffffffff615213836143bd565b16865260209586019591909101906001016151fd565b6001600160a01b038581168252841660208201526060604082018190525f906140f390830184866151f0565b6001600160a01b038616815260c081016152726020830187614527565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b5f602082840312156152b6575f5ffd5b81516001600160401b038111156152cb575f5ffd5b8201601f810184136152db575f5ffd5b80516152e961466b8261462c565b8082825260208201915060208360051b85010192508683111561530a575f5ffd5b6020840193505b828410156140f3578351615324816143a9565b825260209384019390910190615311565b606081016153438285614527565b6001600160a01b039290921660409190910152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610b1960208301848661535b565b5f5f8335601e198436030181126153ab575f5ffd5b8301803591506001600160401b038211156153c4575f5ffd5b602001915036819003821315610d75575f5ffd5b6001600160a01b038781168252861660208201526080604082018190525f9061540490830186886151f0565b828103606084015261541781858761535b565b9998505050505050505050565b80516020808301519190811015614cc5575f1960209190910360031b1b16919050565b5f8235603e1983360301811261545b575f5ffd5b9190910192915050565b5f60018201615476576154766151c0565b5060010190565b81810381811115610a0a57610a0a6151c0565b6001600160401b038281168282160390811115610a0a57610a0a6151c0565b5f81600f0b60016001607f1b031981036154cb576154cb6151c0565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b031982121715610a0a57610a0a6151c0565b6001600160a01b038716815260e0810161551d6020830188614527565b60608201959095526001600160a01b039390931660808401526001600160401b0391821660a08401521660c09091015292915050565b5f60208284031215615563575f5ffd5b5051919050565b6001600160a01b03881681525f60c08201615588602084018a614527565b60c060608401528690528660e083015f5b888110156155c95782356155ac816143a9565b6001600160a01b0316825260209283019290910190600101615599565b5083810360808501526155dc8188614734565b91505082810360a08401526155f281858761535b565b9a9950505050505050505050565b5f8161560e5761560e6151c0565b505f190190565b608081016156238286614527565b6001600160a01b0393909316604082015263ffffffff91909116606090910152919050565b600f82810b9082900b0360016001607f1b0319811260016001607f1b0382131715610a0a57610a0a6151c0565b5f60208284031215615685575f5ffd5b8151610949816143a9565b634e487b7160e01b5f52603160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b80820180821115610a0a57610a0a6151c056fea2646970667358221220313f731aa74089873dda9647f8930beed97d68f3d08d646c05246c5f518b6d2c64736f6c634300081e0033",
}
// AllocationManagerABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/AllocationManagerView/binding.go b/pkg/bindings/AllocationManagerView/binding.go
index 09ae5ae955..a1bc60d4a3 100644
--- a/pkg/bindings/AllocationManagerView/binding.go
+++ b/pkg/bindings/AllocationManagerView/binding.go
@@ -45,7 +45,7 @@ type OperatorSet struct {
// AllocationManagerViewMetaData contains all meta data concerning the AllocationManagerView contract.
var AllocationManagerViewMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_eigenStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"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\":\"SLASHER_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingSlasher\",\"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\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRedistributionRecipient\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlasher\",\"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\":\"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\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorRedistributable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSlashable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRedistributingOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RedistributionAddressSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"redistributionRecipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlasherMigrated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slasher\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlasherUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slasher\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAVSRegistrar\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRedistributionRecipient\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonexistentAVSMetadata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorSetAlreadyMigrated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SlasherNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]",
- Bin: "0x610120604052348015610010575f5ffd5b5060405161277a38038061277a83398101604081905261002f9161008d565b6001600160a01b039384166080529290911660a05263ffffffff90811660c0521660e0819052610100526100e3565b6001600160a01b0381168114610072575f5ffd5b50565b805163ffffffff81168114610088575f5ffd5b919050565b5f5f5f5f608085870312156100a0575f5ffd5b84516100ab8161005e565b60208601519094506100bc8161005e565b92506100ca60408601610075565b91506100d860608601610075565b905092959194509250565b60805160a05160c05160e051610100516126536101275f395f6103d601525f61044e01525f6102ac01525f61056d01525f81816105a701526113e201526126535ff3fe608060405234801561000f575f5ffd5b50600436106101fd575f3560e01c80636e875dba11610114578063ba1a84e5116100a9578063db4df76111610079578063db4df76114610568578063dc2af6921461058f578063df5cf723146105a2578063f231bd08146105c9578063f605ce08146105dc575f5ffd5b8063ba1a84e5146104f8578063c221d8ae1461050b578063d4a3fcce1461051e578063d779485714610531575f5ffd5b806394d7d00c116100e457806394d7d00c14610490578063a9333ec8146104a3578063b2447af7146104b6578063b9fbaed1146104c9575f5ffd5b80636e875dba1461042357806379ae50cd146104365780637bc1ef61146104495780638ce6485414610470575f5ffd5b8063304c10cd116101955780634cfd2939116101655780634cfd29391461038a578063547afb87146103ab578063670d3ba2146103be57806367aeaa53146103d15780636cfb4481146103f8575f5ffd5b8063304c10cd1461031657806340120dab146103295780634177a87c1461034a5780634a10ffe51461036a575f5ffd5b8063260dc758116101d0578063260dc758146102945780632981eb77146102a75780632b453a9a146102e35780632bab2c4a14610303575f5ffd5b80630f3df50e1461020157806310e1b9b8146102315780631352c3e61461025157806315fe502814610274575b5f5ffd5b61021461020f366004611dd8565b6105ef565b6040516001600160a01b0390911681526020015b60405180910390f35b61024461023f366004611df2565b610630565b6040516102289190611e39565b61026461025f366004611e6c565b610669565b6040519015158152602001610228565b610287610282366004611ea0565b6106e4565b6040516102289190611f10565b6102646102a2366004611dd8565b6107fb565b6102ce7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610228565b6102f66102f1366004611fb7565b61082c565b604051610228919061202a565b6102f66103113660046120b6565b610842565b610214610324366004611ea0565b6108e1565b61033c61033736600461213a565b610910565b6040516102289291906121d2565b61035d610358366004611dd8565b610a89565b604051610228919061222f565b61037d610378366004612241565b610aad565b6040516102289190612284565b61039d610398366004611dd8565b610b55565b604051908152602001610228565b61037d6103b93660046122cf565b610b77565b6102646103cc366004611e6c565b610c1f565b6102ce7f000000000000000000000000000000000000000000000000000000000000000081565b61040b61040636600461213a565b610c4b565b6040516001600160401b039091168152602001610228565b61035d610431366004611dd8565b610c60565b610287610444366004611ea0565b610c71565b6102ce7f000000000000000000000000000000000000000000000000000000000000000081565b61048361047e366004612311565b610d4b565b6040516102289190612354565b61037d61049e366004612366565b610e07565b61040b6104b136600461213a565b610ef3565b61039d6104c4366004611dd8565b610f22565b6104dc6104d7366004611ea0565b610f44565b60408051921515835263ffffffff909116602083015201610228565b61039d610506366004611ea0565b610fe5565b61035d610519366004611e6c565b611005565b61021461052c366004611dd8565b61102e565b61054461053f366004611dd8565b6110b5565b604080516001600160a01b03909316835263ffffffff909116602083015201610228565b6102147f000000000000000000000000000000000000000000000000000000000000000081565b61026461059d366004611ea0565b611136565b6102147f000000000000000000000000000000000000000000000000000000000000000081565b6102646105d7366004611dd8565b611169565b61040b6105ea36600461213a565b611188565b5f5f60a65f6105fd85611194565b815260208101919091526040015f20546001600160a01b0316905080156106245780610629565b620e16e45b9392505050565b604080516060810182525f808252602082018190529181018290529061065f8561065986611194565b856111f7565b9695505050505050565b6001600160a01b0382165f908152609e6020526040812081908161068c85611194565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff16928201929092529150806106da5750806020015163ffffffff164311155b9150505b92915050565b6001600160a01b0381165f908152609d602052604081206060919061070890611363565b90505f816001600160401b0381111561072357610723611d0d565b60405190808252806020026020018201604052801561076757816020015b604080518082019091525f80825260208201528152602001906001900390816107415790505b5090505f5b828110156107f3576001600160a01b0385165f908152609d602052604090206107ce90610799908361136c565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b8282815181106107e0576107e06123c1565b602090810291909101015260010161076c565b509392505050565b60208082015182516001600160a01b03165f9081526098909252604082206106de9163ffffffff9081169061137716565b606061083a8484844361138e565b949350505050565b60606108508585858561138e565b90505f5b84518110156108d857610880858281518110610872576108726123c1565b602002602001015187610669565b6108d0575f5b84518110156108ce575f8383815181106108a2576108a26123c1565b602002602001015182815181106108bb576108bb6123c1565b6020908102919091010152600101610886565b505b600101610854565b50949350505050565b6001600160a01b038082165f9081526097602052604081205490911680156109095780610629565b5090919050565b6001600160a01b0382165f908152609d60205260408120606091829161093590611363565b90505f816001600160401b0381111561095057610950611d0d565b60405190808252806020026020018201604052801561099457816020015b604080518082019091525f808252602082015281526020019060019003908161096e5790505b5090505f826001600160401b038111156109b0576109b0611d0d565b6040519080825280602002602001820160405280156109f957816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816109ce5790505b5090505f5b83811015610a7c576001600160a01b0388165f908152609d60205260408120610a2b90610799908461136c565b905080848381518110610a4057610a406123c1565b6020026020010181905250610a5689828a610630565b838381518110610a6857610a686123c1565b6020908102919091010152506001016109fe565b5090969095509350505050565b60605f61062960995f610a9b86611194565b81526020019081526020015f2061167b565b60605f83516001600160401b03811115610ac957610ac9611d0d565b604051908082528060200260200182016040528015610af2578160200160208202803683370190505b5090505f5b84518110156107f357610b23858281518110610b1557610b156123c1565b602002602001015185610ef3565b828281518110610b3557610b356123c1565b6001600160401b0390921660209283029190910190910152600101610af7565b5f60a55f610b6284611194565b81526020019081526020015f20549050919050565b60605f82516001600160401b03811115610b9357610b93611d0d565b604051908082528060200260200182016040528015610bbc578160200160208202803683370190505b5090505f5b83518110156107f357610bed85858381518110610be057610be06123c1565b6020026020010151610ef3565b828281518110610bff57610bff6123c1565b6001600160401b0390921660209283029190910190910152600101610bc1565b5f61062983609a5f610c3086611194565b81526020019081526020015f2061168790919063ffffffff16565b5f5f610c5784846116a8565b95945050505050565b60606106de609a5f610a9b85611194565b6001600160a01b0381165f908152609c6020526040812060609190610c9590611363565b90505f816001600160401b03811115610cb057610cb0611d0d565b604051908082528060200260200182016040528015610cf457816020015b604080518082019091525f8082526020820152815260200190600190039081610cce5790505b5090505f5b828110156107f3576001600160a01b0385165f908152609c60205260409020610d2690610799908361136c565b828281518110610d3857610d386123c1565b6020908102919091010152600101610cf9565b60605f84516001600160401b03811115610d6757610d67611d0d565b604051908082528060200260200182016040528015610db057816020015b604080516060810182525f80825260208083018290529282015282525f19909201910181610d855790505b5090505f5b85518110156108d857610de2868281518110610dd357610dd36123c1565b60200260200101518686610630565b828281518110610df457610df46123c1565b6020908102919091010152600101610db5565b60605f83516001600160401b03811115610e2357610e23611d0d565b604051908082528060200260200182016040528015610e4c578160200160208202803683370190505b5090505f5b84518110156108d8576001600160a01b0386165f90815260a1602052604081208651610ec192879291899086908110610e8c57610e8c6123c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2061181790919063ffffffff16565b828281518110610ed357610ed36123c1565b6001600160401b0390921660209283029190910190910152600101610e51565b6001600160a01b038083165f90815260a16020908152604080832093851683529290529081206106299061182b565b5f6106de609a5f610f3285611194565b81526020019081526020015f20611363565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff64010000000084041615159584018690526501000000000083048216948401949094526901000000000000000000909104166060820181905284939192919015801590610fcc5750826060015163ffffffff164310155b15610fdb575050604081015160015b9590945092505050565b6001600160a01b0381165f9081526098602052604081206106de90611363565b6001600160a01b0382165f908152609f60205260408120606091906106da9082610a9b86611194565b5f5f60a75f61103c85611194565b815260208082019290925260409081015f20815160608101835281546001600160a01b0390811680835260019093015490811694820194909452600160a01b90930463ffffffff16918301829052919250158015906110a55750816040015163ffffffff164310155b1561062957506020015192915050565b5f5f5f5f5f60a75f6110c688611194565b815260208082019290925260409081015f20815160608101835281546001600160a01b03908116825260019092015491821693810193909352600160a01b900463ffffffff1690820181905290915043101561112b5780602001519250806040015191505b509094909350915050565b5f5f61114183610c71565b90505f61114d846106e4565b9050611159848361183e565b8061083a575061083a848261183e565b5f620e16e4611177836105ef565b6001600160a01b0316141592915050565b5f5f6108d884846116a8565b5f815f0151826020015163ffffffff166040516020016111df92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526106de906123d5565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906112579061182b565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156112f957909250905061135b565b61130a815f015182602001516118b6565b6001600160401b0316815260208101515f600f9190910b121561134857611339826020015182602001516118b6565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b5f6106de825490565b5f61062983836118d5565b5f8181526001830160205260408120541515610629565b606083516001600160401b038111156113a9576113a9611d0d565b6040519080825280602002602001820160405280156113dc57816020015b60608152602001906001900390816113c75790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b815260040161142e9291906123fb565b5f60405180830381865afa158015611448573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261146f919081019061241f565b90505f5b8551811015611671575f86828151811061148f5761148f6123c1565b6020026020010151905085516001600160401b038111156114b2576114b2611d0d565b6040519080825280602002602001820160405280156114db578160200160208202803683370190505b508483815181106114ee576114ee6123c1565b60209081029190910101525f5b8651811015611667575f878281518110611517576115176123c1565b6020908102919091018101516001600160a01b038086165f90815260a18452604080822092841682529190935282209092506115529061182b565b9050806001600160401b03165f0361156b57505061165f565b5f611577858d85610630565b90508863ffffffff16816040015163ffffffff161115801561159f57505f8160200151600f0b125b156115c1576115b5815f015182602001516118b6565b6001600160401b031681525b80515f906115dc906001600160401b039081169085166118fb565b9050611623818989815181106115f4576115f46123c1565b6020026020010151878151811061160d5761160d6123c1565b602002602001015161190f90919063ffffffff16565b898881518110611635576116356123c1565b6020026020010151868151811061164e5761164e6123c1565b602002602001018181525050505050505b6001016114fb565b5050600101611473565b5050949350505050565b60605f61062983611923565b6001600160a01b0381165f9081526001830160205260408120541515610629565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b039091169190600f81810b600160801b909204900b03815b818110156117d3576001600160a01b038087165f90815260a360209081526040808320938916835292905290812061173b908361197c565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff169181018290529192504310156117b65750506117d3565b6117c48682602001516118b6565b95505050806001019050611703565b506001600160a01b038086165f90815260a16020908152604080832093881683529290522083906118039061182b565b61180d919061253f565b9150509250929050565b5f6106298383670de0b6b3a76400006119eb565b5f6106de82670de0b6b3a7640000611a41565b5f805b82518110156118ad5761186d84848381518110611860576118606123c1565b6020026020010151610669565b80156118965750611896838281518110611889576118896123c1565b6020026020010151611169565b156118a55760019150506106de565b600101611841565b505f9392505050565b5f6106296118cd836001600160401b03861661255e565b600f0b611a79565b5f825f0182815481106118ea576118ea6123c1565b905f5260205f200154905092915050565b5f61062983670de0b6b3a764000084611ae9565b5f6106298383670de0b6b3a7640000611ae9565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561197057602002820191905f5260205f20905b81548152602001906001019080831161195c575b50505050509050919050565b5f5f61199e61198a84611bce565b85546119999190600f0b61259d565b611c37565b8454909150600160801b9004600f90810b9082900b126119d157604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b82545f90816119fc86868385611ca0565b90508015611a3757611a2086611a136001846125c4565b5f91825260209091200190565b5464010000000090046001600160e01b031661065f565b5091949350505050565b81545f908015611a7157611a5a84611a136001846125c4565b5464010000000090046001600160e01b03166106da565b509092915050565b5f6001600160401b03821115611ae55760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b60648201526084015b60405180910390fd5b5090565b5f80805f19858709858702925082811083820303915050805f03611b2057838281611b1657611b166125d7565b0492505050610629565b808411611b675760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606401611adc565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f6001600160ff1b03821115611ae55760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608401611adc565b80600f81900b8114611c9b5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401611adc565b919050565b5f5b818310156107f3575f611cb58484611cf3565b5f8781526020902090915063ffffffff86169082015463ffffffff161115611cdf57809250611ced565b611cea8160016125eb565b93505b50611ca2565b5f611d0160028484186125fe565b610629908484166125eb565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715611d4957611d49611d0d565b604052919050565b6001600160a01b0381168114611d65575f5ffd5b50565b803563ffffffff81168114611c9b575f5ffd5b5f60408284031215611d8b575f5ffd5b604080519081016001600160401b0381118282101715611dad57611dad611d0d565b6040529050808235611dbe81611d51565b8152611dcc60208401611d68565b60208201525092915050565b5f60408284031215611de8575f5ffd5b6106298383611d7b565b5f5f5f60808486031215611e04575f5ffd5b8335611e0f81611d51565b9250611e1e8560208601611d7b565b91506060840135611e2e81611d51565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff1690820152606081016106de565b5f5f60608385031215611e7d575f5ffd5b8235611e8881611d51565b9150611e978460208501611d7b565b90509250929050565b5f60208284031215611eb0575f5ffd5b813561062981611d51565b5f8151808452602084019350602083015f5b82811015611f0657815180516001600160a01b0316875260209081015163ffffffff168188015260409096019590910190600101611ecd565b5093949350505050565b602081525f6106296020830184611ebb565b5f6001600160401b03821115611f3a57611f3a611d0d565b5060051b60200190565b5f82601f830112611f53575f5ffd5b8135611f66611f6182611f22565b611d21565b8082825260208201915060208360051b860101925085831115611f87575f5ffd5b602085015b83811015611fad578035611f9f81611d51565b835260209283019201611f8c565b5095945050505050565b5f5f5f60808486031215611fc9575f5ffd5b611fd38585611d7b565b925060408401356001600160401b03811115611fed575f5ffd5b611ff986828701611f44565b92505060608401356001600160401b03811115612014575f5ffd5b61202086828701611f44565b9150509250925092565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156120aa57868503603f19018452815180518087526020918201918701905f5b81811015612091578351835260209384019390920191600101612073565b5090965050506020938401939190910190600101612050565b50929695505050505050565b5f5f5f5f60a085870312156120c9575f5ffd5b6120d38686611d7b565b935060408501356001600160401b038111156120ed575f5ffd5b6120f987828801611f44565b93505060608501356001600160401b03811115612114575f5ffd5b61212087828801611f44565b92505061212f60808601611d68565b905092959194509250565b5f5f6040838503121561214b575f5ffd5b823561215681611d51565b9150602083013561216681611d51565b809150509250929050565b5f8151808452602084019350602083015f5b82811015611f06576121bc86835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101612183565b604081525f6121e46040830185611ebb565b8281036020840152610c578185612171565b5f8151808452602084019350602083015f5b82811015611f065781516001600160a01b0316865260209586019590910190600101612208565b602081525f61062960208301846121f6565b5f5f60408385031215612252575f5ffd5b82356001600160401b03811115612267575f5ffd5b61227385828601611f44565b925050602083013561216681611d51565b602080825282518282018190525f918401906040840190835b818110156122c45783516001600160401b031683526020938401939092019160010161229d565b509095945050505050565b5f5f604083850312156122e0575f5ffd5b82356122eb81611d51565b915060208301356001600160401b03811115612305575f5ffd5b61180d85828601611f44565b5f5f5f60808486031215612323575f5ffd5b83356001600160401b03811115612338575f5ffd5b61234486828701611f44565b935050611e1e8560208601611d7b565b602081525f6106296020830184612171565b5f5f5f60608486031215612378575f5ffd5b833561238381611d51565b925060208401356001600160401b0381111561239d575f5ffd5b6123a986828701611f44565b9250506123b860408501611d68565b90509250925092565b634e487b7160e01b5f52603260045260245ffd5b805160208083015191908110156123f5575f198160200360031b1b821691505b50919050565b604081525f61240d60408301856121f6565b8281036020840152610c5781856121f6565b5f6020828403121561242f575f5ffd5b81516001600160401b03811115612444575f5ffd5b8201601f81018413612454575f5ffd5b8051612462611f6182611f22565b8082825260208201915060208360051b850101925086831115612483575f5ffd5b602084015b838110156125205780516001600160401b038111156124a5575f5ffd5b8501603f810189136124b5575f5ffd5b60208101516124c6611f6182611f22565b808282526020820191506020808460051b8601010192508b8311156124e9575f5ffd5b6040840193505b8284101561250b5783518252602093840193909101906124f0565b86525050602093840193919091019050612488565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908111156106de576106de61252b565b600f81810b9083900b016f7fffffffffffffffffffffffffffffff81136f7fffffffffffffffffffffffffffffff19821217156106de576106de61252b565b8082018281125f8312801582168215821617156125bc576125bc61252b565b505092915050565b818103818111156106de576106de61252b565b634e487b7160e01b5f52601260045260245ffd5b808201808211156106de576106de61252b565b5f8261261857634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220800066159b94ad8279c77e9ea5168403873dfa0fd7176376207ccdac08ea7a9664736f6c634300081e0033",
+ Bin: "0x610120604052348015610010575f5ffd5b5060405161277a38038061277a83398101604081905261002f9161008d565b6001600160a01b039384166080529290911660a05263ffffffff90811660c0521660e0819052610100526100e3565b6001600160a01b0381168114610072575f5ffd5b50565b805163ffffffff81168114610088575f5ffd5b919050565b5f5f5f5f608085870312156100a0575f5ffd5b84516100ab8161005e565b60208601519094506100bc8161005e565b92506100ca60408601610075565b91506100d860608601610075565b905092959194509250565b60805160a05160c05160e051610100516126536101275f395f6103d601525f61044e01525f6102ac01525f61056d01525f81816105a701526113e201526126535ff3fe608060405234801561000f575f5ffd5b50600436106101fd575f3560e01c80636e875dba11610114578063ba1a84e5116100a9578063db4df76111610079578063db4df76114610568578063dc2af6921461058f578063df5cf723146105a2578063f231bd08146105c9578063f605ce08146105dc575f5ffd5b8063ba1a84e5146104f8578063c221d8ae1461050b578063d4a3fcce1461051e578063d779485714610531575f5ffd5b806394d7d00c116100e457806394d7d00c14610490578063a9333ec8146104a3578063b2447af7146104b6578063b9fbaed1146104c9575f5ffd5b80636e875dba1461042357806379ae50cd146104365780637bc1ef61146104495780638ce6485414610470575f5ffd5b8063304c10cd116101955780634cfd2939116101655780634cfd29391461038a578063547afb87146103ab578063670d3ba2146103be57806367aeaa53146103d15780636cfb4481146103f8575f5ffd5b8063304c10cd1461031657806340120dab146103295780634177a87c1461034a5780634a10ffe51461036a575f5ffd5b8063260dc758116101d0578063260dc758146102945780632981eb77146102a75780632b453a9a146102e35780632bab2c4a14610303575f5ffd5b80630f3df50e1461020157806310e1b9b8146102315780631352c3e61461025157806315fe502814610274575b5f5ffd5b61021461020f366004611dd8565b6105ef565b6040516001600160a01b0390911681526020015b60405180910390f35b61024461023f366004611df2565b610630565b6040516102289190611e39565b61026461025f366004611e6c565b610669565b6040519015158152602001610228565b610287610282366004611ea0565b6106e4565b6040516102289190611f10565b6102646102a2366004611dd8565b6107fb565b6102ce7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610228565b6102f66102f1366004611fb7565b61082c565b604051610228919061202a565b6102f66103113660046120b6565b610842565b610214610324366004611ea0565b6108e1565b61033c61033736600461213a565b610910565b6040516102289291906121d2565b61035d610358366004611dd8565b610a89565b604051610228919061222f565b61037d610378366004612241565b610aad565b6040516102289190612284565b61039d610398366004611dd8565b610b55565b604051908152602001610228565b61037d6103b93660046122cf565b610b77565b6102646103cc366004611e6c565b610c1f565b6102ce7f000000000000000000000000000000000000000000000000000000000000000081565b61040b61040636600461213a565b610c4b565b6040516001600160401b039091168152602001610228565b61035d610431366004611dd8565b610c60565b610287610444366004611ea0565b610c71565b6102ce7f000000000000000000000000000000000000000000000000000000000000000081565b61048361047e366004612311565b610d4b565b6040516102289190612354565b61037d61049e366004612366565b610e07565b61040b6104b136600461213a565b610ef3565b61039d6104c4366004611dd8565b610f22565b6104dc6104d7366004611ea0565b610f44565b60408051921515835263ffffffff909116602083015201610228565b61039d610506366004611ea0565b610fe5565b61035d610519366004611e6c565b611005565b61021461052c366004611dd8565b61102e565b61054461053f366004611dd8565b6110b5565b604080516001600160a01b03909316835263ffffffff909116602083015201610228565b6102147f000000000000000000000000000000000000000000000000000000000000000081565b61026461059d366004611ea0565b611136565b6102147f000000000000000000000000000000000000000000000000000000000000000081565b6102646105d7366004611dd8565b611169565b61040b6105ea36600461213a565b611188565b5f5f60a65f6105fd85611194565b815260208101919091526040015f20546001600160a01b0316905080156106245780610629565b620e16e45b9392505050565b604080516060810182525f808252602082018190529181018290529061065f8561065986611194565b856111f7565b9695505050505050565b6001600160a01b0382165f908152609e6020526040812081908161068c85611194565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff16928201929092529150806106da5750806020015163ffffffff164311155b9150505b92915050565b6001600160a01b0381165f908152609d602052604081206060919061070890611363565b90505f816001600160401b0381111561072357610723611d0d565b60405190808252806020026020018201604052801561076757816020015b604080518082019091525f80825260208201528152602001906001900390816107415790505b5090505f5b828110156107f3576001600160a01b0385165f908152609d602052604090206107ce90610799908361136c565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b8282815181106107e0576107e06123c1565b602090810291909101015260010161076c565b509392505050565b60208082015182516001600160a01b03165f9081526098909252604082206106de9163ffffffff9081169061137716565b606061083a8484844361138e565b949350505050565b60606108508585858561138e565b90505f5b84518110156108d857610880858281518110610872576108726123c1565b602002602001015187610669565b6108d0575f5b84518110156108ce575f8383815181106108a2576108a26123c1565b602002602001015182815181106108bb576108bb6123c1565b6020908102919091010152600101610886565b505b600101610854565b50949350505050565b6001600160a01b038082165f9081526097602052604081205490911680156109095780610629565b5090919050565b6001600160a01b0382165f908152609d60205260408120606091829161093590611363565b90505f816001600160401b0381111561095057610950611d0d565b60405190808252806020026020018201604052801561099457816020015b604080518082019091525f808252602082015281526020019060019003908161096e5790505b5090505f826001600160401b038111156109b0576109b0611d0d565b6040519080825280602002602001820160405280156109f957816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816109ce5790505b5090505f5b83811015610a7c576001600160a01b0388165f908152609d60205260408120610a2b90610799908461136c565b905080848381518110610a4057610a406123c1565b6020026020010181905250610a5689828a610630565b838381518110610a6857610a686123c1565b6020908102919091010152506001016109fe565b5090969095509350505050565b60605f61062960995f610a9b86611194565b81526020019081526020015f2061167b565b60605f83516001600160401b03811115610ac957610ac9611d0d565b604051908082528060200260200182016040528015610af2578160200160208202803683370190505b5090505f5b84518110156107f357610b23858281518110610b1557610b156123c1565b602002602001015185610ef3565b828281518110610b3557610b356123c1565b6001600160401b0390921660209283029190910190910152600101610af7565b5f60a55f610b6284611194565b81526020019081526020015f20549050919050565b60605f82516001600160401b03811115610b9357610b93611d0d565b604051908082528060200260200182016040528015610bbc578160200160208202803683370190505b5090505f5b83518110156107f357610bed85858381518110610be057610be06123c1565b6020026020010151610ef3565b828281518110610bff57610bff6123c1565b6001600160401b0390921660209283029190910190910152600101610bc1565b5f61062983609a5f610c3086611194565b81526020019081526020015f2061168790919063ffffffff16565b5f5f610c5784846116a8565b95945050505050565b60606106de609a5f610a9b85611194565b6001600160a01b0381165f908152609c6020526040812060609190610c9590611363565b90505f816001600160401b03811115610cb057610cb0611d0d565b604051908082528060200260200182016040528015610cf457816020015b604080518082019091525f8082526020820152815260200190600190039081610cce5790505b5090505f5b828110156107f3576001600160a01b0385165f908152609c60205260409020610d2690610799908361136c565b828281518110610d3857610d386123c1565b6020908102919091010152600101610cf9565b60605f84516001600160401b03811115610d6757610d67611d0d565b604051908082528060200260200182016040528015610db057816020015b604080516060810182525f80825260208083018290529282015282525f19909201910181610d855790505b5090505f5b85518110156108d857610de2868281518110610dd357610dd36123c1565b60200260200101518686610630565b828281518110610df457610df46123c1565b6020908102919091010152600101610db5565b60605f83516001600160401b03811115610e2357610e23611d0d565b604051908082528060200260200182016040528015610e4c578160200160208202803683370190505b5090505f5b84518110156108d8576001600160a01b0386165f90815260a1602052604081208651610ec192879291899086908110610e8c57610e8c6123c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2061181790919063ffffffff16565b828281518110610ed357610ed36123c1565b6001600160401b0390921660209283029190910190910152600101610e51565b6001600160a01b038083165f90815260a16020908152604080832093851683529290529081206106299061182b565b5f6106de609a5f610f3285611194565b81526020019081526020015f20611363565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff64010000000084041615159584018690526501000000000083048216948401949094526901000000000000000000909104166060820181905284939192919015801590610fcc5750826060015163ffffffff164310155b15610fdb575050604081015160015b9590945092505050565b6001600160a01b0381165f9081526098602052604081206106de90611363565b6001600160a01b0382165f908152609f60205260408120606091906106da9082610a9b86611194565b5f5f60a75f61103c85611194565b815260208082019290925260409081015f20815160608101835281546001600160a01b0390811680835260019093015490811694820194909452600160a01b90930463ffffffff16918301829052919250158015906110a55750816040015163ffffffff164310155b1561062957506020015192915050565b5f5f5f5f5f60a75f6110c688611194565b815260208082019290925260409081015f20815160608101835281546001600160a01b03908116825260019092015491821693810193909352600160a01b900463ffffffff1690820181905290915043101561112b5780602001519250806040015191505b509094909350915050565b5f5f61114183610c71565b90505f61114d846106e4565b9050611159848361183e565b8061083a575061083a848261183e565b5f620e16e4611177836105ef565b6001600160a01b0316141592915050565b5f5f6108d884846116a8565b5f815f0151826020015163ffffffff166040516020016111df92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526106de906123d5565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906112579061182b565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156112f957909250905061135b565b61130a815f015182602001516118b6565b6001600160401b0316815260208101515f600f9190910b121561134857611339826020015182602001516118b6565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b5f6106de825490565b5f61062983836118d5565b5f8181526001830160205260408120541515610629565b606083516001600160401b038111156113a9576113a9611d0d565b6040519080825280602002602001820160405280156113dc57816020015b60608152602001906001900390816113c75790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b815260040161142e9291906123fb565b5f60405180830381865afa158015611448573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261146f919081019061241f565b90505f5b8551811015611671575f86828151811061148f5761148f6123c1565b6020026020010151905085516001600160401b038111156114b2576114b2611d0d565b6040519080825280602002602001820160405280156114db578160200160208202803683370190505b508483815181106114ee576114ee6123c1565b60209081029190910101525f5b8651811015611667575f878281518110611517576115176123c1565b6020908102919091018101516001600160a01b038086165f90815260a18452604080822092841682529190935282209092506115529061182b565b9050806001600160401b03165f0361156b57505061165f565b5f611577858d85610630565b90508863ffffffff16816040015163ffffffff161115801561159f57505f8160200151600f0b125b156115c1576115b5815f015182602001516118b6565b6001600160401b031681525b80515f906115dc906001600160401b039081169085166118fb565b9050611623818989815181106115f4576115f46123c1565b6020026020010151878151811061160d5761160d6123c1565b602002602001015161190f90919063ffffffff16565b898881518110611635576116356123c1565b6020026020010151868151811061164e5761164e6123c1565b602002602001018181525050505050505b6001016114fb565b5050600101611473565b5050949350505050565b60605f61062983611923565b6001600160a01b0381165f9081526001830160205260408120541515610629565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b039091169190600f81810b600160801b909204900b03815b818110156117d3576001600160a01b038087165f90815260a360209081526040808320938916835292905290812061173b908361197c565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff169181018290529192504310156117b65750506117d3565b6117c48682602001516118b6565b95505050806001019050611703565b506001600160a01b038086165f90815260a16020908152604080832093881683529290522083906118039061182b565b61180d919061253f565b9150509250929050565b5f6106298383670de0b6b3a76400006119eb565b5f6106de82670de0b6b3a7640000611a41565b5f805b82518110156118ad5761186d84848381518110611860576118606123c1565b6020026020010151610669565b80156118965750611896838281518110611889576118896123c1565b6020026020010151611169565b156118a55760019150506106de565b600101611841565b505f9392505050565b5f6106296118cd836001600160401b03861661255e565b600f0b611a79565b5f825f0182815481106118ea576118ea6123c1565b905f5260205f200154905092915050565b5f61062983670de0b6b3a764000084611ae9565b5f6106298383670de0b6b3a7640000611ae9565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561197057602002820191905f5260205f20905b81548152602001906001019080831161195c575b50505050509050919050565b5f5f61199e61198a84611bce565b85546119999190600f0b61259d565b611c37565b8454909150600160801b9004600f90810b9082900b126119d157604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b82545f90816119fc86868385611ca0565b90508015611a3757611a2086611a136001846125c4565b5f91825260209091200190565b5464010000000090046001600160e01b031661065f565b5091949350505050565b81545f908015611a7157611a5a84611a136001846125c4565b5464010000000090046001600160e01b03166106da565b509092915050565b5f6001600160401b03821115611ae55760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b60648201526084015b60405180910390fd5b5090565b5f80805f19858709858702925082811083820303915050805f03611b2057838281611b1657611b166125d7565b0492505050610629565b808411611b675760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606401611adc565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f6001600160ff1b03821115611ae55760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608401611adc565b80600f81900b8114611c9b5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401611adc565b919050565b5f5b818310156107f3575f611cb58484611cf3565b5f8781526020902090915063ffffffff86169082015463ffffffff161115611cdf57809250611ced565b611cea8160016125eb565b93505b50611ca2565b5f611d0160028484186125fe565b610629908484166125eb565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715611d4957611d49611d0d565b604052919050565b6001600160a01b0381168114611d65575f5ffd5b50565b803563ffffffff81168114611c9b575f5ffd5b5f60408284031215611d8b575f5ffd5b604080519081016001600160401b0381118282101715611dad57611dad611d0d565b6040529050808235611dbe81611d51565b8152611dcc60208401611d68565b60208201525092915050565b5f60408284031215611de8575f5ffd5b6106298383611d7b565b5f5f5f60808486031215611e04575f5ffd5b8335611e0f81611d51565b9250611e1e8560208601611d7b565b91506060840135611e2e81611d51565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff1690820152606081016106de565b5f5f60608385031215611e7d575f5ffd5b8235611e8881611d51565b9150611e978460208501611d7b565b90509250929050565b5f60208284031215611eb0575f5ffd5b813561062981611d51565b5f8151808452602084019350602083015f5b82811015611f0657815180516001600160a01b0316875260209081015163ffffffff168188015260409096019590910190600101611ecd565b5093949350505050565b602081525f6106296020830184611ebb565b5f6001600160401b03821115611f3a57611f3a611d0d565b5060051b60200190565b5f82601f830112611f53575f5ffd5b8135611f66611f6182611f22565b611d21565b8082825260208201915060208360051b860101925085831115611f87575f5ffd5b602085015b83811015611fad578035611f9f81611d51565b835260209283019201611f8c565b5095945050505050565b5f5f5f60808486031215611fc9575f5ffd5b611fd38585611d7b565b925060408401356001600160401b03811115611fed575f5ffd5b611ff986828701611f44565b92505060608401356001600160401b03811115612014575f5ffd5b61202086828701611f44565b9150509250925092565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156120aa57868503603f19018452815180518087526020918201918701905f5b81811015612091578351835260209384019390920191600101612073565b5090965050506020938401939190910190600101612050565b50929695505050505050565b5f5f5f5f60a085870312156120c9575f5ffd5b6120d38686611d7b565b935060408501356001600160401b038111156120ed575f5ffd5b6120f987828801611f44565b93505060608501356001600160401b03811115612114575f5ffd5b61212087828801611f44565b92505061212f60808601611d68565b905092959194509250565b5f5f6040838503121561214b575f5ffd5b823561215681611d51565b9150602083013561216681611d51565b809150509250929050565b5f8151808452602084019350602083015f5b82811015611f06576121bc86835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101612183565b604081525f6121e46040830185611ebb565b8281036020840152610c578185612171565b5f8151808452602084019350602083015f5b82811015611f065781516001600160a01b0316865260209586019590910190600101612208565b602081525f61062960208301846121f6565b5f5f60408385031215612252575f5ffd5b82356001600160401b03811115612267575f5ffd5b61227385828601611f44565b925050602083013561216681611d51565b602080825282518282018190525f918401906040840190835b818110156122c45783516001600160401b031683526020938401939092019160010161229d565b509095945050505050565b5f5f604083850312156122e0575f5ffd5b82356122eb81611d51565b915060208301356001600160401b03811115612305575f5ffd5b61180d85828601611f44565b5f5f5f60808486031215612323575f5ffd5b83356001600160401b03811115612338575f5ffd5b61234486828701611f44565b935050611e1e8560208601611d7b565b602081525f6106296020830184612171565b5f5f5f60608486031215612378575f5ffd5b833561238381611d51565b925060208401356001600160401b0381111561239d575f5ffd5b6123a986828701611f44565b9250506123b860408501611d68565b90509250925092565b634e487b7160e01b5f52603260045260245ffd5b805160208083015191908110156123f5575f198160200360031b1b821691505b50919050565b604081525f61240d60408301856121f6565b8281036020840152610c5781856121f6565b5f6020828403121561242f575f5ffd5b81516001600160401b03811115612444575f5ffd5b8201601f81018413612454575f5ffd5b8051612462611f6182611f22565b8082825260208201915060208360051b850101925086831115612483575f5ffd5b602084015b838110156125205780516001600160401b038111156124a5575f5ffd5b8501603f810189136124b5575f5ffd5b60208101516124c6611f6182611f22565b808282526020820191506020808460051b8601010192508b8311156124e9575f5ffd5b6040840193505b8284101561250b5783518252602093840193909101906124f0565b86525050602093840193919091019050612488565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908111156106de576106de61252b565b600f81810b9083900b016f7fffffffffffffffffffffffffffffff81136f7fffffffffffffffffffffffffffffff19821217156106de576106de61252b565b8082018281125f8312801582168215821617156125bc576125bc61252b565b505092915050565b818103818111156106de576106de61252b565b634e487b7160e01b5f52601260045260245ffd5b808201808211156106de576106de61252b565b5f8261261857634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212204718eed76a204ea1780faf1b5470936596e03edbc3e4a3dd4a5184e28c26efa364736f6c634300081e0033",
}
// AllocationManagerViewABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/CrossChainRegistry/binding.go b/pkg/bindings/CrossChainRegistry/binding.go
index d16c63e5f6..b8cb68d637 100644
--- a/pkg/bindings/CrossChainRegistry/binding.go
+++ b/pkg/bindings/CrossChainRegistry/binding.go
@@ -44,7 +44,7 @@ type OperatorSet struct {
// CrossChainRegistryMetaData contains all meta data concerning the CrossChainRegistry contract.
var CrossChainRegistryMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_keyRegistrar\",\"type\":\"address\",\"internalType\":\"contractIKeyRegistrar\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addChainIDsToWhitelist\",\"inputs\":[{\"name\":\"chainIDs\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"operatorTableUpdaters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorTableBytes\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createGenerationReservation\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorTableCalculator\",\"type\":\"address\",\"internalType\":\"contractIOperatorTableCalculator\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structICrossChainRegistryTypes.OperatorSetConfig\",\"components\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveGenerationReservationCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getActiveGenerationReservations\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getActiveGenerationReservationsByRange\",\"inputs\":[{\"name\":\"startIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"endIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetConfig\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structICrossChainRegistryTypes.OperatorSetConfig\",\"components\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorTableCalculator\",\"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\":\"contractIOperatorTableCalculator\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTableUpdateCadence\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasActiveGenerationReservation\",\"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\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialTableUpdateCadence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"keyRegistrar\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIKeyRegistrar\"}],\"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\":\"removeChainIDsFromWhitelist\",\"inputs\":[{\"name\":\"chainIDs\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeGenerationReservation\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorSetConfig\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structICrossChainRegistryTypes.OperatorSetConfig\",\"components\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorTableCalculator\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorTableCalculator\",\"type\":\"address\",\"internalType\":\"contractIOperatorTableCalculator\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTableUpdateCadence\",\"inputs\":[{\"name\":\"tableUpdateCadence\",\"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\":\"ChainIDAddedToWhitelist\",\"inputs\":[{\"name\":\"chainID\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorTableUpdater\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainIDRemovedFromWhitelist\",\"inputs\":[{\"name\":\"chainID\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GenerationReservationCreated\",\"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\":\"GenerationReservationRemoved\",\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetConfigRemoved\",\"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\":\"OperatorSetConfigSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structICrossChainRegistryTypes.OperatorSetConfig\",\"components\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorTableCalculatorRemoved\",\"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\":\"OperatorTableCalculatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorTableCalculator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIOperatorTableCalculator\"}],\"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\":\"TableUpdateCadenceSet\",\"inputs\":[{\"name\":\"tableUpdateCadence\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"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\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainIDAlreadyWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainIDNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyChainIDsArray\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GenerationReservationAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GenerationReservationDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidChainId\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEndIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStalenessPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTableUpdateCadence\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"KeyTypeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]}]",
- Bin: "0x610100604052348015610010575f5ffd5b506040516125b73803806125b783398101604081905261002f9161015b565b818484836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805291821660a052811660c0521660e05261007f610088565b505050506101b7565b5f54610100900460ff16156100f35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610142575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610158575f5ffd5b50565b5f5f5f5f6080858703121561016e575f5ffd5b845161017981610144565b602086015190945061018a81610144565b604086015190935061019b81610144565b60608601519092506101ac81610144565b939692955090935050565b60805160a05160c05160e05161238e6102295f395f81816102db0152611a3101525f818161027c015281816109dc015261107001525f81816103db01528181610762015281816108d501528181610b6b0152610fc701525f818161036d015281816116590152611928015261238e5ff3fe608060405234801561000f575f5ffd5b50600436106101c6575f3560e01c8063715018a6116100fe578063ca8aa7c71161009e578063d9a6729e1161006e578063d9a6729e14610438578063dfbd9dfd1461044b578063f2fde38b1461045e578063fabc1cbc14610471575f5ffd5b8063ca8aa7c7146103d6578063d09b978b146103fd578063d504491114610412578063d6db9e2514610425575f5ffd5b80638da5cb5b116100d95780638da5cb5b1461038f578063ac505f4b146103a0578063b186a60e146103b8578063c4bffe2b146103c0575f5ffd5b8063715018a61461034d57806375e4b53914610355578063886f119514610368575f5ffd5b80633ec45c7e11610169578063595c6a6711610144578063595c6a67146102fd5780635ac86ab7146103055780635c975abb146103285780636c55a37f1461033a575f5ffd5b80633ec45c7e1461027757806341ee6d0e146102b65780634657e26a146102d6575f5ffd5b80631ca9142a116101a45780631ca9142a1461020557806321fa7fdc14610218578063277e1e621461024157806336b200de14610254575f5ffd5b806304e98be3146101ca5780630f19aaef146101df578063136439dd146101f2575b5f5ffd5b6101dd6101d8366004611c81565b610484565b005b6101dd6101ed366004611d19565b6105c8565b6101dd610200366004611d55565b6106ee565b6101dd610213366004611d82565b610728565b61022b610226366004611e5b565b61083b565b6040516102389190611e93565b60405180910390f35b6101dd61024f366004611ea1565b61089b565b610267610262366004611e5b565b6109bc565b6040519015158152602001610238565b61029e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610238565b6102c96102c4366004611ed4565b6109d7565b6040516102389190611f1c565b61029e7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd610b1e565b610267610313366004611f2e565b606654600160ff9092169190911b9081161490565b6066545b604051908152602001610238565b6101dd610348366004611ed4565b610b32565b6101dd610d38565b61029e610363366004611e5b565b610d49565b61029e7f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b031661029e565b609e5460405163ffffffff9091168152602001610238565b61032c610d75565b6103c8610d85565b604051610238929190611f4e565b61029e7f000000000000000000000000000000000000000000000000000000000000000081565b610405610e9b565b6040516102389190611fd7565b6101dd610420366004612024565b610f8e565b6101dd610433366004612068565b6111b7565b610405610446366004612081565b6111cb565b6101dd6104593660046120a1565b611315565b6101dd61046c3660046120e0565b6113bb565b6101dd61047f366004611d55565b611431565b61048c61149e565b6003610497816114f8565b8382146104b75760405163512509d360e11b815260040160405180910390fd5b5f5b848110156105c0575f8686838181106104d4576104d46120fb565b905060200201359050805f036104fd57604051633d23e4d160e11b815260040160405180910390fd5b61053181868685818110610513576105136120fb565b905060200201602081019061052891906120e0565b609b9190611523565b61054e576040516324bf631b60e11b815260040160405180910390fd5b7f7a0a76d85b582b17996dd7371a407aa7a79b870db8539247fba315c7b6beff6281868685818110610582576105826120fb565b905060200201602081019061059791906120e0565b604080519283526001600160a01b0390911660208301520160405180910390a1506001016104b9565b505050505050565b5f54610100900460ff16158080156105e657505f54600160ff909116105b806105ff5750303b1580156105ff57505f5460ff166001145b6106675760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015610688575f805461ff0019166101001790555b61069184611542565b61069a83611593565b6106a382611607565b80156106e8575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6106f6611644565b606654818116811461071b5760405163c61dca5d60e01b815260040160405180910390fd5b61072482611607565b5050565b6001610733816114f8565b61074060208401846120e0565b610749816116e7565b6040516304c1b8eb60e31b815284906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610797908490600401612140565b602060405180830381865afa1580156107b2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d6919061214e565b6107f357604051631fb1705560e21b815260040160405180910390fd5b8461080661026236839003830183611e5b565b61082357604051634d2baea960e11b815260040160405180910390fd5b6105c061083536889003880188611e5b565b8661170d565b604080518082019091525f8082526020820152609a5f61085a84611787565b815260208082019290925260409081015f208151808301909252546001600160a01b0381168252600160a01b900463ffffffff169181019190915292915050565b60026108a6816114f8565b6108b360208401846120e0565b6108bc816116e7565b6040516304c1b8eb60e31b815284906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc7589061090a908490600401612140565b602060405180830381865afa158015610925573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610949919061214e565b61096657604051631fb1705560e21b815260040160405180910390fd5b8461097961026236839003830183611e5b565b61099657604051634d2baea960e11b815260040160405180910390fd5b6105c06109a836889003880188611e5b565b6109b736889003880188611e5b565b6117ea565b5f6109d16109c983611787565b6097906118b3565b92915050565b6060817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637cffe48c846040518263ffffffff1660e01b8152600401610a269190612140565b602060405180830381865afa158015610a41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a65919061216d565b610a7761022636869003860186611e5b565b610a8961036336879003870187611e5b565b6001600160a01b03166341ee6d0e866040518263ffffffff1660e01b8152600401610ab49190612140565b5f60405180830381865afa158015610ace573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610af5919081019061218b565b604051602001610b089493929190612233565b6040516020818303038152906040529050919050565b610b26611644565b610b305f19611607565b565b5f610b3c816114f8565b610b4960208301836120e0565b610b52816116e7565b6040516304c1b8eb60e31b815283906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610ba0908490600401612140565b602060405180830381865afa158015610bbb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bdf919061214e565b610bfc57604051631fb1705560e21b815260040160405180910390fd5b83610c0f61026236839003830183611e5b565b610c2c57604051634d2baea960e11b815260040160405180910390fd5b5f610c44610c3f36889003880188611e5b565b611787565b5f818152609960205260409081902080546001600160a01b0319169055519091507fd7811913efd5d98fc7ea0d1fdd022b3d31987815360842d05b1d1cf55578d16a90610c92908890612140565b60405180910390a15f818152609a60205260409081902080546001600160c01b0319169055517f210a1118a869246162804e2a7f21ef808ebd93f4be7ed512014fe29a7a8be02e90610ce5908890612140565b60405180910390a1610cf86097826118ca565b507f4ffdfdd59e9e1e3c301608788f78dd458e61cb8c045ca92b62a7b484c80824fb86604051610d289190612140565b60405180910390a1505050505050565b610d4061149e565b610b305f611542565b5f60995f610d5684611787565b815260208101919091526040015f20546001600160a01b031692915050565b5f610d8060976118d5565b905090565b6060805f610d93609b6118de565b90505f8167ffffffffffffffff811115610daf57610daf611db8565b604051908082528060200260200182016040528015610dd8578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610df557610df5611db8565b604051908082528060200260200182016040528015610e1e578160200160208202803683370190505b5090505f5b83811015610e90575f80610e38609b846118e8565b9150915081858481518110610e4f57610e4f6120fb565b60200260200101818152505080848481518110610e6e57610e6e6120fb565b6001600160a01b03909216602092830291909101909101525050600101610e23565b509094909350915050565b60605f610ea860976118d5565b90505f8167ffffffffffffffff811115610ec457610ec4611db8565b604051908082528060200260200182016040528015610f0857816020015b604080518082019091525f8082526020820152815260200190600190039081610ee25790505b5090505f5b82811015610f87575f610f21609783611905565b90505f610f5d82604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b905080848481518110610f7257610f726120fb565b60209081029190910101525050600101610f0d565b5092915050565b5f610f98816114f8565b610fa560208501856120e0565b610fae816116e7565b6040516304c1b8eb60e31b815285906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610ffc908490600401612140565b602060405180830381865afa158015611017573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103b919061214e565b61105857604051631fb1705560e21b815260040160405180910390fd5b5f604051631f3ff92360e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cffe48c906110a5908a90600401612140565b602060405180830381865afa1580156110c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e4919061216d565b60028111156110f5576110f561221f565b036111135760405163e57cacbd60e01b815260040160405180910390fd5b611130611128610c3f36899003890189611e5b565b609790611910565b61114d57604051631883461560e01b815260040160405180910390fd5b7f4fb6efec7dd60036ce3a7af8d5c48425019daa0fb61eb471a966a7ac2c6fa6a68660405161117c9190612140565b60405180910390a161119661083536889003880188611e5b565b6105c06111a836889003880188611e5b565b6109b736879003870187611e5b565b6111bf61149e565b6111c881611593565b50565b6060818311156111ee5760405163561ce9bb60e01b815260040160405180910390fd5b6111f860976118d5565b821115611218576040516302da361360e61b815260040160405180910390fd5b5f611223848461229f565b90505f8167ffffffffffffffff81111561123f5761123f611db8565b60405190808252806020026020018201604052801561128357816020015b604080518082019091525f808252602082015281526020019060019003908161125d5790505b5090505f5b8281101561130c575f6112a661129e83896122b2565b609790611905565b90505f6112e282604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b9050808484815181106112f7576112f76120fb565b60209081029190910101525050600101611288565b50949350505050565b61131d61149e565b6003611328816114f8565b5f5b828110156106e8575f848483818110611345576113456120fb565b90506020020135905061136281609b61191b90919063ffffffff16565b61137f5760405163b3f92ba160e01b815260040160405180910390fd5b6040518181527f6824d36084ecf2cd819b137cb5d837cc6e73afce1e0e348c9fdecaa81d0341e59060200160405180910390a15060010161132a565b6113c361149e565b6001600160a01b0381166114285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161065e565b6111c881611542565b611439611926565b606654801982198116146114605760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6033546001600160a01b03163314610b305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065e565b606654600160ff83161b908116036111c85760405163840a48d560e01b815260040160405180910390fd5b5f61153884846001600160a01b0385166119d7565b90505b9392505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8163ffffffff16116115b9576040516316d98e1b60e31b815260040160405180910390fd5b609e805463ffffffff191663ffffffff83169081179091556040519081527f4fbcd0cca70015b33db8af4aa4f2bd6fd6c1efa9460b8e2333f252c1467a63279060200160405180910390a150565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156116a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ca919061214e565b610b3057604051631d77d47760e21b815260040160405180910390fd5b6116f0816119f3565b6111c85760405163932d94f760e01b815260040160405180910390fd5b8060995f61171a85611787565b81526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055507f7f7ccafd92d20fdb39dee184a0dce002a9da420ed0def461f2a027abc9b3f6df828260405161177b9291906122c5565b60405180910390a15050565b5f815f0151826020015163ffffffff166040516020016117d292919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526109d1906122eb565b602081015163ffffffff1615806118115750609e54602082015163ffffffff918216911610155b61182e57604051632e46483160e11b815260040160405180910390fd5b80609a5f61183b85611787565b815260208082019290925260409081015f2083518154949093015163ffffffff16600160a01b026001600160c01b03199094166001600160a01b0390931692909217929092179055517f3147846ee526009000671c20380b856a633345691300f82585f90034715cf0e29061177b908490849061230e565b5f818152600183016020526040812054151561153b565b5f61153b8383611a9c565b5f6109d1825490565b5f6109d182611b7f565b5f8080806118f68686611b89565b909450925050505b9250929050565b5f61153b8383611bb2565b5f61153b8383611bd8565b5f61153b8383611c24565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611982573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a69190612329565b6001600160a01b0316336001600160a01b031614610b305760405163794821ff60e01b815260040160405180910390fd5b5f82815260028401602052604081208290556115388484611910565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb890608401602060405180830381865afa158015611a78573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d1919061214e565b5f8181526001830160205260408120548015611b76575f611abe60018361229f565b85549091505f90611ad19060019061229f565b9050818114611b30575f865f018281548110611aef57611aef6120fb565b905f5260205f200154905080875f018481548110611b0f57611b0f6120fb565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080611b4157611b41612344565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506109d1565b5f9150506109d1565b5f6109d1826118d5565b5f8080611b968585611905565b5f81815260029690960160205260409095205494959350505050565b5f825f018281548110611bc757611bc76120fb565b905f5260205f200154905092915050565b5f818152600183016020526040812054611c1d57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556109d1565b505f6109d1565b5f818152600283016020526040812081905561153b83836118ca565b5f5f83601f840112611c50575f5ffd5b50813567ffffffffffffffff811115611c67575f5ffd5b6020830191508360208260051b85010111156118fe575f5ffd5b5f5f5f5f60408587031215611c94575f5ffd5b843567ffffffffffffffff811115611caa575f5ffd5b611cb687828801611c40565b909550935050602085013567ffffffffffffffff811115611cd5575f5ffd5b611ce187828801611c40565b95989497509550505050565b6001600160a01b03811681146111c8575f5ffd5b803563ffffffff81168114611d14575f5ffd5b919050565b5f5f5f60608486031215611d2b575f5ffd5b8335611d3681611ced565b9250611d4460208501611d01565b929592945050506040919091013590565b5f60208284031215611d65575f5ffd5b5035919050565b5f60408284031215611d7c575f5ffd5b50919050565b5f5f60608385031215611d93575f5ffd5b611d9d8484611d6c565b91506040830135611dad81611ced565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611df557611df5611db8565b604052919050565b5f60408284031215611e0d575f5ffd5b6040805190810167ffffffffffffffff81118282101715611e3057611e30611db8565b6040529050808235611e4181611ced565b8152611e4f60208401611d01565b60208201525092915050565b5f60408284031215611e6b575f5ffd5b61153b8383611dfd565b80516001600160a01b0316825260209081015163ffffffff16910152565b604081016109d18284611e75565b5f5f60808385031215611eb2575f5ffd5b611ebc8484611d6c565b9150611ecb8460408501611d6c565b90509250929050565b5f60408284031215611ee4575f5ffd5b61153b8383611d6c565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61153b6020830184611eee565b5f60208284031215611f3e575f5ffd5b813560ff8116811461153b575f5ffd5b604080825283519082018190525f9060208501906060840190835b81811015611f87578351835260209384019390920191600101611f69565b5050838103602080860191909152855180835291810192508501905f5b81811015611fcb5782516001600160a01b0316845260209384019390920191600101611fa4565b50919695505050505050565b602080825282518282018190525f918401906040840190835b8181101561201957612003838551611e75565b6020939093019260409290920191600101611ff0565b509095945050505050565b5f5f5f60a08486031215612036575f5ffd5b6120408585611d6c565b9250604084013561205081611ced565b915061205f8560608601611d6c565b90509250925092565b5f60208284031215612078575f5ffd5b61153b82611d01565b5f5f60408385031215612092575f5ffd5b50508035926020909101359150565b5f5f602083850312156120b2575f5ffd5b823567ffffffffffffffff8111156120c8575f5ffd5b6120d485828601611c40565b90969095509350505050565b5f602082840312156120f0575f5ffd5b813561153b81611ced565b634e487b7160e01b5f52603260045260245ffd5b803561211a81611ced565b6001600160a01b0316825263ffffffff61213660208301611d01565b1660208301525050565b604081016109d1828461210f565b5f6020828403121561215e575f5ffd5b8151801515811461153b575f5ffd5b5f6020828403121561217d575f5ffd5b81516003811061153b575f5ffd5b5f6020828403121561219b575f5ffd5b815167ffffffffffffffff8111156121b1575f5ffd5b8201601f810184136121c1575f5ffd5b805167ffffffffffffffff8111156121db576121db611db8565b6121ee601f8201601f1916602001611dcc565b818152856020838501011115612202575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b634e487b7160e01b5f52602160045260245ffd5b61223d818661210f565b5f6003851061225a57634e487b7160e01b5f52602160045260245ffd5b84604083015261226d6060830185611e75565b60c060a083015261228160c0830184611eee565b9695505050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156109d1576109d161228b565b808201808211156109d1576109d161228b565b606081016122d38285611e75565b6001600160a01b039290921660409190910152919050565b80516020808301519190811015611d7c575f1960209190910360031b1b16919050565b6080810161231c8285611e75565b61153b6040830184611e75565b5f60208284031215612339575f5ffd5b815161153b81611ced565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220f685f7d0a4d120a72e61d79bc97180016ad68105afbc7344691535eab3af42ca64736f6c634300081e0033",
+ Bin: "0x610100604052348015610010575f5ffd5b506040516125b73803806125b783398101604081905261002f9161015b565b818484836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805291821660a052811660c0521660e05261007f610088565b505050506101b7565b5f54610100900460ff16156100f35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610142575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610158575f5ffd5b50565b5f5f5f5f6080858703121561016e575f5ffd5b845161017981610144565b602086015190945061018a81610144565b604086015190935061019b81610144565b60608601519092506101ac81610144565b939692955090935050565b60805160a05160c05160e05161238e6102295f395f81816102db0152611a3101525f818161027c015281816109dc015261107001525f81816103db01528181610762015281816108d501528181610b6b0152610fc701525f818161036d015281816116590152611928015261238e5ff3fe608060405234801561000f575f5ffd5b50600436106101c6575f3560e01c8063715018a6116100fe578063ca8aa7c71161009e578063d9a6729e1161006e578063d9a6729e14610438578063dfbd9dfd1461044b578063f2fde38b1461045e578063fabc1cbc14610471575f5ffd5b8063ca8aa7c7146103d6578063d09b978b146103fd578063d504491114610412578063d6db9e2514610425575f5ffd5b80638da5cb5b116100d95780638da5cb5b1461038f578063ac505f4b146103a0578063b186a60e146103b8578063c4bffe2b146103c0575f5ffd5b8063715018a61461034d57806375e4b53914610355578063886f119514610368575f5ffd5b80633ec45c7e11610169578063595c6a6711610144578063595c6a67146102fd5780635ac86ab7146103055780635c975abb146103285780636c55a37f1461033a575f5ffd5b80633ec45c7e1461027757806341ee6d0e146102b65780634657e26a146102d6575f5ffd5b80631ca9142a116101a45780631ca9142a1461020557806321fa7fdc14610218578063277e1e621461024157806336b200de14610254575f5ffd5b806304e98be3146101ca5780630f19aaef146101df578063136439dd146101f2575b5f5ffd5b6101dd6101d8366004611c81565b610484565b005b6101dd6101ed366004611d19565b6105c8565b6101dd610200366004611d55565b6106ee565b6101dd610213366004611d82565b610728565b61022b610226366004611e5b565b61083b565b6040516102389190611e93565b60405180910390f35b6101dd61024f366004611ea1565b61089b565b610267610262366004611e5b565b6109bc565b6040519015158152602001610238565b61029e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610238565b6102c96102c4366004611ed4565b6109d7565b6040516102389190611f1c565b61029e7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd610b1e565b610267610313366004611f2e565b606654600160ff9092169190911b9081161490565b6066545b604051908152602001610238565b6101dd610348366004611ed4565b610b32565b6101dd610d38565b61029e610363366004611e5b565b610d49565b61029e7f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b031661029e565b609e5460405163ffffffff9091168152602001610238565b61032c610d75565b6103c8610d85565b604051610238929190611f4e565b61029e7f000000000000000000000000000000000000000000000000000000000000000081565b610405610e9b565b6040516102389190611fd7565b6101dd610420366004612024565b610f8e565b6101dd610433366004612068565b6111b7565b610405610446366004612081565b6111cb565b6101dd6104593660046120a1565b611315565b6101dd61046c3660046120e0565b6113bb565b6101dd61047f366004611d55565b611431565b61048c61149e565b6003610497816114f8565b8382146104b75760405163512509d360e11b815260040160405180910390fd5b5f5b848110156105c0575f8686838181106104d4576104d46120fb565b905060200201359050805f036104fd57604051633d23e4d160e11b815260040160405180910390fd5b61053181868685818110610513576105136120fb565b905060200201602081019061052891906120e0565b609b9190611523565b61054e576040516324bf631b60e11b815260040160405180910390fd5b7f7a0a76d85b582b17996dd7371a407aa7a79b870db8539247fba315c7b6beff6281868685818110610582576105826120fb565b905060200201602081019061059791906120e0565b604080519283526001600160a01b0390911660208301520160405180910390a1506001016104b9565b505050505050565b5f54610100900460ff16158080156105e657505f54600160ff909116105b806105ff5750303b1580156105ff57505f5460ff166001145b6106675760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015610688575f805461ff0019166101001790555b61069184611542565b61069a83611593565b6106a382611607565b80156106e8575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6106f6611644565b606654818116811461071b5760405163c61dca5d60e01b815260040160405180910390fd5b61072482611607565b5050565b6001610733816114f8565b61074060208401846120e0565b610749816116e7565b6040516304c1b8eb60e31b815284906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610797908490600401612140565b602060405180830381865afa1580156107b2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d6919061214e565b6107f357604051631fb1705560e21b815260040160405180910390fd5b8461080661026236839003830183611e5b565b61082357604051634d2baea960e11b815260040160405180910390fd5b6105c061083536889003880188611e5b565b8661170d565b604080518082019091525f8082526020820152609a5f61085a84611787565b815260208082019290925260409081015f208151808301909252546001600160a01b0381168252600160a01b900463ffffffff169181019190915292915050565b60026108a6816114f8565b6108b360208401846120e0565b6108bc816116e7565b6040516304c1b8eb60e31b815284906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc7589061090a908490600401612140565b602060405180830381865afa158015610925573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610949919061214e565b61096657604051631fb1705560e21b815260040160405180910390fd5b8461097961026236839003830183611e5b565b61099657604051634d2baea960e11b815260040160405180910390fd5b6105c06109a836889003880188611e5b565b6109b736889003880188611e5b565b6117ea565b5f6109d16109c983611787565b6097906118b3565b92915050565b6060817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637cffe48c846040518263ffffffff1660e01b8152600401610a269190612140565b602060405180830381865afa158015610a41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a65919061216d565b610a7761022636869003860186611e5b565b610a8961036336879003870187611e5b565b6001600160a01b03166341ee6d0e866040518263ffffffff1660e01b8152600401610ab49190612140565b5f60405180830381865afa158015610ace573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610af5919081019061218b565b604051602001610b089493929190612233565b6040516020818303038152906040529050919050565b610b26611644565b610b305f19611607565b565b5f610b3c816114f8565b610b4960208301836120e0565b610b52816116e7565b6040516304c1b8eb60e31b815283906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610ba0908490600401612140565b602060405180830381865afa158015610bbb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bdf919061214e565b610bfc57604051631fb1705560e21b815260040160405180910390fd5b83610c0f61026236839003830183611e5b565b610c2c57604051634d2baea960e11b815260040160405180910390fd5b5f610c44610c3f36889003880188611e5b565b611787565b5f818152609960205260409081902080546001600160a01b0319169055519091507fd7811913efd5d98fc7ea0d1fdd022b3d31987815360842d05b1d1cf55578d16a90610c92908890612140565b60405180910390a15f818152609a60205260409081902080546001600160c01b0319169055517f210a1118a869246162804e2a7f21ef808ebd93f4be7ed512014fe29a7a8be02e90610ce5908890612140565b60405180910390a1610cf86097826118ca565b507f4ffdfdd59e9e1e3c301608788f78dd458e61cb8c045ca92b62a7b484c80824fb86604051610d289190612140565b60405180910390a1505050505050565b610d4061149e565b610b305f611542565b5f60995f610d5684611787565b815260208101919091526040015f20546001600160a01b031692915050565b5f610d8060976118d5565b905090565b6060805f610d93609b6118de565b90505f8167ffffffffffffffff811115610daf57610daf611db8565b604051908082528060200260200182016040528015610dd8578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610df557610df5611db8565b604051908082528060200260200182016040528015610e1e578160200160208202803683370190505b5090505f5b83811015610e90575f80610e38609b846118e8565b9150915081858481518110610e4f57610e4f6120fb565b60200260200101818152505080848481518110610e6e57610e6e6120fb565b6001600160a01b03909216602092830291909101909101525050600101610e23565b509094909350915050565b60605f610ea860976118d5565b90505f8167ffffffffffffffff811115610ec457610ec4611db8565b604051908082528060200260200182016040528015610f0857816020015b604080518082019091525f8082526020820152815260200190600190039081610ee25790505b5090505f5b82811015610f87575f610f21609783611905565b90505f610f5d82604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b905080848481518110610f7257610f726120fb565b60209081029190910101525050600101610f0d565b5092915050565b5f610f98816114f8565b610fa560208501856120e0565b610fae816116e7565b6040516304c1b8eb60e31b815285906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610ffc908490600401612140565b602060405180830381865afa158015611017573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103b919061214e565b61105857604051631fb1705560e21b815260040160405180910390fd5b5f604051631f3ff92360e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cffe48c906110a5908a90600401612140565b602060405180830381865afa1580156110c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e4919061216d565b60028111156110f5576110f561221f565b036111135760405163e57cacbd60e01b815260040160405180910390fd5b611130611128610c3f36899003890189611e5b565b609790611910565b61114d57604051631883461560e01b815260040160405180910390fd5b7f4fb6efec7dd60036ce3a7af8d5c48425019daa0fb61eb471a966a7ac2c6fa6a68660405161117c9190612140565b60405180910390a161119661083536889003880188611e5b565b6105c06111a836889003880188611e5b565b6109b736879003870187611e5b565b6111bf61149e565b6111c881611593565b50565b6060818311156111ee5760405163561ce9bb60e01b815260040160405180910390fd5b6111f860976118d5565b821115611218576040516302da361360e61b815260040160405180910390fd5b5f611223848461229f565b90505f8167ffffffffffffffff81111561123f5761123f611db8565b60405190808252806020026020018201604052801561128357816020015b604080518082019091525f808252602082015281526020019060019003908161125d5790505b5090505f5b8281101561130c575f6112a661129e83896122b2565b609790611905565b90505f6112e282604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b9050808484815181106112f7576112f76120fb565b60209081029190910101525050600101611288565b50949350505050565b61131d61149e565b6003611328816114f8565b5f5b828110156106e8575f848483818110611345576113456120fb565b90506020020135905061136281609b61191b90919063ffffffff16565b61137f5760405163b3f92ba160e01b815260040160405180910390fd5b6040518181527f6824d36084ecf2cd819b137cb5d837cc6e73afce1e0e348c9fdecaa81d0341e59060200160405180910390a15060010161132a565b6113c361149e565b6001600160a01b0381166114285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161065e565b6111c881611542565b611439611926565b606654801982198116146114605760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6033546001600160a01b03163314610b305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065e565b606654600160ff83161b908116036111c85760405163840a48d560e01b815260040160405180910390fd5b5f61153884846001600160a01b0385166119d7565b90505b9392505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8163ffffffff16116115b9576040516316d98e1b60e31b815260040160405180910390fd5b609e805463ffffffff191663ffffffff83169081179091556040519081527f4fbcd0cca70015b33db8af4aa4f2bd6fd6c1efa9460b8e2333f252c1467a63279060200160405180910390a150565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156116a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ca919061214e565b610b3057604051631d77d47760e21b815260040160405180910390fd5b6116f0816119f3565b6111c85760405163932d94f760e01b815260040160405180910390fd5b8060995f61171a85611787565b81526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055507f7f7ccafd92d20fdb39dee184a0dce002a9da420ed0def461f2a027abc9b3f6df828260405161177b9291906122c5565b60405180910390a15050565b5f815f0151826020015163ffffffff166040516020016117d292919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526109d1906122eb565b602081015163ffffffff1615806118115750609e54602082015163ffffffff918216911610155b61182e57604051632e46483160e11b815260040160405180910390fd5b80609a5f61183b85611787565b815260208082019290925260409081015f2083518154949093015163ffffffff16600160a01b026001600160c01b03199094166001600160a01b0390931692909217929092179055517f3147846ee526009000671c20380b856a633345691300f82585f90034715cf0e29061177b908490849061230e565b5f818152600183016020526040812054151561153b565b5f61153b8383611a9c565b5f6109d1825490565b5f6109d182611b7f565b5f8080806118f68686611b89565b909450925050505b9250929050565b5f61153b8383611bb2565b5f61153b8383611bd8565b5f61153b8383611c24565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611982573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a69190612329565b6001600160a01b0316336001600160a01b031614610b305760405163794821ff60e01b815260040160405180910390fd5b5f82815260028401602052604081208290556115388484611910565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb890608401602060405180830381865afa158015611a78573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d1919061214e565b5f8181526001830160205260408120548015611b76575f611abe60018361229f565b85549091505f90611ad19060019061229f565b9050818114611b30575f865f018281548110611aef57611aef6120fb565b905f5260205f200154905080875f018481548110611b0f57611b0f6120fb565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080611b4157611b41612344565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506109d1565b5f9150506109d1565b5f6109d1826118d5565b5f8080611b968585611905565b5f81815260029690960160205260409095205494959350505050565b5f825f018281548110611bc757611bc76120fb565b905f5260205f200154905092915050565b5f818152600183016020526040812054611c1d57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556109d1565b505f6109d1565b5f818152600283016020526040812081905561153b83836118ca565b5f5f83601f840112611c50575f5ffd5b50813567ffffffffffffffff811115611c67575f5ffd5b6020830191508360208260051b85010111156118fe575f5ffd5b5f5f5f5f60408587031215611c94575f5ffd5b843567ffffffffffffffff811115611caa575f5ffd5b611cb687828801611c40565b909550935050602085013567ffffffffffffffff811115611cd5575f5ffd5b611ce187828801611c40565b95989497509550505050565b6001600160a01b03811681146111c8575f5ffd5b803563ffffffff81168114611d14575f5ffd5b919050565b5f5f5f60608486031215611d2b575f5ffd5b8335611d3681611ced565b9250611d4460208501611d01565b929592945050506040919091013590565b5f60208284031215611d65575f5ffd5b5035919050565b5f60408284031215611d7c575f5ffd5b50919050565b5f5f60608385031215611d93575f5ffd5b611d9d8484611d6c565b91506040830135611dad81611ced565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611df557611df5611db8565b604052919050565b5f60408284031215611e0d575f5ffd5b6040805190810167ffffffffffffffff81118282101715611e3057611e30611db8565b6040529050808235611e4181611ced565b8152611e4f60208401611d01565b60208201525092915050565b5f60408284031215611e6b575f5ffd5b61153b8383611dfd565b80516001600160a01b0316825260209081015163ffffffff16910152565b604081016109d18284611e75565b5f5f60808385031215611eb2575f5ffd5b611ebc8484611d6c565b9150611ecb8460408501611d6c565b90509250929050565b5f60408284031215611ee4575f5ffd5b61153b8383611d6c565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61153b6020830184611eee565b5f60208284031215611f3e575f5ffd5b813560ff8116811461153b575f5ffd5b604080825283519082018190525f9060208501906060840190835b81811015611f87578351835260209384019390920191600101611f69565b5050838103602080860191909152855180835291810192508501905f5b81811015611fcb5782516001600160a01b0316845260209384019390920191600101611fa4565b50919695505050505050565b602080825282518282018190525f918401906040840190835b8181101561201957612003838551611e75565b6020939093019260409290920191600101611ff0565b509095945050505050565b5f5f5f60a08486031215612036575f5ffd5b6120408585611d6c565b9250604084013561205081611ced565b915061205f8560608601611d6c565b90509250925092565b5f60208284031215612078575f5ffd5b61153b82611d01565b5f5f60408385031215612092575f5ffd5b50508035926020909101359150565b5f5f602083850312156120b2575f5ffd5b823567ffffffffffffffff8111156120c8575f5ffd5b6120d485828601611c40565b90969095509350505050565b5f602082840312156120f0575f5ffd5b813561153b81611ced565b634e487b7160e01b5f52603260045260245ffd5b803561211a81611ced565b6001600160a01b0316825263ffffffff61213660208301611d01565b1660208301525050565b604081016109d1828461210f565b5f6020828403121561215e575f5ffd5b8151801515811461153b575f5ffd5b5f6020828403121561217d575f5ffd5b81516003811061153b575f5ffd5b5f6020828403121561219b575f5ffd5b815167ffffffffffffffff8111156121b1575f5ffd5b8201601f810184136121c1575f5ffd5b805167ffffffffffffffff8111156121db576121db611db8565b6121ee601f8201601f1916602001611dcc565b818152856020838501011115612202575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b634e487b7160e01b5f52602160045260245ffd5b61223d818661210f565b5f6003851061225a57634e487b7160e01b5f52602160045260245ffd5b84604083015261226d6060830185611e75565b60c060a083015261228160c0830184611eee565b9695505050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156109d1576109d161228b565b808201808211156109d1576109d161228b565b606081016122d38285611e75565b6001600160a01b039290921660409190910152919050565b80516020808301519190811015611d7c575f1960209190910360031b1b16919050565b6080810161231c8285611e75565b61153b6040830184611e75565b5f60208284031215612339575f5ffd5b815161153b81611ced565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220358d3fadc945696dbb2efb48e4c245b15726a73a5c5dfa892c582f3474600d0364736f6c634300081e0033",
}
// CrossChainRegistryABI 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 370d0b3e95..b6067b2cb3 100644
--- a/pkg/bindings/DelegationManager/binding.go
+++ b/pkg/bindings/DelegationManager/binding.go
@@ -62,7 +62,7 @@ type OperatorSet struct {
// DelegationManagerMetaData contains all meta data concerning the DelegationManager contract.
var DelegationManagerMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_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\":\"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\":\"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\":\"slashOperatorShares\",\"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\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newMaxMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"totalDepositSharesToSlash\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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\":\"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\":\"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\":\"InvalidDepositScalingFactor\",\"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: "0x610160604052348015610010575f5ffd5b5060405161605338038061605383398101604081905261002f916101d9565b808084898989878a6001600160a01b03811661005e576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c052821660e05263ffffffff16610100521661012052610095816100b0565b61014052506100a490506100f6565b50505050505050610364565b5f5f829050601f815111156100e3578260405163305a27a960e01b81526004016100da9190610309565b60405180910390fd5b80516100ee8261033e565b179392505050565b5f54610100900460ff161561015d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100da565b5f5460ff908116146101ac575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101c2575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f5f60e0888a0312156101ef575f5ffd5b87516101fa816101ae565b602089015190975061020b816101ae565b604089015190965061021c816101ae565b606089015190955061022d816101ae565b608089015190945061023e816101ae565b60a089015190935063ffffffff81168114610257575f5ffd5b60c08901519092506001600160401b03811115610272575f5ffd5b88015f601f82018b13610283575f5ffd5b81516001600160401b0381111561029c5761029c6101c5565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102ca576102ca6101c5565b6040528181528382016020018d10156102e1575f5ffd5b8160208501602083015e5f602083830101528092508094505050505092959891949750929550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561035e575f198160200360031b1b821691505b50919050565b60805160a05160c05160e051610100516101205161014051615bfd6104565f395f8181610fc10152613dec01525f81816104120152613a7a01525f8181610703015281816131c7015281816134bd015261367601525f818161075301528181610cf301528181610eb60152818161103901528181611392015281816117f401528181612446015261414c01525f818161043901528181610e34015281816112f10152818161156501528181612d3701528181612f18015261333101525f818161036f01528181610e02015281816114b9015261330b01525f81816105e201528181612afd0152613e5b0152615bfd5ff3fe608060405234801561000f575f5ffd5b50600436106102b1575f3560e01c80636d70f7ae1161017b578063bb45fef2116100e4578063e4cc3f901161009e578063f698da2511610079578063f698da25146107ce578063fabc1cbc146107d6578063fd8aa88d146107e9578063fe4b84df146107fc575f5ffd5b8063e4cc3f9014610788578063eea9064b1461079b578063f0e0e676146107ae575f5ffd5b8063bb45fef2146106b9578063bfae3fd2146106e6578063c448feb8146106f9578063c978f7ac1461072d578063ca8aa7c71461074e578063da8be86414610775575f5ffd5b80639104c319116101355780639104c319146106175780639435bb431461063257806399f5371b14610645578063a178848414610665578063a33a343314610684578063b7f06ebe14610697575f5ffd5b80636d70f7ae1461057a5780636e1744481461058d578063778e55f3146105a057806378296ec5146105ca578063886f1195146105dd5780639004134714610604575f5ffd5b806354b7c96c1161021d5780635c975abb116101d75780635c975abb146104d45780635d975e88146104dc5780635dd68579146104fd57806360a0d1ce1461051e57806365da12641461053157806366d5ba9314610559575f5ffd5b806354b7c96c1461045b57806354fd4d501461046e578063595c6a6714610483578063597b36da1461048b5780635ac86ab71461049e5780635ae679a7146104c1575f5ffd5b806339b70e381161026e57806339b70e381461036a5780633c651cf2146103a95780633cdeb5e0146103bc5780633e28391d146103ea5780634657e26a1461040d5780634665bcda14610434575f5ffd5b806304a4f979146102b55780630b9f487a146102ef5780630dd8dd0214610302578063136439dd1461032257806325df922e146103375780632aa6d88814610357575b5f5ffd5b6102dc7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b6102dc6102fd366004614a86565b61080f565b610315610310366004614b1d565b610897565b6040516102e69190614b5b565b610335610330366004614b92565b610b09565b005b61034a610345366004614d27565b610b43565b6040516102e69190614dd5565b610335610365366004614e37565b610ca3565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102e6565b6103356103b7366004614e95565b610df7565b6103916103ca366004614ed8565b6001600160a01b039081165f908152609960205260409020600101541690565b6103fd6103f8366004614ed8565b610f4a565b60405190151581526020016102e6565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b610335610469366004614ef3565b610f69565b610476610fba565b6040516102e69190614f58565b610335610fea565b6102dc610499366004615026565b610ffe565b6103fd6104ac366004615057565b606654600160ff9092169190911b9081161490565b6102dc6104cf36600461508b565b61102d565b6066546102dc565b6104ef6104ea366004614b92565b61119f565b6040516102e69291906151c0565b61051061050b366004614ed8565b6111bc565b6040516102e6929190615232565b61033561052c36600461529f565b6112e6565b61039161053f366004614ed8565b609a6020525f90815260409020546001600160a01b031681565b61056c610567366004614ed8565b611491565b6040516102e69291906152de565b6103fd610588366004614ed8565b611791565b6102dc61059b366004614ef3565b6117c9565b6102dc6105ae366004614ef3565b609860209081525f928352604080842090915290825290205481565b6103356105d83660046152f0565b611873565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b61034a610612366004615340565b6118ec565b61039173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61033561064036600461538c565b6119c2565b610658610653366004614b92565b611a7d565b6040516102e69190615428565b6102dc610673366004614ed8565b609f6020525f908152604090205481565b61031561069236600461543a565b611b99565b6103fd6106a5366004614b92565b609e6020525f908152604090205460ff1681565b6103fd6106c7366004615521565b609c60209081525f928352604080842090915290825290205460ff1681565b6102dc6106f4366004614ef3565b611bb1565b60405163ffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526020016102e6565b61074061073b366004615340565b611bed565b6040516102e692919061554b565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b610315610783366004614ed8565b611e7a565b61033561079636600461556a565b611fa3565b6103356107a936600461543a565b611fdb565b6107c16107bc3660046155e8565b612046565b6040516102e69190615695565b6102dc6120eb565b6103356107e4366004614b92565b6121a4565b6103156107f7366004614ed8565b612212565b61033561080a366004614b92565b612235565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f9061088d9060e00160405160208183030381529060405280519060200120612346565b9695505050505050565b606060016108a481612374565b6108ac6123a2565b5f836001600160401b038111156108c5576108c5614ba9565b6040519080825280602002602001820160405280156108ee578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610afa57868682818110610928576109286156a7565b905060200281019061093a91906156bb565b6109489060208101906156d9565b905087878381811061095c5761095c6156a7565b905060200281019061096e91906156bb565b61097890806156d9565b905014610998576040516343714afd60e01b815260040160405180910390fd5b5f610a0233848a8a868181106109b0576109b06156a7565b90506020028101906109c291906156bb565b6109cc90806156d9565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506123fb92505050565b9050610ad433848a8a86818110610a1b57610a1b6156a7565b9050602002810190610a2d91906156bb565b610a3790806156d9565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610a7c57610a7c6156a7565b9050602002810190610a8e91906156bb565b610a9c9060208101906156d9565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525088925061254d915050565b848381518110610ae657610ae66156a7565b60209081029190910101525060010161090e565b5050600160c955949350505050565b610b11612ae8565b6066548181168114610b365760405163c61dca5d60e01b815260040160405180910390fd5b610b3f82612b8b565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610b6c8683876123fb565b90505f85516001600160401b03811115610b8857610b88614ba9565b604051908082528060200260200182016040528015610bb1578160200160208202803683370190505b5090505f5b8651811015610c96576001600160a01b0388165f90815260a260205260408120885182908a9085908110610bec57610bec6156a7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610c70878381518110610c3e57610c3e6156a7565b6020026020010151858481518110610c5857610c586156a7565b602002602001015183612bc89092919063ffffffff16565b838381518110610c8257610c826156a7565b602090810291909101015250600101610bb6565b50925050505b9392505050565b610cab6123a2565b610cb433610f4a565b15610cd257604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610d3c575f5ffd5b505af1158015610d4e573d5f5f3e3d5ffd5b50505050610d5c3385612be6565b610d663333612c48565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610ddf92919061571e565b60405180910390a2610df1600160c955565b50505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610e565750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610e735760405163045206a560e21b815260040160405180910390fd5b610e7b6123a2565b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015610efb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1f919061574c565b90505f610f2d878784612ed1565b9050610f3d838888888886612fb3565b505050610df1600160c955565b6001600160a01b039081165f908152609a602052604090205416151590565b81610f73816130f8565b610f7b6123a2565b610f8483611791565b610fa1576040516325ec6c1f60e01b815260040160405180910390fd5b610fab8383612be6565b610fb5600160c955565b505050565b6060610fe57f000000000000000000000000000000000000000000000000000000000000000061311e565b905090565b610ff2612ae8565b610ffc5f19612b8b565b565b5f816040516020016110109190615428565b604051602081830303815290604052805190602001209050919050565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611077576040516323d871a560e01b815260040160405180910390fd5b61107f6123a2565b6001600160a01b038088165f9081526098602090815260408083209388168352929052908120546110bd906001600160401b0380871690861661315b565b90505f6110cc89878787613173565b90506110d8818361577b565b92506110e6895f888561326a565b604080516001600160a01b038881168252602082018690528b16917fdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30910160405180910390a2611135866132e4565b6001600160a01b0316633fb99ca5898989876040518563ffffffff1660e01b8152600401611166949392919061578e565b5f604051808303815f87803b15801561117d575f5ffd5b505af115801561118f573d5f5f3e3d5ffd5b50505050505061088d600160c955565b6111a7614947565b60606111b283613356565b9094909350915050565b6060805f6111c984612212565b8051909150806001600160401b038111156111e6576111e6614ba9565b60405190808252806020026020018201604052801561121f57816020015b61120c614947565b8152602001906001900390816112045790505b509350806001600160401b0381111561123a5761123a614ba9565b60405190808252806020026020018201604052801561126d57816020015b60608152602001906001900390816112585790505b5092505f5b818110156112de5761129c83828151811061128f5761128f6156a7565b6020026020010151613356565b8683815181106112ae576112ae6156a7565b602002602001018684815181106112c7576112c76156a7565b602090810291909101019190915252600101611272565b505050915091565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461132f57604051633213a66160e21b815260040160405180910390fd5b6113376123a2565b61134083610f4a565b15610fab576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156113d7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113fb919061574c565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0845282528083208151928301909152548152919250611461866114596001600160401b038087169089166135a9565b8491906135bd565b9050611483848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08461326a565b50505050610fb5600160c955565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa1580156114fd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611524919081019061583e565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa1580156115aa573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ce91906158f9565b9050805f036115e257509094909350915050565b5f835160016115f1919061577b565b6001600160401b0381111561160857611608614ba9565b604051908082528060200260200182016040528015611631578160200160208202803683370190505b5090505f84516001611643919061577b565b6001600160401b0381111561165a5761165a614ba9565b604051908082528060200260200182016040528015611683578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0828651815181106116ae576116ae6156a7565b60200260200101906001600160a01b031690816001600160a01b03168152505082818651815181106116e2576116e26156a7565b60209081029190910101525f5b85518110156117835785818151811061170a5761170a6156a7565b6020026020010151838281518110611724576117246156a7565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611756576117566156a7565b6020026020010151828281518110611770576117706156a7565b60209081029190910101526001016116ef565b509097909650945050505050565b5f6001600160a01b038216158015906117c357506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611839573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061185d919061574c565b905061186b8484835f613173565b949350505050565b8261187d816130f8565b61188684611791565b6118a3576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b670809084846040516118de92919061571e565b60405180910390a250505050565b60605f82516001600160401b0381111561190857611908614ba9565b604051908082528060200260200182016040528015611931578160200160208202803683370190505b5090505f5b83518110156119ba576001600160a01b0385165f908152609860205260408120855190919086908490811061196d5761196d6156a7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20548282815181106119a7576119a76156a7565b6020908102919091010152600101611936565b509392505050565b60026119cd81612374565b6119d56123a2565b855f5b81811015611a6857611a608989838181106119f5576119f56156a7565b9050602002810190611a079190615910565b611a1090615924565b888884818110611a2257611a226156a7565b9050602002810190611a3491906156d9565b888886818110611a4657611a466156a7565b9050602002016020810190611a5b919061592f565b6135db565b6001016119d8565b5050611a74600160c955565b50505050505050565b611a85614947565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a08601939290830182828015611b3357602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611b15575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015611b8957602002820191905f5260205f20905b815481526020019060010190808311611b75575b5050505050815250509050919050565b6060611ba433611e7a565b9050610c9c848484611fdb565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610c9c90613a1d565b60608082516001600160401b03811115611c0957611c09614ba9565b604051908082528060200260200182016040528015611c32578160200160208202803683370190505b50915082516001600160401b03811115611c4e57611c4e614ba9565b604051908082528060200260200182016040528015611c77578160200160208202803683370190505b506001600160a01b038086165f908152609a6020526040812054929350911690611ca28683876123fb565b90505f5b8551811015611e6f575f611cd2878381518110611cc557611cc56156a7565b60200260200101516132e4565b9050806001600160a01b031663fe243a1789898581518110611cf657611cf66156a7565b60200260200101516040518363ffffffff1660e01b8152600401611d309291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015611d4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d6f91906158f9565b858381518110611d8157611d816156a7565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f898581518110611dc457611dc46156a7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050611e48868481518110611e1657611e166156a7565b6020026020010151858581518110611e3057611e306156a7565b6020026020010151836135bd9092919063ffffffff16565b878481518110611e5a57611e5a6156a7565b60209081029190910101525050600101611ca6565b5050505b9250929050565b6060611e846123a2565b611e8d82610f4a565b611eaa5760405163a5c7c44560e01b815260040160405180910390fd5b611eb382611791565b15611ed1576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b03831614611f89576001600160a01b038083165f908152609a602052604090205416611f0481613a3c565b80611f2a57506001600160a01b038181165f908152609960205260409020600101541633145b611f4757604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b611f9282613ae5565b9050611f9e600160c955565b919050565b6002611fae81612374565b611fb66123a2565b611fca611fc286615924565b8585856135db565b611fd4600160c955565b5050505050565b611fe36123a2565b611fec33610f4a565b1561200a57604051633bf2b50360e11b815260040160405180910390fd5b61201383611791565b612030576040516325ec6c1f60e01b815260040160405180910390fd5b61203c33848484613d25565b610fab3384612c48565b60605f83516001600160401b0381111561206257612062614ba9565b60405190808252806020026020018201604052801561209557816020015b60608152602001906001900390816120805790505b5090505f5b84518110156119ba576120c68582815181106120b8576120b86156a7565b6020026020010151856118ec565b8282815181106120d8576120d86156a7565b602090810291909101015260010161209a565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea612158613de4565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6121ac613e59565b606654801982198116146121d35760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a3602052604090206060906117c390613f0a565b5f54610100900460ff161580801561225357505f54600160ff909116105b8061226c5750303b15801561226c57505f5460ff166001145b6122d45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156122f5575f805461ff0019166101001790555b6122fe82612b8b565b8015610b3f575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b5f61234f6120eb565b60405161190160f01b6020820152602281019190915260428101839052606201611010565b606654600160ff83161b9081160361239f5760405163840a48d560e01b815260040160405180910390fd5b50565b600260c954036123f45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016122cb565b600260c955565b60605f82516001600160401b0381111561241757612417614ba9565b604051908082528060200260200182016040528015612440578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b815260040161249292919061594a565b5f60405180830381865afa1580156124ac573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124d3919081019061596d565b90505f5b84518110156125425761251d878683815181106124f6576124f66156a7565b6020026020010151848481518110612510576125106156a7565b6020026020010151612ed1565b83828151811061252f5761252f6156a7565b60209081029190910101526001016124d7565b509095945050505050565b5f6001600160a01b038616612575576040516339b190bb60e11b815260040160405180910390fd5b83515f036125965760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b038111156125b0576125b0614ba9565b6040519080825280602002602001820160405280156125d9578160200160208202803683370190505b5090505f85516001600160401b038111156125f6576125f6614ba9565b60405190808252806020026020018201604052801561261f578160200160208202803683370190505b5090505f5b865181101561291b575f612643888381518110611cc557611cc56156a7565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a858151811061267c5761267c6156a7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2090506126f58884815181106126ba576126ba6156a7565b60200260200101518885815181106126d4576126d46156a7565b602090810291909101810151604080519283019052845482529091906135bd565b848481518110612707576127076156a7565b602002602001018181525050612746888481518110612728576127286156a7565b60209081029190910181015160408051928301905283548252613f16565b858481518110612758576127586156a7565b60209081029190910101526001600160a01b038a16156127ed576127af8a8a8581518110612788576127886156a7565b60200260200101518786815181106127a2576127a26156a7565b6020026020010151613f2a565b6127ed8a8c8b86815181106127c6576127c66156a7565b60200260200101518787815181106127e0576127e06156a7565b602002602001015161326a565b5f826001600160a01b031663724af4238d8c8781518110612810576128106156a7565b60200260200101518c888151811061282a5761282a6156a7565b60200260200101516040518463ffffffff1660e01b8152600401612850939291906159fc565b6020604051808303815f875af115801561286c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061289091906158f9565b9050805f0361290d575f82557f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f8c8b86815181106128d0576128d06156a7565b60200260200101516128f5856040518060200160405290815f82015481525050613a1d565b604051612904939291906159fc565b60405180910390a15b505050806001019050612624565b506001600160a01b0388165f908152609f6020526040812080549182919061294283615a20565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f6129a882610ffe565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612a5e92600585019201906149a0565b5060c08201518051612a7a916006840191602090910190614a03565b5050506001600160a01b038b165f90815260a360205260409020612a9e9082613f94565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612ad293929190615a38565b60405180910390a19a9950505050505050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015612b4a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b6e9190615a62565b610ffc57604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61186b82612be0612bd987613a1d565b8690613f9f565b90613f9f565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69101612206565b5f612c5281612374565b5f5f612c5d85611491565b915091505f612c6d5f86856123fb565b6001600160a01b038781165f818152609a602052604080822080546001600160a01b031916948b16948517905551939450919290917fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d874330491a35f5b8351811015611a745773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b0316848281518110612d0057612d006156a7565b60200260200101516001600160a01b031603612e705760405163a3d75e0960e01b81526001600160a01b0388811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa158015612d7e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612da2919061574c565b90505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f878581518110612ddb57612ddb6156a7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612e4f858481518110612e2d57612e2d6156a7565b6020026020010151836001600160401b0316836135bd9092919063ffffffff16565b858481518110612e6157612e616156a7565b60200260200101818152505050505b612ec98688868481518110612e8757612e876156a7565b60200260200101515f878681518110612ea257612ea26156a7565b6020026020010151878781518110612ebc57612ebc6156a7565b6020026020010151612fb3565b600101612cc7565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b03841601612fa35760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa158015612f5f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f83919061574c565b9050612f9b6001600160401b038481169083166135a9565b915050610c9c565b506001600160401b031692915050565b805f03612fd357604051630a33bc6960e21b815260040160405180910390fd5b81156130f0576001600160a01b038086165f90815260a26020908152604080832093881683529290522061300981858585613fb3565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f908790879061304790613a1d565b604051613056939291906159fc565b60405180910390a161306786610f4a565b15611a74576001600160a01b038088165f908152609860209081526040808320938916835292905290812080548592906130a290849061577b565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c8787866040516130e6939291906159fc565b60405180910390a2505b505050505050565b61310181613a3c565b61239f5760405163932d94f760e01b815260040160405180910390fd5b60605f61312a83614049565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f6131698483856001614070565b61186b9085615a7d565b5f826001600160401b03165f0361318b57505f61186b565b6001600160a01b038086165f90815260a56020908152604080832093881683529290529081206131ba906140cb565b90505f61322060016131ec7f000000000000000000000000000000000000000000000000000000000000000043615a90565b6131f69190615a90565b6001600160a01b03808a165f90815260a560209081526040808320938c16835292905220906140e5565b90505f61322d8284615a7d565b905061325e613245826001600160401b0389166135a9565b876001600160401b0316876001600160401b031661315b565b98975050505050505050565b6001600160a01b038085165f908152609860209081526040808320938616835292905290812080548392906132a0908490615a7d565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd8484846040516118de939291906159fc565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461332f577f00000000000000000000000000000000000000000000000000000000000000006117c3565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b61335e614947565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b0390811682526001830154811682850152600283015416818501526003820154606082810191909152600483015463ffffffff1660808301526005830180548651818702810187019097528087529195929460a0860193929083018282801561341057602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116133f2575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561346657602002820191905f5260205f20905b815481526020019060010190808311613452575b50505050508152505091508160a00151516001600160401b0381111561348e5761348e614ba9565b6040519080825280602002602001820160405280156134b7578160200160208202803683370190505b5090505f7f000000000000000000000000000000000000000000000000000000000000000083608001516134eb9190615aac565b90505f4363ffffffff168263ffffffff161061351c57613517845f015185602001518660a001516123fb565b613533565b613533845f015185602001518660a0015185614101565b90505f5b8460a00151518110156112de576135848560c00151828151811061355d5761355d6156a7565b6020026020010151838381518110613577576135776156a7565b602002602001015161422f565b848281518110613596576135966156a7565b6020908102919091010152600101613537565b5f610c9c8383670de0b6b3a764000061423a565b5f61186b826135d56135ce87613a1d565b86906135a9565b906135a9565b60a0840151518214613600576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b031614613636576040516316110d3560e21b815260040160405180910390fd5b5f61364085610ffe565b5f818152609e602052604090205490915060ff16613671576040516387c9d21960e01b815260040160405180910390fd5b60605f7f000000000000000000000000000000000000000000000000000000000000000087608001516136a49190615aac565b90508063ffffffff164363ffffffff16116136d2576040516378f67ae160e11b815260040160405180910390fd5b6136e9875f015188602001518960a0015184614101565b87516001600160a01b03165f90815260a36020526040902090925061370f91508361431f565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff19169055906137666005830182614a3c565b613773600683015f614a3c565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00906137bc9084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a015191909316926137f69184906123fb565b90505f5b8860a0015151811015613a12575f6138218a60a001518381518110611cc557611cc56156a7565b90505f6138578b60c00151848151811061383d5761383d6156a7565b6020026020010151878581518110613577576135776156a7565b9050805f03613867575050613a0a565b871561393557816001600160a01b0316632eae418c8c5f01518d60a001518681518110613896576138966156a7565b60200260200101518d8d888181106138b0576138b06156a7565b90506020020160208101906138c59190614ed8565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b15801561391a575f5ffd5b505af115801561392c573d5f5f3e3d5ffd5b50505050613a07565b5f5f836001600160a01b03166350ff72258e5f01518f60a001518881518110613960576139606156a7565b6020026020010151866040518463ffffffff1660e01b8152600401613987939291906159fc565b60408051808303815f875af11580156139a2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139c69190615ac8565b91509150613a04878e5f01518f60a0015188815181106139e8576139e86156a7565b602002602001015185858b8b81518110612ebc57612ebc6156a7565b50505b50505b6001016137fa565b505050505050505050565b80515f9015613a2d5781516117c3565b670de0b6b3a764000092915050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb890608401602060405180830381865afa158015613ac1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117c39190615a62565b60606001613af281612374565b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613b5186611491565b9150915081515f03613b6557505050613d1f565b81516001600160401b03811115613b7e57613b7e614ba9565b604051908082528060200260200182016040528015613ba7578160200160208202803683370190505b5094505f613bb68785856123fb565b90505f5b8351811015613d19576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613c3a57613c3a6156a7565b6020026020010151835f81518110613c5457613c546156a7565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613c8657613c866156a7565b6020026020010151825f81518110613ca057613ca06156a7565b602002602001018181525050848481518110613cbe57613cbe6156a7565b6020026020010151815f81518110613cd857613cd86156a7565b602002602001018181525050613cf18b8985858561254d565b8a8581518110613d0357613d036156a7565b6020908102919091010152505050600101613bba565b50505050505b50919050565b6001600160a01b038084165f908152609960205260409020600101541680613d4d5750610df1565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff1615613d9157604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff19166001179055830151611fd4908290613dd890889088908490889061080f565b8551602087015161432a565b60605f613e107f000000000000000000000000000000000000000000000000000000000000000061311e565b9050805f81518110613e2457613e246156a7565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613eb5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ed99190615aea565b6001600160a01b0316336001600160a01b031614610ffc5760405163794821ff60e01b815260040160405180910390fd5b60605f610c9c8361437c565b5f610c9c613f2384613a1d565b83906135a9565b6001600160a01b038084165f90815260a5602090815260408083209386168352929052908120613f59906140cb565b9050610df143613f69848461577b565b6001600160a01b038088165f90815260a560209081526040808320938a1683529290522091906143d5565b5f610c9c83836143e0565b5f610c9c83670de0b6b3a76400008461423a565b825f03613fdf57604080516020810190915284548152613fd8908290612be090613a1d565b8455610df1565b6040805160208101909152845481525f90613ffb9085846135bd565b90505f614008848361577b565b90505f61402384612be061401c888a61577b565b8590613f9f565b80885590505f819003611a745760405163172cec7360e31b815260040160405180910390fd5b5f60ff8216601f8111156117c357604051632cd44ac360e21b815260040160405180910390fd5b5f5f61407d86868661423a565b9050600183600281111561409357614093615b05565b1480156140af57505f84806140aa576140aa615b19565b868809115b156140c2576140bf60018261577b565b90505b95945050505050565b5f6140d6828261442c565b6001600160e01b031692915050565b5f6140f1838383614471565b6001600160e01b03169392505050565b60605f83516001600160401b0381111561411d5761411d614ba9565b604051908082528060200260200182016040528015614146578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b815260040161419a93929190615b2d565b5f60405180830381865afa1580156141b4573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526141db919081019061596d565b90505f5b8551811015614223576141fe888783815181106124f6576124f66156a7565b838281518110614210576142106156a7565b60209081029190910101526001016141df565b50909695505050505050565b5f610c9c83836135a9565b5f80805f19858709858702925082811083820303915050805f036142715783828161426757614267615b19565b0492505050610c9c565b8084116142b85760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016122cb565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610c9c83836144ba565b4281101561434b57604051630819bdcd60e01b815260040160405180910390fd5b61435f6001600160a01b038516848461459d565b610df157604051638baa579f60e01b815260040160405180910390fd5b6060815f018054806020026020016040519081016040528092919081815260200182805480156143c957602002820191905f5260205f20905b8154815260200190600101908083116143b5575b50505050509050919050565b610fb58383836145f1565b5f81815260018301602052604081205461442557508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556117c3565b505f6117c3565b81545f9080156144695761445284614445600184615a7d565b5f91825260209091200190565b5464010000000090046001600160e01b031661186b565b509092915050565b82545f9081614482868683856146f7565b905080156144b05761449986614445600184615a7d565b5464010000000090046001600160e01b031661088d565b5091949350505050565b5f8181526001830160205260408120548015614594575f6144dc600183615a7d565b85549091505f906144ef90600190615a7d565b905081811461454e575f865f01828154811061450d5761450d6156a7565b905f5260205f200154905080875f01848154811061452d5761452d6156a7565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061455f5761455f615b66565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506117c3565b5f9150506117c3565b5f5f5f6145aa858561474a565b90925090505f8160048111156145c2576145c2615b05565b1480156145e05750856001600160a01b0316826001600160a01b0316145b8061088d575061088d868686614789565b825480156146a9575f61460985614445600185615a7d565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b03166020840152919250908516101561465c5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036146a7578261467d86614445600186615a7d565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b818310156119ba575f61470c8484614870565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561473657809250614744565b61474181600161577b565b93505b506146f9565b5f5f825160410361477e576020830151604084015160608501515f1a6147728782858561488a565b94509450505050611e73565b505f90506002611e73565b5f5f5f856001600160a01b0316631626ba7e60e01b86866040516024016147b1929190615b7a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516147ef9190615b92565b5f60405180830381855afa9150503d805f8114614827576040519150601f19603f3d011682016040523d82523d5f602084013e61482c565b606091505b509150915081801561484057506020815110155b801561088d57508051630b135d3f60e11b9061486590830160209081019084016158f9565b149695505050505050565b5f61487e6002848418615ba8565b610c9c9084841661577b565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156148bf57505f9050600361493e565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614910573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116614938575f6001925092505061493e565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f209081019282156149f3579160200282015b828111156149f357825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906149be565b506149ff929150614a53565b5090565b828054828255905f5260205f209081019282156149f3579160200282015b828111156149f3578251825591602001919060010190614a21565b5080545f8255905f5260205f209081019061239f91905b5b808211156149ff575f8155600101614a54565b6001600160a01b038116811461239f575f5ffd5b8035611f9e81614a67565b5f5f5f5f5f60a08688031215614a9a575f5ffd5b8535614aa581614a67565b94506020860135614ab581614a67565b93506040860135614ac581614a67565b94979396509394606081013594506080013592915050565b5f5f83601f840112614aed575f5ffd5b5081356001600160401b03811115614b03575f5ffd5b6020830191508360208260051b8501011115611e73575f5ffd5b5f5f60208385031215614b2e575f5ffd5b82356001600160401b03811115614b43575f5ffd5b614b4f85828601614add565b90969095509350505050565b602080825282518282018190525f918401906040840190835b81811015612542578351835260209384019390920191600101614b74565b5f60208284031215614ba2575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614bdf57614bdf614ba9565b60405290565b604080519081016001600160401b0381118282101715614bdf57614bdf614ba9565b604051601f8201601f191681016001600160401b0381118282101715614c2f57614c2f614ba9565b604052919050565b5f6001600160401b03821115614c4f57614c4f614ba9565b5060051b60200190565b5f82601f830112614c68575f5ffd5b8135614c7b614c7682614c37565b614c07565b8082825260208201915060208360051b860101925085831115614c9c575f5ffd5b602085015b83811015614cc2578035614cb481614a67565b835260209283019201614ca1565b5095945050505050565b5f82601f830112614cdb575f5ffd5b8135614ce9614c7682614c37565b8082825260208201915060208360051b860101925085831115614d0a575f5ffd5b602085015b83811015614cc2578035835260209283019201614d0f565b5f5f5f60608486031215614d39575f5ffd5b8335614d4481614a67565b925060208401356001600160401b03811115614d5e575f5ffd5b614d6a86828701614c59565b92505060408401356001600160401b03811115614d85575f5ffd5b614d9186828701614ccc565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614dcb578151865260209586019590910190600101614dad565b5093949350505050565b602081525f610c9c6020830184614d9b565b803563ffffffff81168114611f9e575f5ffd5b5f5f83601f840112614e0a575f5ffd5b5081356001600160401b03811115614e20575f5ffd5b602083019150836020828501011115611e73575f5ffd5b5f5f5f5f60608587031215614e4a575f5ffd5b8435614e5581614a67565b9350614e6360208601614de7565b925060408501356001600160401b03811115614e7d575f5ffd5b614e8987828801614dfa565b95989497509550505050565b5f5f5f5f60808587031215614ea8575f5ffd5b8435614eb381614a67565b93506020850135614ec381614a67565b93969395505050506040820135916060013590565b5f60208284031215614ee8575f5ffd5b8135610c9c81614a67565b5f5f60408385031215614f04575f5ffd5b8235614f0f81614a67565b91506020830135614f1f81614a67565b809150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610c9c6020830184614f2a565b5f60e08284031215614f7a575f5ffd5b614f82614bbd565b9050614f8d82614a7b565b8152614f9b60208301614a7b565b6020820152614fac60408301614a7b565b604082015260608281013590820152614fc760808301614de7565b608082015260a08201356001600160401b03811115614fe4575f5ffd5b614ff084828501614c59565b60a08301525060c08201356001600160401b0381111561500e575f5ffd5b61501a84828501614ccc565b60c08301525092915050565b5f60208284031215615036575f5ffd5b81356001600160401b0381111561504b575f5ffd5b61186b84828501614f6a565b5f60208284031215615067575f5ffd5b813560ff81168114610c9c575f5ffd5b6001600160401b038116811461239f575f5ffd5b5f5f5f5f5f5f86880360e08112156150a1575f5ffd5b87356150ac81614a67565b96506040601f19820112156150bf575f5ffd5b506020870194506060870135935060808701356150db81614a67565b925060a08701356150eb81615077565b915060c08701356150fb81615077565b809150509295509295509295565b5f8151808452602084019350602083015f5b82811015614dcb5781516001600160a01b031686526020958601959091019060010161511b565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f9161518d9085018263ffffffff169052565b5060a082015160e060a08501526151a760e0850182615109565b905060c083015184820360c08601526140c28282614d9b565b604081525f6151d26040830185615142565b82810360208401526140c28185614d9b565b5f82825180855260208501945060208160051b830101602085015f5b8381101561422357601f1985840301885261521c838351614d9b565b6020988901989093509190910190600101615200565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b8281101561528957605f19878603018452615274858351615142565b94506020938401939190910190600101615258565b5050505082810360208401526140c281856151e4565b5f5f5f606084860312156152b1575f5ffd5b83356152bc81614a67565b92506020840135915060408401356152d381615077565b809150509250925092565b604081525f6151d26040830185615109565b5f5f5f60408486031215615302575f5ffd5b833561530d81614a67565b925060208401356001600160401b03811115615327575f5ffd5b61533386828701614dfa565b9497909650939450505050565b5f5f60408385031215615351575f5ffd5b823561535c81614a67565b915060208301356001600160401b03811115615376575f5ffd5b61538285828601614c59565b9150509250929050565b5f5f5f5f5f5f606087890312156153a1575f5ffd5b86356001600160401b038111156153b6575f5ffd5b6153c289828a01614add565b90975095505060208701356001600160401b038111156153e0575f5ffd5b6153ec89828a01614add565b90955093505060408701356001600160401b0381111561540a575f5ffd5b61541689828a01614add565b979a9699509497509295939492505050565b602081525f610c9c6020830184615142565b5f5f5f6060848603121561544c575f5ffd5b833561545781614a67565b925060208401356001600160401b03811115615471575f5ffd5b840160408187031215615482575f5ffd5b61548a614be5565b81356001600160401b0381111561549f575f5ffd5b8201601f810188136154af575f5ffd5b80356001600160401b038111156154c8576154c8614ba9565b6154db601f8201601f1916602001614c07565b8181528960208385010111156154ef575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f60408385031215615532575f5ffd5b823561553d81614a67565b946020939093013593505050565b604081525f6151d26040830185614d9b565b801515811461239f575f5ffd5b5f5f5f5f6060858703121561557d575f5ffd5b84356001600160401b03811115615592575f5ffd5b850160e081880312156155a3575f5ffd5b935060208501356001600160401b038111156155bd575f5ffd5b6155c987828801614add565b90945092505060408501356155dd8161555d565b939692955090935050565b5f5f604083850312156155f9575f5ffd5b82356001600160401b0381111561560e575f5ffd5b8301601f8101851361561e575f5ffd5b803561562c614c7682614c37565b8082825260208201915060208360051b85010192508783111561564d575f5ffd5b6020840193505b8284101561567857833561566781614a67565b825260209384019390910190615654565b945050505060208301356001600160401b03811115615376575f5ffd5b602081525f610c9c60208301846151e4565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126156cf575f5ffd5b9190910192915050565b5f5f8335601e198436030181126156ee575f5ffd5b8301803591506001600160401b03821115615707575f5ffd5b6020019150600581901b3603821315611e73575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f6020828403121561575c575f5ffd5b8151610c9c81615077565b634e487b7160e01b5f52601160045260245ffd5b808201808211156117c3576117c3615767565b60a08101853561579d81614a67565b6001600160a01b0316825263ffffffff6157b960208801614de7565b16602083015260408201949094526001600160a01b03929092166060830152608090910152919050565b5f82601f8301126157f2575f5ffd5b8151615800614c7682614c37565b8082825260208201915060208360051b860101925085831115615821575f5ffd5b602085015b83811015614cc2578051835260209283019201615826565b5f5f6040838503121561584f575f5ffd5b82516001600160401b03811115615864575f5ffd5b8301601f81018513615874575f5ffd5b8051615882614c7682614c37565b8082825260208201915060208360051b8501019250878311156158a3575f5ffd5b6020840193505b828410156158ce5783516158bd81614a67565b8252602093840193909101906158aa565b8095505050505060208301516001600160401b038111156158ed575f5ffd5b615382858286016157e3565b5f60208284031215615909575f5ffd5b5051919050565b5f823560de198336030181126156cf575f5ffd5b5f6117c33683614f6a565b5f6020828403121561593f575f5ffd5b8135610c9c8161555d565b6001600160a01b03831681526040602082018190525f9061186b90830184615109565b5f6020828403121561597d575f5ffd5b81516001600160401b03811115615992575f5ffd5b8201601f810184136159a2575f5ffd5b80516159b0614c7682614c37565b8082825260208201915060208360051b8501019250868311156159d1575f5ffd5b6020840193505b8284101561088d5783516159eb81615077565b8252602093840193909101906159d8565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60018201615a3157615a31615767565b5060010190565b838152606060208201525f615a506060830185615142565b828103604084015261088d8185614d9b565b5f60208284031215615a72575f5ffd5b8151610c9c8161555d565b818103818111156117c3576117c3615767565b63ffffffff82811682821603908111156117c3576117c3615767565b63ffffffff81811683821601908111156117c3576117c3615767565b5f5f60408385031215615ad9575f5ffd5b505080516020909101519092909150565b5f60208284031215615afa575f5ffd5b8151610c9c81614a67565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160a01b03841681526060602082018190525f90615b5090830185615109565b905063ffffffff83166040830152949350505050565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f61186b6040830184614f2a565b5f82518060208501845e5f920191825250919050565b5f82615bc257634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220c37ad2aa869644ff5259b6f8466ef4153bc7a3cf1316ee6daf82ac1dc9afe30b64736f6c634300081e0033",
+ Bin: "0x610160604052348015610010575f5ffd5b5060405161605338038061605383398101604081905261002f916101d9565b808084898989878a6001600160a01b03811661005e576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c052821660e05263ffffffff16610100521661012052610095816100b0565b61014052506100a490506100f6565b50505050505050610364565b5f5f829050601f815111156100e3578260405163305a27a960e01b81526004016100da9190610309565b60405180910390fd5b80516100ee8261033e565b179392505050565b5f54610100900460ff161561015d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100da565b5f5460ff908116146101ac575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101c2575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f5f60e0888a0312156101ef575f5ffd5b87516101fa816101ae565b602089015190975061020b816101ae565b604089015190965061021c816101ae565b606089015190955061022d816101ae565b608089015190945061023e816101ae565b60a089015190935063ffffffff81168114610257575f5ffd5b60c08901519092506001600160401b03811115610272575f5ffd5b88015f601f82018b13610283575f5ffd5b81516001600160401b0381111561029c5761029c6101c5565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102ca576102ca6101c5565b6040528181528382016020018d10156102e1575f5ffd5b8160208501602083015e5f602083830101528092508094505050505092959891949750929550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561035e575f198160200360031b1b821691505b50919050565b60805160a05160c05160e051610100516101205161014051615bfd6104565f395f8181610fc10152613dec01525f81816104120152613a7a01525f8181610703015281816131c7015281816134bd015261367601525f818161075301528181610cf301528181610eb60152818161103901528181611392015281816117f401528181612446015261414c01525f818161043901528181610e34015281816112f10152818161156501528181612d3701528181612f18015261333101525f818161036f01528181610e02015281816114b9015261330b01525f81816105e201528181612afd0152613e5b0152615bfd5ff3fe608060405234801561000f575f5ffd5b50600436106102b1575f3560e01c80636d70f7ae1161017b578063bb45fef2116100e4578063e4cc3f901161009e578063f698da2511610079578063f698da25146107ce578063fabc1cbc146107d6578063fd8aa88d146107e9578063fe4b84df146107fc575f5ffd5b8063e4cc3f9014610788578063eea9064b1461079b578063f0e0e676146107ae575f5ffd5b8063bb45fef2146106b9578063bfae3fd2146106e6578063c448feb8146106f9578063c978f7ac1461072d578063ca8aa7c71461074e578063da8be86414610775575f5ffd5b80639104c319116101355780639104c319146106175780639435bb431461063257806399f5371b14610645578063a178848414610665578063a33a343314610684578063b7f06ebe14610697575f5ffd5b80636d70f7ae1461057a5780636e1744481461058d578063778e55f3146105a057806378296ec5146105ca578063886f1195146105dd5780639004134714610604575f5ffd5b806354b7c96c1161021d5780635c975abb116101d75780635c975abb146104d45780635d975e88146104dc5780635dd68579146104fd57806360a0d1ce1461051e57806365da12641461053157806366d5ba9314610559575f5ffd5b806354b7c96c1461045b57806354fd4d501461046e578063595c6a6714610483578063597b36da1461048b5780635ac86ab71461049e5780635ae679a7146104c1575f5ffd5b806339b70e381161026e57806339b70e381461036a5780633c651cf2146103a95780633cdeb5e0146103bc5780633e28391d146103ea5780634657e26a1461040d5780634665bcda14610434575f5ffd5b806304a4f979146102b55780630b9f487a146102ef5780630dd8dd0214610302578063136439dd1461032257806325df922e146103375780632aa6d88814610357575b5f5ffd5b6102dc7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b6102dc6102fd366004614a86565b61080f565b610315610310366004614b1d565b610897565b6040516102e69190614b5b565b610335610330366004614b92565b610b09565b005b61034a610345366004614d27565b610b43565b6040516102e69190614dd5565b610335610365366004614e37565b610ca3565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102e6565b6103356103b7366004614e95565b610df7565b6103916103ca366004614ed8565b6001600160a01b039081165f908152609960205260409020600101541690565b6103fd6103f8366004614ed8565b610f4a565b60405190151581526020016102e6565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b610335610469366004614ef3565b610f69565b610476610fba565b6040516102e69190614f58565b610335610fea565b6102dc610499366004615026565b610ffe565b6103fd6104ac366004615057565b606654600160ff9092169190911b9081161490565b6102dc6104cf36600461508b565b61102d565b6066546102dc565b6104ef6104ea366004614b92565b61119f565b6040516102e69291906151c0565b61051061050b366004614ed8565b6111bc565b6040516102e6929190615232565b61033561052c36600461529f565b6112e6565b61039161053f366004614ed8565b609a6020525f90815260409020546001600160a01b031681565b61056c610567366004614ed8565b611491565b6040516102e69291906152de565b6103fd610588366004614ed8565b611791565b6102dc61059b366004614ef3565b6117c9565b6102dc6105ae366004614ef3565b609860209081525f928352604080842090915290825290205481565b6103356105d83660046152f0565b611873565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b61034a610612366004615340565b6118ec565b61039173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61033561064036600461538c565b6119c2565b610658610653366004614b92565b611a7d565b6040516102e69190615428565b6102dc610673366004614ed8565b609f6020525f908152604090205481565b61031561069236600461543a565b611b99565b6103fd6106a5366004614b92565b609e6020525f908152604090205460ff1681565b6103fd6106c7366004615521565b609c60209081525f928352604080842090915290825290205460ff1681565b6102dc6106f4366004614ef3565b611bb1565b60405163ffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526020016102e6565b61074061073b366004615340565b611bed565b6040516102e692919061554b565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b610315610783366004614ed8565b611e7a565b61033561079636600461556a565b611fa3565b6103356107a936600461543a565b611fdb565b6107c16107bc3660046155e8565b612046565b6040516102e69190615695565b6102dc6120eb565b6103356107e4366004614b92565b6121a4565b6103156107f7366004614ed8565b612212565b61033561080a366004614b92565b612235565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f9061088d9060e00160405160208183030381529060405280519060200120612346565b9695505050505050565b606060016108a481612374565b6108ac6123a2565b5f836001600160401b038111156108c5576108c5614ba9565b6040519080825280602002602001820160405280156108ee578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610afa57868682818110610928576109286156a7565b905060200281019061093a91906156bb565b6109489060208101906156d9565b905087878381811061095c5761095c6156a7565b905060200281019061096e91906156bb565b61097890806156d9565b905014610998576040516343714afd60e01b815260040160405180910390fd5b5f610a0233848a8a868181106109b0576109b06156a7565b90506020028101906109c291906156bb565b6109cc90806156d9565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506123fb92505050565b9050610ad433848a8a86818110610a1b57610a1b6156a7565b9050602002810190610a2d91906156bb565b610a3790806156d9565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610a7c57610a7c6156a7565b9050602002810190610a8e91906156bb565b610a9c9060208101906156d9565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525088925061254d915050565b848381518110610ae657610ae66156a7565b60209081029190910101525060010161090e565b5050600160c955949350505050565b610b11612ae8565b6066548181168114610b365760405163c61dca5d60e01b815260040160405180910390fd5b610b3f82612b8b565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610b6c8683876123fb565b90505f85516001600160401b03811115610b8857610b88614ba9565b604051908082528060200260200182016040528015610bb1578160200160208202803683370190505b5090505f5b8651811015610c96576001600160a01b0388165f90815260a260205260408120885182908a9085908110610bec57610bec6156a7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610c70878381518110610c3e57610c3e6156a7565b6020026020010151858481518110610c5857610c586156a7565b602002602001015183612bc89092919063ffffffff16565b838381518110610c8257610c826156a7565b602090810291909101015250600101610bb6565b50925050505b9392505050565b610cab6123a2565b610cb433610f4a565b15610cd257604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610d3c575f5ffd5b505af1158015610d4e573d5f5f3e3d5ffd5b50505050610d5c3385612be6565b610d663333612c48565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610ddf92919061571e565b60405180910390a2610df1600160c955565b50505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610e565750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610e735760405163045206a560e21b815260040160405180910390fd5b610e7b6123a2565b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015610efb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1f919061574c565b90505f610f2d878784612ed1565b9050610f3d838888888886612fb3565b505050610df1600160c955565b6001600160a01b039081165f908152609a602052604090205416151590565b81610f73816130f8565b610f7b6123a2565b610f8483611791565b610fa1576040516325ec6c1f60e01b815260040160405180910390fd5b610fab8383612be6565b610fb5600160c955565b505050565b6060610fe57f000000000000000000000000000000000000000000000000000000000000000061311e565b905090565b610ff2612ae8565b610ffc5f19612b8b565b565b5f816040516020016110109190615428565b604051602081830303815290604052805190602001209050919050565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611077576040516323d871a560e01b815260040160405180910390fd5b61107f6123a2565b6001600160a01b038088165f9081526098602090815260408083209388168352929052908120546110bd906001600160401b0380871690861661315b565b90505f6110cc89878787613173565b90506110d8818361577b565b92506110e6895f888561326a565b604080516001600160a01b038881168252602082018690528b16917fdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30910160405180910390a2611135866132e4565b6001600160a01b0316633fb99ca5898989876040518563ffffffff1660e01b8152600401611166949392919061578e565b5f604051808303815f87803b15801561117d575f5ffd5b505af115801561118f573d5f5f3e3d5ffd5b50505050505061088d600160c955565b6111a7614947565b60606111b283613356565b9094909350915050565b6060805f6111c984612212565b8051909150806001600160401b038111156111e6576111e6614ba9565b60405190808252806020026020018201604052801561121f57816020015b61120c614947565b8152602001906001900390816112045790505b509350806001600160401b0381111561123a5761123a614ba9565b60405190808252806020026020018201604052801561126d57816020015b60608152602001906001900390816112585790505b5092505f5b818110156112de5761129c83828151811061128f5761128f6156a7565b6020026020010151613356565b8683815181106112ae576112ae6156a7565b602002602001018684815181106112c7576112c76156a7565b602090810291909101019190915252600101611272565b505050915091565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461132f57604051633213a66160e21b815260040160405180910390fd5b6113376123a2565b61134083610f4a565b15610fab576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156113d7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113fb919061574c565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0845282528083208151928301909152548152919250611461866114596001600160401b038087169089166135a9565b8491906135bd565b9050611483848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08461326a565b50505050610fb5600160c955565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa1580156114fd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611524919081019061583e565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa1580156115aa573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ce91906158f9565b9050805f036115e257509094909350915050565b5f835160016115f1919061577b565b6001600160401b0381111561160857611608614ba9565b604051908082528060200260200182016040528015611631578160200160208202803683370190505b5090505f84516001611643919061577b565b6001600160401b0381111561165a5761165a614ba9565b604051908082528060200260200182016040528015611683578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0828651815181106116ae576116ae6156a7565b60200260200101906001600160a01b031690816001600160a01b03168152505082818651815181106116e2576116e26156a7565b60209081029190910101525f5b85518110156117835785818151811061170a5761170a6156a7565b6020026020010151838281518110611724576117246156a7565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611756576117566156a7565b6020026020010151828281518110611770576117706156a7565b60209081029190910101526001016116ef565b509097909650945050505050565b5f6001600160a01b038216158015906117c357506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611839573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061185d919061574c565b905061186b8484835f613173565b949350505050565b8261187d816130f8565b61188684611791565b6118a3576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b670809084846040516118de92919061571e565b60405180910390a250505050565b60605f82516001600160401b0381111561190857611908614ba9565b604051908082528060200260200182016040528015611931578160200160208202803683370190505b5090505f5b83518110156119ba576001600160a01b0385165f908152609860205260408120855190919086908490811061196d5761196d6156a7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20548282815181106119a7576119a76156a7565b6020908102919091010152600101611936565b509392505050565b60026119cd81612374565b6119d56123a2565b855f5b81811015611a6857611a608989838181106119f5576119f56156a7565b9050602002810190611a079190615910565b611a1090615924565b888884818110611a2257611a226156a7565b9050602002810190611a3491906156d9565b888886818110611a4657611a466156a7565b9050602002016020810190611a5b919061592f565b6135db565b6001016119d8565b5050611a74600160c955565b50505050505050565b611a85614947565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a08601939290830182828015611b3357602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611b15575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015611b8957602002820191905f5260205f20905b815481526020019060010190808311611b75575b5050505050815250509050919050565b6060611ba433611e7a565b9050610c9c848484611fdb565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610c9c90613a1d565b60608082516001600160401b03811115611c0957611c09614ba9565b604051908082528060200260200182016040528015611c32578160200160208202803683370190505b50915082516001600160401b03811115611c4e57611c4e614ba9565b604051908082528060200260200182016040528015611c77578160200160208202803683370190505b506001600160a01b038086165f908152609a6020526040812054929350911690611ca28683876123fb565b90505f5b8551811015611e6f575f611cd2878381518110611cc557611cc56156a7565b60200260200101516132e4565b9050806001600160a01b031663fe243a1789898581518110611cf657611cf66156a7565b60200260200101516040518363ffffffff1660e01b8152600401611d309291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015611d4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d6f91906158f9565b858381518110611d8157611d816156a7565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f898581518110611dc457611dc46156a7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050611e48868481518110611e1657611e166156a7565b6020026020010151858581518110611e3057611e306156a7565b6020026020010151836135bd9092919063ffffffff16565b878481518110611e5a57611e5a6156a7565b60209081029190910101525050600101611ca6565b5050505b9250929050565b6060611e846123a2565b611e8d82610f4a565b611eaa5760405163a5c7c44560e01b815260040160405180910390fd5b611eb382611791565b15611ed1576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b03831614611f89576001600160a01b038083165f908152609a602052604090205416611f0481613a3c565b80611f2a57506001600160a01b038181165f908152609960205260409020600101541633145b611f4757604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b611f9282613ae5565b9050611f9e600160c955565b919050565b6002611fae81612374565b611fb66123a2565b611fca611fc286615924565b8585856135db565b611fd4600160c955565b5050505050565b611fe36123a2565b611fec33610f4a565b1561200a57604051633bf2b50360e11b815260040160405180910390fd5b61201383611791565b612030576040516325ec6c1f60e01b815260040160405180910390fd5b61203c33848484613d25565b610fab3384612c48565b60605f83516001600160401b0381111561206257612062614ba9565b60405190808252806020026020018201604052801561209557816020015b60608152602001906001900390816120805790505b5090505f5b84518110156119ba576120c68582815181106120b8576120b86156a7565b6020026020010151856118ec565b8282815181106120d8576120d86156a7565b602090810291909101015260010161209a565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea612158613de4565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6121ac613e59565b606654801982198116146121d35760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a3602052604090206060906117c390613f0a565b5f54610100900460ff161580801561225357505f54600160ff909116105b8061226c5750303b15801561226c57505f5460ff166001145b6122d45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156122f5575f805461ff0019166101001790555b6122fe82612b8b565b8015610b3f575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b5f61234f6120eb565b60405161190160f01b6020820152602281019190915260428101839052606201611010565b606654600160ff83161b9081160361239f5760405163840a48d560e01b815260040160405180910390fd5b50565b600260c954036123f45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016122cb565b600260c955565b60605f82516001600160401b0381111561241757612417614ba9565b604051908082528060200260200182016040528015612440578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b815260040161249292919061594a565b5f60405180830381865afa1580156124ac573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124d3919081019061596d565b90505f5b84518110156125425761251d878683815181106124f6576124f66156a7565b6020026020010151848481518110612510576125106156a7565b6020026020010151612ed1565b83828151811061252f5761252f6156a7565b60209081029190910101526001016124d7565b509095945050505050565b5f6001600160a01b038616612575576040516339b190bb60e11b815260040160405180910390fd5b83515f036125965760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b038111156125b0576125b0614ba9565b6040519080825280602002602001820160405280156125d9578160200160208202803683370190505b5090505f85516001600160401b038111156125f6576125f6614ba9565b60405190808252806020026020018201604052801561261f578160200160208202803683370190505b5090505f5b865181101561291b575f612643888381518110611cc557611cc56156a7565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a858151811061267c5761267c6156a7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2090506126f58884815181106126ba576126ba6156a7565b60200260200101518885815181106126d4576126d46156a7565b602090810291909101810151604080519283019052845482529091906135bd565b848481518110612707576127076156a7565b602002602001018181525050612746888481518110612728576127286156a7565b60209081029190910181015160408051928301905283548252613f16565b858481518110612758576127586156a7565b60209081029190910101526001600160a01b038a16156127ed576127af8a8a8581518110612788576127886156a7565b60200260200101518786815181106127a2576127a26156a7565b6020026020010151613f2a565b6127ed8a8c8b86815181106127c6576127c66156a7565b60200260200101518787815181106127e0576127e06156a7565b602002602001015161326a565b5f826001600160a01b031663724af4238d8c8781518110612810576128106156a7565b60200260200101518c888151811061282a5761282a6156a7565b60200260200101516040518463ffffffff1660e01b8152600401612850939291906159fc565b6020604051808303815f875af115801561286c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061289091906158f9565b9050805f0361290d575f82557f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f8c8b86815181106128d0576128d06156a7565b60200260200101516128f5856040518060200160405290815f82015481525050613a1d565b604051612904939291906159fc565b60405180910390a15b505050806001019050612624565b506001600160a01b0388165f908152609f6020526040812080549182919061294283615a20565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f6129a882610ffe565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612a5e92600585019201906149a0565b5060c08201518051612a7a916006840191602090910190614a03565b5050506001600160a01b038b165f90815260a360205260409020612a9e9082613f94565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612ad293929190615a38565b60405180910390a19a9950505050505050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015612b4a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b6e9190615a62565b610ffc57604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61186b82612be0612bd987613a1d565b8690613f9f565b90613f9f565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69101612206565b5f612c5281612374565b5f5f612c5d85611491565b915091505f612c6d5f86856123fb565b6001600160a01b038781165f818152609a602052604080822080546001600160a01b031916948b16948517905551939450919290917fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d874330491a35f5b8351811015611a745773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b0316848281518110612d0057612d006156a7565b60200260200101516001600160a01b031603612e705760405163a3d75e0960e01b81526001600160a01b0388811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa158015612d7e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612da2919061574c565b90505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f878581518110612ddb57612ddb6156a7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612e4f858481518110612e2d57612e2d6156a7565b6020026020010151836001600160401b0316836135bd9092919063ffffffff16565b858481518110612e6157612e616156a7565b60200260200101818152505050505b612ec98688868481518110612e8757612e876156a7565b60200260200101515f878681518110612ea257612ea26156a7565b6020026020010151878781518110612ebc57612ebc6156a7565b6020026020010151612fb3565b600101612cc7565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b03841601612fa35760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa158015612f5f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f83919061574c565b9050612f9b6001600160401b038481169083166135a9565b915050610c9c565b506001600160401b031692915050565b805f03612fd357604051630a33bc6960e21b815260040160405180910390fd5b81156130f0576001600160a01b038086165f90815260a26020908152604080832093881683529290522061300981858585613fb3565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f908790879061304790613a1d565b604051613056939291906159fc565b60405180910390a161306786610f4a565b15611a74576001600160a01b038088165f908152609860209081526040808320938916835292905290812080548592906130a290849061577b565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c8787866040516130e6939291906159fc565b60405180910390a2505b505050505050565b61310181613a3c565b61239f5760405163932d94f760e01b815260040160405180910390fd5b60605f61312a83614049565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f6131698483856001614070565b61186b9085615a7d565b5f826001600160401b03165f0361318b57505f61186b565b6001600160a01b038086165f90815260a56020908152604080832093881683529290529081206131ba906140cb565b90505f61322060016131ec7f000000000000000000000000000000000000000000000000000000000000000043615a90565b6131f69190615a90565b6001600160a01b03808a165f90815260a560209081526040808320938c16835292905220906140e5565b90505f61322d8284615a7d565b905061325e613245826001600160401b0389166135a9565b876001600160401b0316876001600160401b031661315b565b98975050505050505050565b6001600160a01b038085165f908152609860209081526040808320938616835292905290812080548392906132a0908490615a7d565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd8484846040516118de939291906159fc565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461332f577f00000000000000000000000000000000000000000000000000000000000000006117c3565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b61335e614947565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b0390811682526001830154811682850152600283015416818501526003820154606082810191909152600483015463ffffffff1660808301526005830180548651818702810187019097528087529195929460a0860193929083018282801561341057602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116133f2575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561346657602002820191905f5260205f20905b815481526020019060010190808311613452575b50505050508152505091508160a00151516001600160401b0381111561348e5761348e614ba9565b6040519080825280602002602001820160405280156134b7578160200160208202803683370190505b5090505f7f000000000000000000000000000000000000000000000000000000000000000083608001516134eb9190615aac565b90505f4363ffffffff168263ffffffff161061351c57613517845f015185602001518660a001516123fb565b613533565b613533845f015185602001518660a0015185614101565b90505f5b8460a00151518110156112de576135848560c00151828151811061355d5761355d6156a7565b6020026020010151838381518110613577576135776156a7565b602002602001015161422f565b848281518110613596576135966156a7565b6020908102919091010152600101613537565b5f610c9c8383670de0b6b3a764000061423a565b5f61186b826135d56135ce87613a1d565b86906135a9565b906135a9565b60a0840151518214613600576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b031614613636576040516316110d3560e21b815260040160405180910390fd5b5f61364085610ffe565b5f818152609e602052604090205490915060ff16613671576040516387c9d21960e01b815260040160405180910390fd5b60605f7f000000000000000000000000000000000000000000000000000000000000000087608001516136a49190615aac565b90508063ffffffff164363ffffffff16116136d2576040516378f67ae160e11b815260040160405180910390fd5b6136e9875f015188602001518960a0015184614101565b87516001600160a01b03165f90815260a36020526040902090925061370f91508361431f565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff19169055906137666005830182614a3c565b613773600683015f614a3c565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00906137bc9084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a015191909316926137f69184906123fb565b90505f5b8860a0015151811015613a12575f6138218a60a001518381518110611cc557611cc56156a7565b90505f6138578b60c00151848151811061383d5761383d6156a7565b6020026020010151878581518110613577576135776156a7565b9050805f03613867575050613a0a565b871561393557816001600160a01b0316632eae418c8c5f01518d60a001518681518110613896576138966156a7565b60200260200101518d8d888181106138b0576138b06156a7565b90506020020160208101906138c59190614ed8565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b15801561391a575f5ffd5b505af115801561392c573d5f5f3e3d5ffd5b50505050613a07565b5f5f836001600160a01b03166350ff72258e5f01518f60a001518881518110613960576139606156a7565b6020026020010151866040518463ffffffff1660e01b8152600401613987939291906159fc565b60408051808303815f875af11580156139a2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139c69190615ac8565b91509150613a04878e5f01518f60a0015188815181106139e8576139e86156a7565b602002602001015185858b8b81518110612ebc57612ebc6156a7565b50505b50505b6001016137fa565b505050505050505050565b80515f9015613a2d5781516117c3565b670de0b6b3a764000092915050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb890608401602060405180830381865afa158015613ac1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117c39190615a62565b60606001613af281612374565b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613b5186611491565b9150915081515f03613b6557505050613d1f565b81516001600160401b03811115613b7e57613b7e614ba9565b604051908082528060200260200182016040528015613ba7578160200160208202803683370190505b5094505f613bb68785856123fb565b90505f5b8351811015613d19576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613c3a57613c3a6156a7565b6020026020010151835f81518110613c5457613c546156a7565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613c8657613c866156a7565b6020026020010151825f81518110613ca057613ca06156a7565b602002602001018181525050848481518110613cbe57613cbe6156a7565b6020026020010151815f81518110613cd857613cd86156a7565b602002602001018181525050613cf18b8985858561254d565b8a8581518110613d0357613d036156a7565b6020908102919091010152505050600101613bba565b50505050505b50919050565b6001600160a01b038084165f908152609960205260409020600101541680613d4d5750610df1565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff1615613d9157604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff19166001179055830151611fd4908290613dd890889088908490889061080f565b8551602087015161432a565b60605f613e107f000000000000000000000000000000000000000000000000000000000000000061311e565b9050805f81518110613e2457613e246156a7565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613eb5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ed99190615aea565b6001600160a01b0316336001600160a01b031614610ffc5760405163794821ff60e01b815260040160405180910390fd5b60605f610c9c8361437c565b5f610c9c613f2384613a1d565b83906135a9565b6001600160a01b038084165f90815260a5602090815260408083209386168352929052908120613f59906140cb565b9050610df143613f69848461577b565b6001600160a01b038088165f90815260a560209081526040808320938a1683529290522091906143d5565b5f610c9c83836143e0565b5f610c9c83670de0b6b3a76400008461423a565b825f03613fdf57604080516020810190915284548152613fd8908290612be090613a1d565b8455610df1565b6040805160208101909152845481525f90613ffb9085846135bd565b90505f614008848361577b565b90505f61402384612be061401c888a61577b565b8590613f9f565b80885590505f819003611a745760405163172cec7360e31b815260040160405180910390fd5b5f60ff8216601f8111156117c357604051632cd44ac360e21b815260040160405180910390fd5b5f5f61407d86868661423a565b9050600183600281111561409357614093615b05565b1480156140af57505f84806140aa576140aa615b19565b868809115b156140c2576140bf60018261577b565b90505b95945050505050565b5f6140d6828261442c565b6001600160e01b031692915050565b5f6140f1838383614471565b6001600160e01b03169392505050565b60605f83516001600160401b0381111561411d5761411d614ba9565b604051908082528060200260200182016040528015614146578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b815260040161419a93929190615b2d565b5f60405180830381865afa1580156141b4573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526141db919081019061596d565b90505f5b8551811015614223576141fe888783815181106124f6576124f66156a7565b838281518110614210576142106156a7565b60209081029190910101526001016141df565b50909695505050505050565b5f610c9c83836135a9565b5f80805f19858709858702925082811083820303915050805f036142715783828161426757614267615b19565b0492505050610c9c565b8084116142b85760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016122cb565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610c9c83836144ba565b4281101561434b57604051630819bdcd60e01b815260040160405180910390fd5b61435f6001600160a01b038516848461459d565b610df157604051638baa579f60e01b815260040160405180910390fd5b6060815f018054806020026020016040519081016040528092919081815260200182805480156143c957602002820191905f5260205f20905b8154815260200190600101908083116143b5575b50505050509050919050565b610fb58383836145f1565b5f81815260018301602052604081205461442557508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556117c3565b505f6117c3565b81545f9080156144695761445284614445600184615a7d565b5f91825260209091200190565b5464010000000090046001600160e01b031661186b565b509092915050565b82545f9081614482868683856146f7565b905080156144b05761449986614445600184615a7d565b5464010000000090046001600160e01b031661088d565b5091949350505050565b5f8181526001830160205260408120548015614594575f6144dc600183615a7d565b85549091505f906144ef90600190615a7d565b905081811461454e575f865f01828154811061450d5761450d6156a7565b905f5260205f200154905080875f01848154811061452d5761452d6156a7565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061455f5761455f615b66565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506117c3565b5f9150506117c3565b5f5f5f6145aa858561474a565b90925090505f8160048111156145c2576145c2615b05565b1480156145e05750856001600160a01b0316826001600160a01b0316145b8061088d575061088d868686614789565b825480156146a9575f61460985614445600185615a7d565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b03166020840152919250908516101561465c5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036146a7578261467d86614445600186615a7d565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b818310156119ba575f61470c8484614870565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561473657809250614744565b61474181600161577b565b93505b506146f9565b5f5f825160410361477e576020830151604084015160608501515f1a6147728782858561488a565b94509450505050611e73565b505f90506002611e73565b5f5f5f856001600160a01b0316631626ba7e60e01b86866040516024016147b1929190615b7a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516147ef9190615b92565b5f60405180830381855afa9150503d805f8114614827576040519150601f19603f3d011682016040523d82523d5f602084013e61482c565b606091505b509150915081801561484057506020815110155b801561088d57508051630b135d3f60e11b9061486590830160209081019084016158f9565b149695505050505050565b5f61487e6002848418615ba8565b610c9c9084841661577b565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156148bf57505f9050600361493e565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614910573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116614938575f6001925092505061493e565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f209081019282156149f3579160200282015b828111156149f357825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906149be565b506149ff929150614a53565b5090565b828054828255905f5260205f209081019282156149f3579160200282015b828111156149f3578251825591602001919060010190614a21565b5080545f8255905f5260205f209081019061239f91905b5b808211156149ff575f8155600101614a54565b6001600160a01b038116811461239f575f5ffd5b8035611f9e81614a67565b5f5f5f5f5f60a08688031215614a9a575f5ffd5b8535614aa581614a67565b94506020860135614ab581614a67565b93506040860135614ac581614a67565b94979396509394606081013594506080013592915050565b5f5f83601f840112614aed575f5ffd5b5081356001600160401b03811115614b03575f5ffd5b6020830191508360208260051b8501011115611e73575f5ffd5b5f5f60208385031215614b2e575f5ffd5b82356001600160401b03811115614b43575f5ffd5b614b4f85828601614add565b90969095509350505050565b602080825282518282018190525f918401906040840190835b81811015612542578351835260209384019390920191600101614b74565b5f60208284031215614ba2575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614bdf57614bdf614ba9565b60405290565b604080519081016001600160401b0381118282101715614bdf57614bdf614ba9565b604051601f8201601f191681016001600160401b0381118282101715614c2f57614c2f614ba9565b604052919050565b5f6001600160401b03821115614c4f57614c4f614ba9565b5060051b60200190565b5f82601f830112614c68575f5ffd5b8135614c7b614c7682614c37565b614c07565b8082825260208201915060208360051b860101925085831115614c9c575f5ffd5b602085015b83811015614cc2578035614cb481614a67565b835260209283019201614ca1565b5095945050505050565b5f82601f830112614cdb575f5ffd5b8135614ce9614c7682614c37565b8082825260208201915060208360051b860101925085831115614d0a575f5ffd5b602085015b83811015614cc2578035835260209283019201614d0f565b5f5f5f60608486031215614d39575f5ffd5b8335614d4481614a67565b925060208401356001600160401b03811115614d5e575f5ffd5b614d6a86828701614c59565b92505060408401356001600160401b03811115614d85575f5ffd5b614d9186828701614ccc565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614dcb578151865260209586019590910190600101614dad565b5093949350505050565b602081525f610c9c6020830184614d9b565b803563ffffffff81168114611f9e575f5ffd5b5f5f83601f840112614e0a575f5ffd5b5081356001600160401b03811115614e20575f5ffd5b602083019150836020828501011115611e73575f5ffd5b5f5f5f5f60608587031215614e4a575f5ffd5b8435614e5581614a67565b9350614e6360208601614de7565b925060408501356001600160401b03811115614e7d575f5ffd5b614e8987828801614dfa565b95989497509550505050565b5f5f5f5f60808587031215614ea8575f5ffd5b8435614eb381614a67565b93506020850135614ec381614a67565b93969395505050506040820135916060013590565b5f60208284031215614ee8575f5ffd5b8135610c9c81614a67565b5f5f60408385031215614f04575f5ffd5b8235614f0f81614a67565b91506020830135614f1f81614a67565b809150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610c9c6020830184614f2a565b5f60e08284031215614f7a575f5ffd5b614f82614bbd565b9050614f8d82614a7b565b8152614f9b60208301614a7b565b6020820152614fac60408301614a7b565b604082015260608281013590820152614fc760808301614de7565b608082015260a08201356001600160401b03811115614fe4575f5ffd5b614ff084828501614c59565b60a08301525060c08201356001600160401b0381111561500e575f5ffd5b61501a84828501614ccc565b60c08301525092915050565b5f60208284031215615036575f5ffd5b81356001600160401b0381111561504b575f5ffd5b61186b84828501614f6a565b5f60208284031215615067575f5ffd5b813560ff81168114610c9c575f5ffd5b6001600160401b038116811461239f575f5ffd5b5f5f5f5f5f5f86880360e08112156150a1575f5ffd5b87356150ac81614a67565b96506040601f19820112156150bf575f5ffd5b506020870194506060870135935060808701356150db81614a67565b925060a08701356150eb81615077565b915060c08701356150fb81615077565b809150509295509295509295565b5f8151808452602084019350602083015f5b82811015614dcb5781516001600160a01b031686526020958601959091019060010161511b565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f9161518d9085018263ffffffff169052565b5060a082015160e060a08501526151a760e0850182615109565b905060c083015184820360c08601526140c28282614d9b565b604081525f6151d26040830185615142565b82810360208401526140c28185614d9b565b5f82825180855260208501945060208160051b830101602085015f5b8381101561422357601f1985840301885261521c838351614d9b565b6020988901989093509190910190600101615200565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b8281101561528957605f19878603018452615274858351615142565b94506020938401939190910190600101615258565b5050505082810360208401526140c281856151e4565b5f5f5f606084860312156152b1575f5ffd5b83356152bc81614a67565b92506020840135915060408401356152d381615077565b809150509250925092565b604081525f6151d26040830185615109565b5f5f5f60408486031215615302575f5ffd5b833561530d81614a67565b925060208401356001600160401b03811115615327575f5ffd5b61533386828701614dfa565b9497909650939450505050565b5f5f60408385031215615351575f5ffd5b823561535c81614a67565b915060208301356001600160401b03811115615376575f5ffd5b61538285828601614c59565b9150509250929050565b5f5f5f5f5f5f606087890312156153a1575f5ffd5b86356001600160401b038111156153b6575f5ffd5b6153c289828a01614add565b90975095505060208701356001600160401b038111156153e0575f5ffd5b6153ec89828a01614add565b90955093505060408701356001600160401b0381111561540a575f5ffd5b61541689828a01614add565b979a9699509497509295939492505050565b602081525f610c9c6020830184615142565b5f5f5f6060848603121561544c575f5ffd5b833561545781614a67565b925060208401356001600160401b03811115615471575f5ffd5b840160408187031215615482575f5ffd5b61548a614be5565b81356001600160401b0381111561549f575f5ffd5b8201601f810188136154af575f5ffd5b80356001600160401b038111156154c8576154c8614ba9565b6154db601f8201601f1916602001614c07565b8181528960208385010111156154ef575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f60408385031215615532575f5ffd5b823561553d81614a67565b946020939093013593505050565b604081525f6151d26040830185614d9b565b801515811461239f575f5ffd5b5f5f5f5f6060858703121561557d575f5ffd5b84356001600160401b03811115615592575f5ffd5b850160e081880312156155a3575f5ffd5b935060208501356001600160401b038111156155bd575f5ffd5b6155c987828801614add565b90945092505060408501356155dd8161555d565b939692955090935050565b5f5f604083850312156155f9575f5ffd5b82356001600160401b0381111561560e575f5ffd5b8301601f8101851361561e575f5ffd5b803561562c614c7682614c37565b8082825260208201915060208360051b85010192508783111561564d575f5ffd5b6020840193505b8284101561567857833561566781614a67565b825260209384019390910190615654565b945050505060208301356001600160401b03811115615376575f5ffd5b602081525f610c9c60208301846151e4565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126156cf575f5ffd5b9190910192915050565b5f5f8335601e198436030181126156ee575f5ffd5b8301803591506001600160401b03821115615707575f5ffd5b6020019150600581901b3603821315611e73575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f6020828403121561575c575f5ffd5b8151610c9c81615077565b634e487b7160e01b5f52601160045260245ffd5b808201808211156117c3576117c3615767565b60a08101853561579d81614a67565b6001600160a01b0316825263ffffffff6157b960208801614de7565b16602083015260408201949094526001600160a01b03929092166060830152608090910152919050565b5f82601f8301126157f2575f5ffd5b8151615800614c7682614c37565b8082825260208201915060208360051b860101925085831115615821575f5ffd5b602085015b83811015614cc2578051835260209283019201615826565b5f5f6040838503121561584f575f5ffd5b82516001600160401b03811115615864575f5ffd5b8301601f81018513615874575f5ffd5b8051615882614c7682614c37565b8082825260208201915060208360051b8501019250878311156158a3575f5ffd5b6020840193505b828410156158ce5783516158bd81614a67565b8252602093840193909101906158aa565b8095505050505060208301516001600160401b038111156158ed575f5ffd5b615382858286016157e3565b5f60208284031215615909575f5ffd5b5051919050565b5f823560de198336030181126156cf575f5ffd5b5f6117c33683614f6a565b5f6020828403121561593f575f5ffd5b8135610c9c8161555d565b6001600160a01b03831681526040602082018190525f9061186b90830184615109565b5f6020828403121561597d575f5ffd5b81516001600160401b03811115615992575f5ffd5b8201601f810184136159a2575f5ffd5b80516159b0614c7682614c37565b8082825260208201915060208360051b8501019250868311156159d1575f5ffd5b6020840193505b8284101561088d5783516159eb81615077565b8252602093840193909101906159d8565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60018201615a3157615a31615767565b5060010190565b838152606060208201525f615a506060830185615142565b828103604084015261088d8185614d9b565b5f60208284031215615a72575f5ffd5b8151610c9c8161555d565b818103818111156117c3576117c3615767565b63ffffffff82811682821603908111156117c3576117c3615767565b63ffffffff81811683821601908111156117c3576117c3615767565b5f5f60408385031215615ad9575f5ffd5b505080516020909101519092909150565b5f60208284031215615afa575f5ffd5b8151610c9c81614a67565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160a01b03841681526060602082018190525f90615b5090830185615109565b905063ffffffff83166040830152949350505050565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f61186b6040830184614f2a565b5f82518060208501845e5f920191825250919050565b5f82615bc257634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220314e893993879f6da95d5c8d0827e8df59caf389b56c76b8587ef06511fe15bb64736f6c634300081e0033",
}
// DelegationManagerABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/DurationVaultStrategy/binding.go b/pkg/bindings/DurationVaultStrategy/binding.go
new file mode 100644
index 0000000000..a04b26eb59
--- /dev/null
+++ b/pkg/bindings/DurationVaultStrategy/binding.go
@@ -0,0 +1,3777 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package DurationVaultStrategy
+
+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
+)
+
+// IDurationVaultStrategyTypesVaultConfig is an auto generated low-level Go binding around an user-defined struct.
+type IDurationVaultStrategyTypesVaultConfig struct {
+ UnderlyingToken common.Address
+ VaultAdmin common.Address
+ Arbitrator common.Address
+ Duration uint32
+ MaxPerDeposit *big.Int
+ StakeCap *big.Int
+ MetadataURI string
+ OperatorSet OperatorSet
+ OperatorSetRegistrationData []byte
+ DelegationApprover common.Address
+ OperatorMetadataURI string
+}
+
+// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
+type OperatorSet struct {
+ Avs common.Address
+ Id uint32
+}
+
+// DurationVaultStrategyMetaData contains all meta data concerning the DurationVaultStrategy contract.
+var DurationVaultStrategyMetaData = &bind.MetaData{
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_rewardsCoordinator\",\"type\":\"address\",\"internalType\":\"contractIRewardsCoordinator\"},{\"name\":\"_strategyFactory\",\"type\":\"address\",\"internalType\":\"contractIStrategyFactory\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"advanceToWithdrawals\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationsActive\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"arbitrator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beforeAddShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beforeRemoveShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"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\":\"depositsOpen\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"duration\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"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\":\"config\",\"type\":\"tuple\",\"internalType\":\"structIDurationVaultStrategyTypes.VaultConfig\",\"components\":[{\"name\":\"underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"vaultAdmin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"arbitrator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stakeCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorSetRegistrationData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorMetadataURI\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isLocked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMatured\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lock\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lockedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"markMatured\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maturedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"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\":\"metadataURI\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorIntegrationConfigured\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"operatorSetInfo\",\"inputs\":[],\"outputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSetRegistered\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"rewardsCoordinator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRewardsCoordinator\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setRewardsClaimer\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakeCap\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIDurationVaultStrategyTypes.VaultState\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyFactory\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyFactory\"}],\"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\":\"unlockAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unlockTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateDelegationApprover\",\"inputs\":[{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateMetadataURI\",\"inputs\":[{\"name\":\"newMetadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"newOperatorMetadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newStakeCap\",\"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\":\"vaultAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":[{\"name\":\"amountOut\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalsOpen\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DeallocateAttempted\",\"inputs\":[{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DeregisterAttempted\",\"inputs\":[{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"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\":\"MetadataURIUpdated\",\"inputs\":[{\"name\":\"newMetadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":\"event\",\"name\":\"VaultAdvancedToWithdrawals\",\"inputs\":[{\"name\":\"arbitrator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"maturedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultInitialized\",\"inputs\":[{\"name\":\"vaultAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"arbitrator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"underlyingToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"contractIERC20\"},{\"name\":\"duration\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"maxPerDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"stakeCap\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultLocked\",\"inputs\":[{\"name\":\"lockedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"unlockAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultMatured\",\"inputs\":[{\"name\":\"maturedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositExceedsMaxPerDeposit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositsLocked\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationAlreadyElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidArbitrator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidVaultAdmin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeDelegatedToVaultOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyArbitrator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyVaultAdmin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorIntegrationInvalid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PendingAllocation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotSupportedByOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnderlyingTokenBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VaultAlreadyLocked\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VaultNotLocked\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalsLockedDuringAllocations\",\"inputs\":[]}]",
+ Bin: "0x610140604052348015610010575f5ffd5b5060405161420438038061420483398101604081905261002f916101e2565b8585806001600160a01b038116610059576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007461010f565b50506001600160a01b0384161580159061009657506001600160a01b03831615155b80156100aa57506001600160a01b03821615155b80156100be57506001600160a01b03811615155b6100db57604051635881876760e01b815260040160405180910390fd5b6001600160a01b0380851660c05283811660e0528281166101005281166101205261010461010f565b505050505050610265565b5f54610100900460ff161561017a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101c9575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101df575f5ffd5b50565b5f5f5f5f5f5f60c087890312156101f7575f5ffd5b8651610202816101cb565b6020880151909650610213816101cb565b6040880151909550610224816101cb565b6060880151909450610235816101cb565b6080880151909350610246816101cb565b60a0880151909250610257816101cb565b809150509295509295509295565b60805160a05160c05160e0516101005161012051613e9b6103695f395f81816105f60152610ef701525f818161058e01528181611410015281816123b40152818161242101526124a601525f81816106f101528181610b94015281816119ac0152818161231f01528181612568015281816127e40152818161281f01528181612ab401528181612b970152612ca101525f81816107ab01528181610fa1015281816110bd01528181611260015281816113650152818161216801526121e501525f818161043b0152818161080e0152818161099d01528181610e7201528181611795015261181701525f818161056701528181611bd40152611d3c0152613e9b5ff3fe608060405234801561000f575f5ffd5b5060043610610372575f3560e01c80638c871019116101d4578063c19d93fb11610109578063df6fadc1116100a9578063f3e7387511610079578063f3e73875146107cd578063f83d08ba146107e0578063fabc1cbc146107e8578063fb4d86b4146107fb575f5ffd5b8063df6fadc114610765578063e3dae51c14610780578063e7f6f22514610793578063ea4d3c9b146107a6575f5ffd5b8063ca8aa7c7116100e4578063ca8aa7c7146106ec578063ce7c2ac214610713578063d4deae8114610726578063d9caed1214610752575f5ffd5b8063c19d93fb146106ac578063c2cca26d146106c6578063c4d66de8146106d9575f5ffd5b8063aa5dec6f11610174578063b21634821161014f578063b216348214610667578063b4e20f131461067e578063b501d66014610691578063ba28fd2e146106a4575f5ffd5b8063aa5dec6f14610635578063ab5921e11461064c578063af6eb2be14610654575f5ffd5b806399be81c8116101af57806399be81c8146105de5780639ef35710146105f1578063a4e2d63414610618578063aa082a9d14610620575f5ffd5b80638c871019146105b05780638f6a6240146105c357806394aad677146105d6575f5ffd5b8063553ca5f8116102aa5780636cc6cde11161024a5780637a8b2637116102255780637a8b2637146105475780637f2b6a0d1461055a578063886f1195146105625780638a2fc4e314610589575f5ffd5b80636cc6cde1146105195780636d8690a91461052c57806373e3c28014610534575f5ffd5b80635ac86ab7116102855780635ac86ab7146104e15780635c975abb1461050057806361b01b5d146105085780636325f65514610511575f5ffd5b8063553ca5f8146104be578063595c6a67146104d157806359d915ff146104d9575f5ffd5b806339b70e381161031557806347e7ef24116102f057806347e7ef241461047d57806353fd3e81146104905780635438a8c7146104a3578063549c4627146104b6575f5ffd5b806339b70e38146104365780633a98ef391461045d57806343fe08b014610474575f5ffd5b806311c70c9d1161035057806311c70c9d146103d5578063136439dd146103e85780631f1cc9a3146103fb5780632495a5991461040b575f5ffd5b806303e3e6eb1461037657806303ee438c1461038b5780630fb5a6b4146103a9575b5f5ffd5b610389610384366004613026565b610803565b005b61039361088e565b6040516103a0919061307e565b60405180910390f35b6033546103c090600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016103a0565b6103896103e3366004613090565b61091a565b6103896103f63660046130b0565b610951565b6034546103c09063ffffffff1681565b60645461041e906001600160a01b031681565b6040516001600160a01b0390911681526020016103a0565b61041e7f000000000000000000000000000000000000000000000000000000000000000081565b61046660655481565b6040519081526020016103a0565b61046660375481565b61046661048b366004613026565b610987565b61038961049e3660046130c7565b610ab6565b60015b60405190151581526020016103a0565b6104a6610b2c565b6104666104cc366004613133565b610b54565b610389610b67565b6104a6610b7b565b6104a66104ef36600461315c565b6001805460ff9092161b9081161490565b600154610466565b61046660385481565b610389610c10565b60335461041e906001600160a01b031681565b610389610d70565b610389610542366004613026565b610e67565b6104666105553660046130b0565b61118d565b6104a66111d6565b61041e7f000000000000000000000000000000000000000000000000000000000000000081565b61041e7f000000000000000000000000000000000000000000000000000000000000000081565b6104666105be3660046130b0565b6111de565b6104666105d1366004613133565b6111e8565b6104a66111f5565b6103896105ec3660046130c7565b61121e565b61041e7f000000000000000000000000000000000000000000000000000000000000000081565b6104a66112c2565b603354600160e01b900463ffffffff166103c0565b6033546103c090600160e01b900463ffffffff1681565b6103936112ca565b610389610662366004613090565b6112ea565b6033546103c090600160c01b900463ffffffff1681565b61038961068c366004613133565b611315565b61038961069f366004613133565b6113c0565b603854610466565b603454600160201b900460ff166040516103a0919061318b565b6103896106d436600461330b565b61143f565b6103896106e7366004613133565b6116b0565b61041e7f000000000000000000000000000000000000000000000000000000000000000081565b610466610721366004613133565b61176e565b603654604080516001600160a01b0383168152600160a01b90920463ffffffff166020830152016103a0565b61046661076036600461344b565b611800565b603754603854604080519283526020830191909152016103a0565b61046661078e3660046130b0565b611902565b60325461041e906001600160a01b031681565b61041e7f000000000000000000000000000000000000000000000000000000000000000081565b6104666107db3660046130b0565b611939565b610389611943565b6103896107f63660046130b0565b611b5d565b6104a6611bca565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461084c576040516348da714f60e01b815260040160405180910390fd5b6002603454600160201b900460ff16600381111561086c5761086c613177565b0361088a576040516324d94d6960e11b815260040160405180910390fd5b5050565b6035805461089b90613489565b80601f01602080910402602001604051908101604052809291908181526020018280546108c790613489565b80156109125780601f106108e957610100808354040283529160200191610912565b820191905f5260205f20905b8154815290600101906020018083116108f557829003601f168201915b505050505081565b610922611bd2565b61092a610b2c565b6109475760405163faa4be9f60e01b815260040160405180910390fd5b61088a8282611c83565b610959611d27565b600154818116811461097e5760405163c61dca5d60e01b815260040160405180910390fd5b61088a82611dca565b5f5f61099281611e07565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109db576040516348da714f60e01b815260040160405180910390fd5b6109e58484611e3d565b6065545f6109f56103e8836134d5565b90505f6103e8610a03611e6b565b610a0d91906134d5565b90505f610a1a87836134e8565b905080610a2784896134fb565b610a319190613512565b9550855f03610a5357604051630c392ed360e11b815260040160405180910390fd5b610a5d86856134d5565b60658190556f4b3b4ca85a86c47a098a223fffffffff1015610a9257604051632f14e8a360e11b815260040160405180910390fd5b610aab826103e8606554610aa691906134d5565b611ed5565b505050505092915050565b6032546001600160a01b03163314610ae157604051635b26872160e11b815260040160405180910390fd5b6035610aee828483613575565b507fefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba398282604051610b20929190613656565b60405180910390a15050565b5f60015b603454600160201b900460ff166003811115610b4e57610b4e613177565b14905090565b5f610b616105558361176e565b92915050565b610b6f611d27565b610b795f19611dca565b565b6040516333869dd160e11b81525f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063670d3ba290610bcc903090603690600401613669565b602060405180830381865afa158015610be7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0b919061369f565b905090565b6033546001600160a01b03163314610c3b57604051631777988560e11b815260040160405180910390fd5b6003603454600160201b900460ff166003811115610c5b57610c5b613177565b03610c6857610b79611f21565b6002603454600160201b900460ff166003811115610c8857610c88613177565b14610ca6576040516329d0828960e01b815260040160405180910390fd5b603354600160e01b900463ffffffff164210610cd557604051632825c17f60e11b815260040160405180910390fd5b6034805463ffffffff421664ffffffffff199091168117640300000000179091556040519081527fff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f29060200160405180910390a160345460405163ffffffff909116815233907f96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb979060200160405180910390a2610b79611f21565b6003603454600160201b900460ff166003811115610d9057610d90613177565b03610d9d57610b79611f21565b6002603454600160201b900460ff166003811115610dbd57610dbd613177565b14610ddb576040516306560dcd60e41b815260040160405180910390fd5b603354600160e01b900463ffffffff16421015610e0b576040516306560dcd60e41b815260040160405180910390fd5b6034805463ffffffff421664ffffffffff199091168117640300000000179091556040519081527fff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f29060200160405180910390a1610b79611f21565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610eb0576040516348da714f60e01b815260040160405180910390fd5b610eb8610b2c565b610ed55760405163faa4be9f60e01b815260040160405180910390fd5b60645460405163fe575a8760e01b81526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063fe575a8790602401602060405180830381865afa158015610f3e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f62919061369f565b15610f80576040516337b068d160e21b815260040160405180910390fd5b604051631976849960e21b81526001600160a01b03838116600483015230917f0000000000000000000000000000000000000000000000000000000000000000909116906365da126490602401602060405180830381865afa158015610fe8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061100c91906136be565b6001600160a01b031614611033576040516315192e1d60e11b815260040160405180910390fd5b5f61103d8261118d565b9050603754811115611062576040516334e2c93760e21b815260040160405180910390fd5b6040805160018082528183019092525f916020808301908036833701905050905030815f81518110611096576110966136d9565b6001600160a01b039283166020918202929092010152604051639004134760e01b81525f917f000000000000000000000000000000000000000000000000000000000000000016906390041347906110f49030908690600401613730565b5f60405180830381865afa15801561110e573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111359190810190613775565b5f81518110611146576111466136d9565b602002602001015190505f611160858361055591906134d5565b90506038548111156111855760405163d86bae6760e01b815260040160405180910390fd5b505050505050565b5f5f6103e860655461119f91906134d5565b90505f6103e86111ad611e6b565b6111b791906134d5565b9050816111c485836134fb565b6111ce9190613512565b949350505050565b5f6003610b30565b5f610b6182611902565b5f610b616107db8361176e565b5f60025b603454600160201b900460ff16600381111561121757611217613177565b1415905090565b6032546001600160a01b0316331461124957604051635b26872160e11b815260040160405180910390fd5b6040516378296ec560e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906378296ec5906112999030908690869060040161380a565b5f604051808303815f87803b1580156112b0575f5ffd5b505af1158015611185573d5f5f3e3d5ffd5b5f60016111f9565b60606040518060800160405280604d8152602001613e19604d9139905090565b6032546001600160a01b0316331461092257604051635b26872160e11b815260040160405180910390fd5b6032546001600160a01b0316331461134057604051635b26872160e11b815260040160405180910390fd5b60405163152df25b60e21b81523060048201526001600160a01b0382811660248301527f000000000000000000000000000000000000000000000000000000000000000016906354b7c96c906044015b5f604051808303815f87803b1580156113a7575f5ffd5b505af11580156113b9573d5f5f3e3d5ffd5b5050505050565b6032546001600160a01b031633146113eb57604051635b26872160e11b815260040160405180910390fd5b60405163f22cef8560e01b81523060048201526001600160a01b0382811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063f22cef8590604401611390565b5f54610100900460ff161580801561145d57505f54600160ff909116105b806114765750303b15801561147657505f5460ff166001145b61149b5760405162461bcd60e51b815260040161149290613837565b60405180910390fd5b5f805460ff1916600117905580156114bc575f805461ff0019166101001790555b60208201516001600160a01b03166114e757604051633b7dc71360e01b815260040160405180910390fd5b60408201516001600160a01b031661151157604051627528a560e41b815260040160405180910390fd5b606082015163ffffffff161580159061153e57506303c2670063ffffffff16826060015163ffffffff1611155b61155b57604051637616640160e01b815260040160405180910390fd5b61156d82608001518360a00151611c83565b815161157890611fa5565b6020820151603280546001600160a01b039283166001600160a01b0319909116179055604083015160338054606086015163ffffffff16600160a01b026001600160c01b0319909116929093169190911791909117905560c08201516035906115e19082613885565b506115eb826120f0565b6034805464ff000000001916600160201b1790558151603354603254608085015160a08601516040516001600160a01b0395861695808616959416937fbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e9361166793600160a01b90920463ffffffff169290919060359061393f565b60405180910390a4801561088a575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610b20565b5f54610100900460ff16158080156116ce57505f54600160ff909116105b806116e75750303b1580156116e757505f5460ff166001145b6117035760405162461bcd60e51b815260040161149290613837565b5f805460ff191660011790558015611724575f805461ff0019166101001790555b61172d82611fa5565b801561088a575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610b20565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156117dc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6191906139e1565b5f600161180c81611e07565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611855576040516348da714f60e01b815260040160405180910390fd5b61186085858561250d565b6065548084111561188457604051630b469df360e41b815260040160405180910390fd5b5f6118916103e8836134d5565b90505f6103e861189f611e6b565b6118a991906134d5565b9050816118b687836134fb565b6118c09190613512565b94506118cc86846134e8565b6065556118ec6118dc86836134e8565b6103e8606554610aa691906134d5565b6118f788888761253b565b505050509392505050565b5f5f6103e860655461191491906134d5565b90505f6103e8611922611e6b565b61192c91906134d5565b9050806111c483866134fb565b5f610b618261118d565b6032546001600160a01b0316331461196e57604051635b26872160e11b815260040160405180910390fd5b611976610b2c565b61199357604051630a6c62fd60e41b815260040160405180910390fd5b60405163105dea1f60e21b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634177a87c906119e2906036906004016139f8565b5f60405180830381865afa1580156119fc573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a239190810190613a1f565b90505f805b8251811015611a7457306001600160a01b0316838281518110611a4d57611a4d6136d9565b60200260200101516001600160a01b031603611a6c5760019150611a74565b600101611a28565b5080611a93576040516329e0527160e11b815260040160405180910390fd5b6033805463ffffffff42818116600160c01b0263ffffffff60c01b1990931692909217928390559091611acf91600160a01b9091041682613aae565b603380546001600160e01b0316600160e01b63ffffffff938416810291909117918290556034805464020000000064ff000000001990911617905560408051600160c01b8404851681529190920490921660208301527f42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4910160405180910390a1611b5861254f565b505050565b611b65611bd2565b60015480198219811614611b8c5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6002610b30565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c2e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c5291906136be565b6001600160a01b0316336001600160a01b031614610b795760405163794821ff60e01b815260040160405180910390fd5b60375460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160385460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115611d1c5760405163052b07b760e21b815260040160405180910390fd5b603791909155603855565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611d89573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dad919061369f565b610b7957604051631d77d47760e21b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b611e1c816001805460ff9092161b9081161490565b15611e3a5760405163840a48d560e01b815260040160405180910390fd5b50565b6064546001600160a01b0383811691161461088a57604051630312abdd60e61b815260040160405180910390fd5b6064546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015611eb1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0b91906139e1565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881611f0984670de0b6b3a76400006134fb565b611f139190613512565b604051908152602001610b20565b5f611f2a61281b565b90507f72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b81604051611f5f911515815260200190565b60405180910390a15f611f70612b7e565b90507fd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d16881604051610b20911515815260200190565b5f54610100900460ff1661200f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611492565b606480546001600160a01b0319166001600160a01b0383161790556120335f611dca565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760645f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120c99190613aca565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b60e0810151516001600160a01b031661211c57604051635881876760e01b815260040160405180910390fd5b60e081015180516036805460209384015163ffffffff16600160a01b026001600160c01b03199091166001600160a01b0393841617179055604080516318891fd760e31b815290515f937f00000000000000000000000000000000000000000000000000000000000000009093169263c448feb892600480820193918290030181865afa1580156121af573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121d39190613ae5565b90505f6121e1826001613aae565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632aa6d888846101200151838661014001516040518463ffffffff1660e01b815260040161223d93929190613b00565b5f604051808303815f87803b158015612254575f5ffd5b505af1158015612266573d5f5f3e3d5ffd5b5050505061229660405180606001604052805f6001600160a01b0316815260200160608152602001606081525090565b60e0840151516001600160a01b031681526040805160018082528183019092529060208083019080368337505050602082810182905260e0860151015181519091905f906122e6576122e66136d9565b63ffffffff909216602092830291909101909101526101008401516040808301919091525163adc2e3d960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063adc2e3d9906123569030908590600401613b65565b5f604051808303815f87803b15801561236d575f5ffd5b505af115801561237f573d5f5f3e3d5ffd5b5050505060e08401515160405163dcbb03b360e01b81523060048201526001600160a01b0391821660248201525f60448201527f00000000000000000000000000000000000000000000000000000000000000009091169063dcbb03b3906064015f604051808303815f87803b1580156123f7575f5ffd5b505af1158015612409573d5f5f3e3d5ffd5b5050505060e0840151604051633dd3a3ab60e21b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163f74e8eac916124609130915f90600401613bba565b5f604051808303815f87803b158015612477575f5ffd5b505af1158015612489573d5f5f3e3d5ffd5b505060405163059edd8760e51b81523060048201525f60248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316925063b3dbb0e091506044015f604051808303815f87803b1580156124f1575f5ffd5b505af1158015612503573d5f5f3e3d5ffd5b5050505050505050565b6064546001600160a01b03838116911614611b5857604051630312abdd60e61b815260040160405180910390fd5b611b586001600160a01b0383168483612d68565b60405163021c373760e31b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906310e1b9b8906125a29030906036908290600401613c02565b606060405180830381865afa1580156125bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125e19190613c51565b9050806040015163ffffffff165f1461260d5760405163024b01ff60e11b815260040160405180910390fd5b6040805160018082528183019092525f91816020015b6126576040805160a081019091525f6060820181815260808301919091528190815260200160608152602001606081525090565b81526020019060019003908161262357905050604080518082019091526036546001600160a01b0381168252600160a01b900463ffffffff16602082015281519192509082905f906126ab576126ab6136d9565b6020908102919091010151526040805160018082528183019092529081602001602082028036833701905050815f815181106126e9576126e96136d9565b60200260200101516020018190525030815f8151811061270b5761270b6136d9565b6020026020010151602001515f81518110612728576127286136d9565b6001600160a01b039290921660209283029190910182015260408051600180825281830190925291828101908036833701905050815f8151811061276e5761276e6136d9565b602002602001015160400181905250670de0b6b3a7640000815f81518110612798576127986136d9565b6020026020010151604001515f815181106127b5576127b56136d9565b6001600160401b0390921660209283029190910190910152604051634a944cf760e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063952899ee906112999030908590600401613cd3565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166310e1b9b8306036306040518463ffffffff1660e01b815260040161286e93929190613c02565b606060405180830381865afa158015612889573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ad9190613c51565b80519091506001600160401b03161580156128cd57506020810151600f0b155b156128da57600191505090565b604081015163ffffffff16156128f1575f91505090565b6040805160018082528183019092525f91816020015b61293b6040805160a081019091525f6060820181815260808301919091528190815260200160608152602001606081525090565b81526020019060019003908161290757905050604080518082019091526036546001600160a01b0381168252600160a01b900463ffffffff16602082015281519192509082905f9061298f5761298f6136d9565b6020908102919091010151526040805160018082528183019092529081602001602082028036833701905050815f815181106129cd576129cd6136d9565b60200260200101516020018190525030815f815181106129ef576129ef6136d9565b6020026020010151602001515f81518110612a0c57612a0c6136d9565b6001600160a01b039290921660209283029190910182015260408051600180825281830190925291828101908036833701905050815f81518110612a5257612a526136d9565b6020026020010151604001819052505f815f81518110612a7457612a746136d9565b6020026020010151604001515f81518110612a9157612a916136d9565b60200260200101906001600160401b031690816001600160401b0316815250505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663952899ee60e01b3084604051602401612af7929190613cd3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612b359190613dc6565b5f604051808303815f865af19150503d805f8114612b6e576040519150601f19603f3d011682016040523d82523d5f602084013e612b73565b606091505b509095945050505050565b6040516333869dd160e11b81525f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063670d3ba290612bcf903090603690600401613669565b602060405180830381865afa158015612bea573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c0e919061369f565b612c185750600190565b6040805160608082018352818301523081526036546001600160a01b0316602082015281516001808252818401909352909181602001602082028036833701905050604082018190526036548151600160a01b90910463ffffffff1691905f90612c8457612c846136d9565b602002602001019063ffffffff16908163ffffffff16815250505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e3492b560e01b83604051602401612ce29190613ddc565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612d209190613dc6565b5f604051808303815f865af19150503d805f8114612d59576040519150601f19603f3d011682016040523d82523d5f602084013e612d5e565b606091505b5090949350505050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152611b58928692915f91612df7918516908490612e76565b905080515f1480612e17575080806020019051810190612e17919061369f565b611b585760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611492565b6060612e8484845f85612e8e565b90505b9392505050565b606082471015612eef5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611492565b5f5f866001600160a01b03168587604051612f0a9190613dc6565b5f6040518083038185875af1925050503d805f8114612f44576040519150601f19603f3d011682016040523d82523d5f602084013e612f49565b606091505b5091509150612f5a87838387612f65565b979650505050505050565b60608315612fd35782515f03612fcc576001600160a01b0385163b612fcc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611492565b50816111ce565b6111ce8383815115612fe85781518083602001fd5b8060405162461bcd60e51b8152600401611492919061307e565b6001600160a01b0381168114611e3a575f5ffd5b803561302181613002565b919050565b5f5f60408385031215613037575f5ffd5b823561304281613002565b946020939093013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f612e876020830184613050565b5f5f604083850312156130a1575f5ffd5b50508035926020909101359150565b5f602082840312156130c0575f5ffd5b5035919050565b5f5f602083850312156130d8575f5ffd5b82356001600160401b038111156130ed575f5ffd5b8301601f810185136130fd575f5ffd5b80356001600160401b03811115613112575f5ffd5b856020828401011115613123575f5ffd5b6020919091019590945092505050565b5f60208284031215613143575f5ffd5b8135612e8781613002565b60ff81168114611e3a575f5ffd5b5f6020828403121561316c575f5ffd5b8135612e878161314e565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106131ab57634e487b7160e01b5f52602160045260245ffd5b91905290565b634e487b7160e01b5f52604160045260245ffd5b60405161016081016001600160401b03811182821017156131e8576131e86131b1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613216576132166131b1565b604052919050565b63ffffffff81168114611e3a575f5ffd5b80356130218161321e565b5f82601f830112613249575f5ffd5b8135602083015f5f6001600160401b03841115613268576132686131b1565b50601f8301601f191660200161327d816131ee565b915050828152858383011115613291575f5ffd5b828260208301375f92810160200192909252509392505050565b5f604082840312156132bb575f5ffd5b604080519081016001600160401b03811182821017156132dd576132dd6131b1565b60405290508082356132ee81613002565b815260208301356132fe8161321e565b6020919091015292915050565b5f6020828403121561331b575f5ffd5b81356001600160401b03811115613330575f5ffd5b82016101808185031215613342575f5ffd5b61334a6131c5565b61335382613016565b815261336160208301613016565b602082015261337260408301613016565b60408201526133836060830161322f565b60608201526080828101359082015260a0808301359082015260c08201356001600160401b038111156133b4575f5ffd5b6133c08682850161323a565b60c0830152506133d38560e084016132ab565b60e08201526101208201356001600160401b038111156133f1575f5ffd5b6133fd8682850161323a565b610100830152506134116101408301613016565b6101208201526101608201356001600160401b03811115613430575f5ffd5b61343c8682850161323a565b61014083015250949350505050565b5f5f5f6060848603121561345d575f5ffd5b833561346881613002565b9250602084013561347881613002565b929592945050506040919091013590565b600181811c9082168061349d57607f821691505b6020821081036134bb57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610b6157610b616134c1565b81810381811115610b6157610b616134c1565b8082028115828204841417610b6157610b616134c1565b5f8261352c57634e487b7160e01b5f52601260045260245ffd5b500490565b601f821115611b5857805f5260205f20601f840160051c810160208510156135565750805b601f840160051c820191505b818110156113b9575f8155600101613562565b6001600160401b0383111561358c5761358c6131b1565b6135a08361359a8354613489565b83613531565b5f601f8411600181146135d1575f85156135ba5750838201355b5f19600387901b1c1916600186901b1783556113b9565b5f83815260208120601f198716915b8281101561360057868501358255602094850194600190920191016135e0565b508682101561361c575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f612e8460208301848661362e565b6001600160a01b038316815260608101612e876020830184546001600160a01b038116825260a01c63ffffffff16602090910152565b5f602082840312156136af575f5ffd5b81518015158114612e87575f5ffd5b5f602082840312156136ce575f5ffd5b8151612e8781613002565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602084019350602083015f5b828110156137265781516001600160a01b03168652602095860195909101906001016136ff565b5093949350505050565b6001600160a01b03831681526040602082018190525f90612e84908301846136ed565b5f6001600160401b0382111561376b5761376b6131b1565b5060051b60200190565b5f60208284031215613785575f5ffd5b81516001600160401b0381111561379a575f5ffd5b8201601f810184136137aa575f5ffd5b80516137bd6137b882613753565b6131ee565b8082825260208201915060208360051b8501019250868311156137de575f5ffd5b6020840193505b828410156138005783518252602093840193909101906137e5565b9695505050505050565b6001600160a01b03841681526040602082018190525f9061382e908301848661362e565b95945050505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b81516001600160401b0381111561389e5761389e6131b1565b6138b2816138ac8454613489565b84613531565b6020601f8211600181146138e4575f83156138cd5750848201515b5f19600385901b1c1916600184901b1784556113b9565b5f84815260208120601f198516915b8281101561391357878501518255602094850194600190920191016138f3565b508482101561393057868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b63ffffffff85168152836020820152826040820152608060608201525f5f835461396881613489565b806080860152600182165f811461398657600181146139a2576139d3565b60ff19831660a087015260a082151560051b87010193506139d3565b865f5260205f205f5b838110156139ca57815488820160a001526001909101906020016139ab565b870160a0019450505b509198975050505050505050565b5f602082840312156139f1575f5ffd5b5051919050565b60408101610b618284546001600160a01b038116825260a01c63ffffffff16602090910152565b5f60208284031215613a2f575f5ffd5b81516001600160401b03811115613a44575f5ffd5b8201601f81018413613a54575f5ffd5b8051613a626137b882613753565b8082825260208201915060208360051b850101925086831115613a83575f5ffd5b6020840193505b82841015613800578351613a9d81613002565b825260209384019390910190613a8a565b63ffffffff8181168382160190811115610b6157610b616134c1565b5f60208284031215613ada575f5ffd5b8151612e878161314e565b5f60208284031215613af5575f5ffd5b8151612e878161321e565b6001600160a01b038416815263ffffffff831660208201526060604082018190525f9061382e90830184613050565b5f8151808452602084019350602083015f5b8281101561372657815163ffffffff16865260209586019590910190600101613b41565b6001600160a01b038381168252604060208084018290528451909216908301528201516060808301525f90613b9d60a0840182613b2f565b90506040840151603f198483030160808501526138008282613050565b6001600160a01b038416815260808101613bf0602083018580516001600160a01b0316825260209081015163ffffffff16910152565b61ffff83166060830152949350505050565b6001600160a01b038416815260808101613c386020830185546001600160a01b038116825260a01c63ffffffff16602090910152565b6001600160a01b03929092166060919091015292915050565b5f6060828403128015613c62575f5ffd5b50604051606081016001600160401b0381118282101715613c8557613c856131b1565b60405282516001600160401b0381168114613c9e575f5ffd5b81526020830151600f81900b8114613cb4575f5ffd5b60208201526040830151613cc78161321e565b60408201529392505050565b5f6040820160018060a01b03851683526040602084015280845180835260608501915060608160051b8601019250602086015f5b82811015613db957868503605f190184528151805180516001600160a01b0316875260209081015163ffffffff1690870152602081015160806040880152613d5260808801826136ed565b60409290920151878303606089015280518084526020918201935f935091909101905b80831015613da1576001600160401b038451168252602082019150602084019350600183019250613d75565b50965050506020938401939190910190600101613d07565b5092979650505050505050565b5f82518060208501845e5f920191825250919050565b602080825282516001600160a01b039081168383015290830151166040808301919091528201516060808301525f906111ce6080840182613b2f56fe4475726174696f6e2d626f756e64207661756c74207374726174656779207769746820636f6e666967757261626c65206465706f736974206361707320616e64206c6f636b20706572696f6473a2646970667358221220f0b0de05bf99024d1cfd0e195e186b64d0d54aab320b8768384d02307521211b64736f6c634300081e0033",
+}
+
+// DurationVaultStrategyABI is the input ABI used to generate the binding from.
+// Deprecated: Use DurationVaultStrategyMetaData.ABI instead.
+var DurationVaultStrategyABI = DurationVaultStrategyMetaData.ABI
+
+// DurationVaultStrategyBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use DurationVaultStrategyMetaData.Bin instead.
+var DurationVaultStrategyBin = DurationVaultStrategyMetaData.Bin
+
+// DeployDurationVaultStrategy deploys a new Ethereum contract, binding an instance of DurationVaultStrategy to it.
+func DeployDurationVaultStrategy(auth *bind.TransactOpts, backend bind.ContractBackend, _strategyManager common.Address, _pauserRegistry common.Address, _delegationManager common.Address, _allocationManager common.Address, _rewardsCoordinator common.Address, _strategyFactory common.Address) (common.Address, *types.Transaction, *DurationVaultStrategy, error) {
+ parsed, err := DurationVaultStrategyMetaData.GetAbi()
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ if parsed == nil {
+ return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+ }
+
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(DurationVaultStrategyBin), backend, _strategyManager, _pauserRegistry, _delegationManager, _allocationManager, _rewardsCoordinator, _strategyFactory)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &DurationVaultStrategy{DurationVaultStrategyCaller: DurationVaultStrategyCaller{contract: contract}, DurationVaultStrategyTransactor: DurationVaultStrategyTransactor{contract: contract}, DurationVaultStrategyFilterer: DurationVaultStrategyFilterer{contract: contract}}, nil
+}
+
+// DurationVaultStrategy is an auto generated Go binding around an Ethereum contract.
+type DurationVaultStrategy struct {
+ DurationVaultStrategyCaller // Read-only binding to the contract
+ DurationVaultStrategyTransactor // Write-only binding to the contract
+ DurationVaultStrategyFilterer // Log filterer for contract events
+}
+
+// DurationVaultStrategyCaller is an auto generated read-only Go binding around an Ethereum contract.
+type DurationVaultStrategyCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// DurationVaultStrategyTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type DurationVaultStrategyTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// DurationVaultStrategyFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type DurationVaultStrategyFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// DurationVaultStrategySession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type DurationVaultStrategySession struct {
+ Contract *DurationVaultStrategy // 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
+}
+
+// DurationVaultStrategyCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type DurationVaultStrategyCallerSession struct {
+ Contract *DurationVaultStrategyCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// DurationVaultStrategyTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type DurationVaultStrategyTransactorSession struct {
+ Contract *DurationVaultStrategyTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// DurationVaultStrategyRaw is an auto generated low-level Go binding around an Ethereum contract.
+type DurationVaultStrategyRaw struct {
+ Contract *DurationVaultStrategy // Generic contract binding to access the raw methods on
+}
+
+// DurationVaultStrategyCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type DurationVaultStrategyCallerRaw struct {
+ Contract *DurationVaultStrategyCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// DurationVaultStrategyTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type DurationVaultStrategyTransactorRaw struct {
+ Contract *DurationVaultStrategyTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewDurationVaultStrategy creates a new instance of DurationVaultStrategy, bound to a specific deployed contract.
+func NewDurationVaultStrategy(address common.Address, backend bind.ContractBackend) (*DurationVaultStrategy, error) {
+ contract, err := bindDurationVaultStrategy(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategy{DurationVaultStrategyCaller: DurationVaultStrategyCaller{contract: contract}, DurationVaultStrategyTransactor: DurationVaultStrategyTransactor{contract: contract}, DurationVaultStrategyFilterer: DurationVaultStrategyFilterer{contract: contract}}, nil
+}
+
+// NewDurationVaultStrategyCaller creates a new read-only instance of DurationVaultStrategy, bound to a specific deployed contract.
+func NewDurationVaultStrategyCaller(address common.Address, caller bind.ContractCaller) (*DurationVaultStrategyCaller, error) {
+ contract, err := bindDurationVaultStrategy(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyCaller{contract: contract}, nil
+}
+
+// NewDurationVaultStrategyTransactor creates a new write-only instance of DurationVaultStrategy, bound to a specific deployed contract.
+func NewDurationVaultStrategyTransactor(address common.Address, transactor bind.ContractTransactor) (*DurationVaultStrategyTransactor, error) {
+ contract, err := bindDurationVaultStrategy(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyTransactor{contract: contract}, nil
+}
+
+// NewDurationVaultStrategyFilterer creates a new log filterer instance of DurationVaultStrategy, bound to a specific deployed contract.
+func NewDurationVaultStrategyFilterer(address common.Address, filterer bind.ContractFilterer) (*DurationVaultStrategyFilterer, error) {
+ contract, err := bindDurationVaultStrategy(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyFilterer{contract: contract}, nil
+}
+
+// bindDurationVaultStrategy binds a generic wrapper to an already deployed contract.
+func bindDurationVaultStrategy(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := DurationVaultStrategyMetaData.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 (_DurationVaultStrategy *DurationVaultStrategyRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _DurationVaultStrategy.Contract.DurationVaultStrategyCaller.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 (_DurationVaultStrategy *DurationVaultStrategyRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.DurationVaultStrategyTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_DurationVaultStrategy *DurationVaultStrategyRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.DurationVaultStrategyTransactor.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 (_DurationVaultStrategy *DurationVaultStrategyCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _DurationVaultStrategy.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 (_DurationVaultStrategy *DurationVaultStrategyTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.contract.Transact(opts, method, params...)
+}
+
+// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
+//
+// Solidity: function allocationManager() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "allocationManager")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
+//
+// Solidity: function allocationManager() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategySession) AllocationManager() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.AllocationManager(&_DurationVaultStrategy.CallOpts)
+}
+
+// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
+//
+// Solidity: function allocationManager() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) AllocationManager() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.AllocationManager(&_DurationVaultStrategy.CallOpts)
+}
+
+// AllocationsActive is a free data retrieval call binding the contract method 0xfb4d86b4.
+//
+// Solidity: function allocationsActive() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) AllocationsActive(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "allocationsActive")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// AllocationsActive is a free data retrieval call binding the contract method 0xfb4d86b4.
+//
+// Solidity: function allocationsActive() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategySession) AllocationsActive() (bool, error) {
+ return _DurationVaultStrategy.Contract.AllocationsActive(&_DurationVaultStrategy.CallOpts)
+}
+
+// AllocationsActive is a free data retrieval call binding the contract method 0xfb4d86b4.
+//
+// Solidity: function allocationsActive() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) AllocationsActive() (bool, error) {
+ return _DurationVaultStrategy.Contract.AllocationsActive(&_DurationVaultStrategy.CallOpts)
+}
+
+// Arbitrator is a free data retrieval call binding the contract method 0x6cc6cde1.
+//
+// Solidity: function arbitrator() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) Arbitrator(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "arbitrator")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// Arbitrator is a free data retrieval call binding the contract method 0x6cc6cde1.
+//
+// Solidity: function arbitrator() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategySession) Arbitrator() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.Arbitrator(&_DurationVaultStrategy.CallOpts)
+}
+
+// Arbitrator is a free data retrieval call binding the contract method 0x6cc6cde1.
+//
+// Solidity: function arbitrator() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) Arbitrator() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.Arbitrator(&_DurationVaultStrategy.CallOpts)
+}
+
+// BeforeAddShares is a free data retrieval call binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address staker, uint256 shares) view returns()
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) BeforeAddShares(opts *bind.CallOpts, staker common.Address, shares *big.Int) error {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "beforeAddShares", staker, shares)
+
+ if err != nil {
+ return err
+ }
+
+ return err
+
+}
+
+// BeforeAddShares is a free data retrieval call binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address staker, uint256 shares) view returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) BeforeAddShares(staker common.Address, shares *big.Int) error {
+ return _DurationVaultStrategy.Contract.BeforeAddShares(&_DurationVaultStrategy.CallOpts, staker, shares)
+}
+
+// BeforeAddShares is a free data retrieval call binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address staker, uint256 shares) view returns()
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) BeforeAddShares(staker common.Address, shares *big.Int) error {
+ return _DurationVaultStrategy.Contract.BeforeAddShares(&_DurationVaultStrategy.CallOpts, staker, shares)
+}
+
+// BeforeRemoveShares is a free data retrieval call binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address , uint256 ) view returns()
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) BeforeRemoveShares(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) error {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "beforeRemoveShares", arg0, arg1)
+
+ if err != nil {
+ return err
+ }
+
+ return err
+
+}
+
+// BeforeRemoveShares is a free data retrieval call binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address , uint256 ) view returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) BeforeRemoveShares(arg0 common.Address, arg1 *big.Int) error {
+ return _DurationVaultStrategy.Contract.BeforeRemoveShares(&_DurationVaultStrategy.CallOpts, arg0, arg1)
+}
+
+// BeforeRemoveShares is a free data retrieval call binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address , uint256 ) view returns()
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) BeforeRemoveShares(arg0 common.Address, arg1 *big.Int) error {
+ return _DurationVaultStrategy.Contract.BeforeRemoveShares(&_DurationVaultStrategy.CallOpts, arg0, arg1)
+}
+
+// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b.
+//
+// Solidity: function delegationManager() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) DelegationManager(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "delegationManager")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b.
+//
+// Solidity: function delegationManager() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategySession) DelegationManager() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.DelegationManager(&_DurationVaultStrategy.CallOpts)
+}
+
+// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b.
+//
+// Solidity: function delegationManager() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) DelegationManager() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.DelegationManager(&_DurationVaultStrategy.CallOpts)
+}
+
+// DepositsOpen is a free data retrieval call binding the contract method 0x549c4627.
+//
+// Solidity: function depositsOpen() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) DepositsOpen(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "depositsOpen")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// DepositsOpen is a free data retrieval call binding the contract method 0x549c4627.
+//
+// Solidity: function depositsOpen() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategySession) DepositsOpen() (bool, error) {
+ return _DurationVaultStrategy.Contract.DepositsOpen(&_DurationVaultStrategy.CallOpts)
+}
+
+// DepositsOpen is a free data retrieval call binding the contract method 0x549c4627.
+//
+// Solidity: function depositsOpen() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) DepositsOpen() (bool, error) {
+ return _DurationVaultStrategy.Contract.DepositsOpen(&_DurationVaultStrategy.CallOpts)
+}
+
+// Duration is a free data retrieval call binding the contract method 0x0fb5a6b4.
+//
+// Solidity: function duration() view returns(uint32)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) Duration(opts *bind.CallOpts) (uint32, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "duration")
+
+ if err != nil {
+ return *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+ return out0, err
+
+}
+
+// Duration is a free data retrieval call binding the contract method 0x0fb5a6b4.
+//
+// Solidity: function duration() view returns(uint32)
+func (_DurationVaultStrategy *DurationVaultStrategySession) Duration() (uint32, error) {
+ return _DurationVaultStrategy.Contract.Duration(&_DurationVaultStrategy.CallOpts)
+}
+
+// Duration is a free data retrieval call binding the contract method 0x0fb5a6b4.
+//
+// Solidity: function duration() view returns(uint32)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) Duration() (uint32, error) {
+ return _DurationVaultStrategy.Contract.Duration(&_DurationVaultStrategy.CallOpts)
+}
+
+// Explanation is a free data retrieval call binding the contract method 0xab5921e1.
+//
+// Solidity: function explanation() pure returns(string)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) Explanation(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "explanation")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Explanation is a free data retrieval call binding the contract method 0xab5921e1.
+//
+// Solidity: function explanation() pure returns(string)
+func (_DurationVaultStrategy *DurationVaultStrategySession) Explanation() (string, error) {
+ return _DurationVaultStrategy.Contract.Explanation(&_DurationVaultStrategy.CallOpts)
+}
+
+// Explanation is a free data retrieval call binding the contract method 0xab5921e1.
+//
+// Solidity: function explanation() pure returns(string)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) Explanation() (string, error) {
+ return _DurationVaultStrategy.Contract.Explanation(&_DurationVaultStrategy.CallOpts)
+}
+
+// GetTVLLimits is a free data retrieval call binding the contract method 0xdf6fadc1.
+//
+// Solidity: function getTVLLimits() view returns(uint256, uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) GetTVLLimits(opts *bind.CallOpts) (*big.Int, *big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "getTVLLimits")
+
+ if err != nil {
+ return *new(*big.Int), *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+ out1 := *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
+
+ return out0, out1, err
+
+}
+
+// GetTVLLimits is a free data retrieval call binding the contract method 0xdf6fadc1.
+//
+// Solidity: function getTVLLimits() view returns(uint256, uint256)
+func (_DurationVaultStrategy *DurationVaultStrategySession) GetTVLLimits() (*big.Int, *big.Int, error) {
+ return _DurationVaultStrategy.Contract.GetTVLLimits(&_DurationVaultStrategy.CallOpts)
+}
+
+// GetTVLLimits is a free data retrieval call binding the contract method 0xdf6fadc1.
+//
+// Solidity: function getTVLLimits() view returns(uint256, uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) GetTVLLimits() (*big.Int, *big.Int, error) {
+ return _DurationVaultStrategy.Contract.GetTVLLimits(&_DurationVaultStrategy.CallOpts)
+}
+
+// IsLocked is a free data retrieval call binding the contract method 0xa4e2d634.
+//
+// Solidity: function isLocked() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) IsLocked(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "isLocked")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsLocked is a free data retrieval call binding the contract method 0xa4e2d634.
+//
+// Solidity: function isLocked() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategySession) IsLocked() (bool, error) {
+ return _DurationVaultStrategy.Contract.IsLocked(&_DurationVaultStrategy.CallOpts)
+}
+
+// IsLocked is a free data retrieval call binding the contract method 0xa4e2d634.
+//
+// Solidity: function isLocked() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) IsLocked() (bool, error) {
+ return _DurationVaultStrategy.Contract.IsLocked(&_DurationVaultStrategy.CallOpts)
+}
+
+// IsMatured is a free data retrieval call binding the contract method 0x7f2b6a0d.
+//
+// Solidity: function isMatured() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) IsMatured(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "isMatured")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsMatured is a free data retrieval call binding the contract method 0x7f2b6a0d.
+//
+// Solidity: function isMatured() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategySession) IsMatured() (bool, error) {
+ return _DurationVaultStrategy.Contract.IsMatured(&_DurationVaultStrategy.CallOpts)
+}
+
+// IsMatured is a free data retrieval call binding the contract method 0x7f2b6a0d.
+//
+// Solidity: function isMatured() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) IsMatured() (bool, error) {
+ return _DurationVaultStrategy.Contract.IsMatured(&_DurationVaultStrategy.CallOpts)
+}
+
+// LockedAt is a free data retrieval call binding the contract method 0xb2163482.
+//
+// Solidity: function lockedAt() view returns(uint32)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) LockedAt(opts *bind.CallOpts) (uint32, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "lockedAt")
+
+ if err != nil {
+ return *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+ return out0, err
+
+}
+
+// LockedAt is a free data retrieval call binding the contract method 0xb2163482.
+//
+// Solidity: function lockedAt() view returns(uint32)
+func (_DurationVaultStrategy *DurationVaultStrategySession) LockedAt() (uint32, error) {
+ return _DurationVaultStrategy.Contract.LockedAt(&_DurationVaultStrategy.CallOpts)
+}
+
+// LockedAt is a free data retrieval call binding the contract method 0xb2163482.
+//
+// Solidity: function lockedAt() view returns(uint32)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) LockedAt() (uint32, error) {
+ return _DurationVaultStrategy.Contract.LockedAt(&_DurationVaultStrategy.CallOpts)
+}
+
+// MaturedAt is a free data retrieval call binding the contract method 0x1f1cc9a3.
+//
+// Solidity: function maturedAt() view returns(uint32)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) MaturedAt(opts *bind.CallOpts) (uint32, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "maturedAt")
+
+ if err != nil {
+ return *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+ return out0, err
+
+}
+
+// MaturedAt is a free data retrieval call binding the contract method 0x1f1cc9a3.
+//
+// Solidity: function maturedAt() view returns(uint32)
+func (_DurationVaultStrategy *DurationVaultStrategySession) MaturedAt() (uint32, error) {
+ return _DurationVaultStrategy.Contract.MaturedAt(&_DurationVaultStrategy.CallOpts)
+}
+
+// MaturedAt is a free data retrieval call binding the contract method 0x1f1cc9a3.
+//
+// Solidity: function maturedAt() view returns(uint32)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) MaturedAt() (uint32, error) {
+ return _DurationVaultStrategy.Contract.MaturedAt(&_DurationVaultStrategy.CallOpts)
+}
+
+// MaxPerDeposit is a free data retrieval call binding the contract method 0x43fe08b0.
+//
+// Solidity: function maxPerDeposit() view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) MaxPerDeposit(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "maxPerDeposit")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// MaxPerDeposit is a free data retrieval call binding the contract method 0x43fe08b0.
+//
+// Solidity: function maxPerDeposit() view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategySession) MaxPerDeposit() (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.MaxPerDeposit(&_DurationVaultStrategy.CallOpts)
+}
+
+// MaxPerDeposit is a free data retrieval call binding the contract method 0x43fe08b0.
+//
+// Solidity: function maxPerDeposit() view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) MaxPerDeposit() (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.MaxPerDeposit(&_DurationVaultStrategy.CallOpts)
+}
+
+// MaxTotalDeposits is a free data retrieval call binding the contract method 0x61b01b5d.
+//
+// Solidity: function maxTotalDeposits() view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) MaxTotalDeposits(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "maxTotalDeposits")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// MaxTotalDeposits is a free data retrieval call binding the contract method 0x61b01b5d.
+//
+// Solidity: function maxTotalDeposits() view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategySession) MaxTotalDeposits() (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.MaxTotalDeposits(&_DurationVaultStrategy.CallOpts)
+}
+
+// MaxTotalDeposits is a free data retrieval call binding the contract method 0x61b01b5d.
+//
+// Solidity: function maxTotalDeposits() view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) MaxTotalDeposits() (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.MaxTotalDeposits(&_DurationVaultStrategy.CallOpts)
+}
+
+// MetadataURI is a free data retrieval call binding the contract method 0x03ee438c.
+//
+// Solidity: function metadataURI() view returns(string)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) MetadataURI(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "metadataURI")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// MetadataURI is a free data retrieval call binding the contract method 0x03ee438c.
+//
+// Solidity: function metadataURI() view returns(string)
+func (_DurationVaultStrategy *DurationVaultStrategySession) MetadataURI() (string, error) {
+ return _DurationVaultStrategy.Contract.MetadataURI(&_DurationVaultStrategy.CallOpts)
+}
+
+// MetadataURI is a free data retrieval call binding the contract method 0x03ee438c.
+//
+// Solidity: function metadataURI() view returns(string)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) MetadataURI() (string, error) {
+ return _DurationVaultStrategy.Contract.MetadataURI(&_DurationVaultStrategy.CallOpts)
+}
+
+// OperatorIntegrationConfigured is a free data retrieval call binding the contract method 0x5438a8c7.
+//
+// Solidity: function operatorIntegrationConfigured() pure returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) OperatorIntegrationConfigured(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "operatorIntegrationConfigured")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// OperatorIntegrationConfigured is a free data retrieval call binding the contract method 0x5438a8c7.
+//
+// Solidity: function operatorIntegrationConfigured() pure returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategySession) OperatorIntegrationConfigured() (bool, error) {
+ return _DurationVaultStrategy.Contract.OperatorIntegrationConfigured(&_DurationVaultStrategy.CallOpts)
+}
+
+// OperatorIntegrationConfigured is a free data retrieval call binding the contract method 0x5438a8c7.
+//
+// Solidity: function operatorIntegrationConfigured() pure returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) OperatorIntegrationConfigured() (bool, error) {
+ return _DurationVaultStrategy.Contract.OperatorIntegrationConfigured(&_DurationVaultStrategy.CallOpts)
+}
+
+// OperatorSetInfo is a free data retrieval call binding the contract method 0xd4deae81.
+//
+// Solidity: function operatorSetInfo() view returns(address avs, uint32 operatorSetId)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) OperatorSetInfo(opts *bind.CallOpts) (struct {
+ Avs common.Address
+ OperatorSetId uint32
+}, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "operatorSetInfo")
+
+ outstruct := new(struct {
+ Avs common.Address
+ OperatorSetId uint32
+ })
+ if err != nil {
+ return *outstruct, err
+ }
+
+ outstruct.Avs = *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+ outstruct.OperatorSetId = *abi.ConvertType(out[1], new(uint32)).(*uint32)
+
+ return *outstruct, err
+
+}
+
+// OperatorSetInfo is a free data retrieval call binding the contract method 0xd4deae81.
+//
+// Solidity: function operatorSetInfo() view returns(address avs, uint32 operatorSetId)
+func (_DurationVaultStrategy *DurationVaultStrategySession) OperatorSetInfo() (struct {
+ Avs common.Address
+ OperatorSetId uint32
+}, error) {
+ return _DurationVaultStrategy.Contract.OperatorSetInfo(&_DurationVaultStrategy.CallOpts)
+}
+
+// OperatorSetInfo is a free data retrieval call binding the contract method 0xd4deae81.
+//
+// Solidity: function operatorSetInfo() view returns(address avs, uint32 operatorSetId)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) OperatorSetInfo() (struct {
+ Avs common.Address
+ OperatorSetId uint32
+}, error) {
+ return _DurationVaultStrategy.Contract.OperatorSetInfo(&_DurationVaultStrategy.CallOpts)
+}
+
+// OperatorSetRegistered is a free data retrieval call binding the contract method 0x59d915ff.
+//
+// Solidity: function operatorSetRegistered() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) OperatorSetRegistered(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "operatorSetRegistered")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// OperatorSetRegistered is a free data retrieval call binding the contract method 0x59d915ff.
+//
+// Solidity: function operatorSetRegistered() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategySession) OperatorSetRegistered() (bool, error) {
+ return _DurationVaultStrategy.Contract.OperatorSetRegistered(&_DurationVaultStrategy.CallOpts)
+}
+
+// OperatorSetRegistered is a free data retrieval call binding the contract method 0x59d915ff.
+//
+// Solidity: function operatorSetRegistered() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) OperatorSetRegistered() (bool, error) {
+ return _DurationVaultStrategy.Contract.OperatorSetRegistered(&_DurationVaultStrategy.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
+//
+// Solidity: function paused(uint8 index) view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "paused", index)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
+//
+// Solidity: function paused(uint8 index) view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategySession) Paused(index uint8) (bool, error) {
+ return _DurationVaultStrategy.Contract.Paused(&_DurationVaultStrategy.CallOpts, index)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
+//
+// Solidity: function paused(uint8 index) view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) Paused(index uint8) (bool, error) {
+ return _DurationVaultStrategy.Contract.Paused(&_DurationVaultStrategy.CallOpts, index)
+}
+
+// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) Paused0(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "paused0")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategySession) Paused0() (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.Paused0(&_DurationVaultStrategy.CallOpts)
+}
+
+// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) Paused0() (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.Paused0(&_DurationVaultStrategy.CallOpts)
+}
+
+// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
+//
+// Solidity: function pauserRegistry() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "pauserRegistry")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
+//
+// Solidity: function pauserRegistry() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategySession) PauserRegistry() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.PauserRegistry(&_DurationVaultStrategy.CallOpts)
+}
+
+// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
+//
+// Solidity: function pauserRegistry() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) PauserRegistry() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.PauserRegistry(&_DurationVaultStrategy.CallOpts)
+}
+
+// RewardsCoordinator is a free data retrieval call binding the contract method 0x8a2fc4e3.
+//
+// Solidity: function rewardsCoordinator() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) RewardsCoordinator(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "rewardsCoordinator")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// RewardsCoordinator is a free data retrieval call binding the contract method 0x8a2fc4e3.
+//
+// Solidity: function rewardsCoordinator() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategySession) RewardsCoordinator() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.RewardsCoordinator(&_DurationVaultStrategy.CallOpts)
+}
+
+// RewardsCoordinator is a free data retrieval call binding the contract method 0x8a2fc4e3.
+//
+// Solidity: function rewardsCoordinator() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) RewardsCoordinator() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.RewardsCoordinator(&_DurationVaultStrategy.CallOpts)
+}
+
+// Shares is a free data retrieval call binding the contract method 0xce7c2ac2.
+//
+// Solidity: function shares(address user) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) Shares(opts *bind.CallOpts, user common.Address) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "shares", user)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// Shares is a free data retrieval call binding the contract method 0xce7c2ac2.
+//
+// Solidity: function shares(address user) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategySession) Shares(user common.Address) (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.Shares(&_DurationVaultStrategy.CallOpts, user)
+}
+
+// Shares is a free data retrieval call binding the contract method 0xce7c2ac2.
+//
+// Solidity: function shares(address user) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) Shares(user common.Address) (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.Shares(&_DurationVaultStrategy.CallOpts, user)
+}
+
+// SharesToUnderlying is a free data retrieval call binding the contract method 0xf3e73875.
+//
+// Solidity: function sharesToUnderlying(uint256 amountShares) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) SharesToUnderlying(opts *bind.CallOpts, amountShares *big.Int) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "sharesToUnderlying", amountShares)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// SharesToUnderlying is a free data retrieval call binding the contract method 0xf3e73875.
+//
+// Solidity: function sharesToUnderlying(uint256 amountShares) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategySession) SharesToUnderlying(amountShares *big.Int) (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.SharesToUnderlying(&_DurationVaultStrategy.CallOpts, amountShares)
+}
+
+// SharesToUnderlying is a free data retrieval call binding the contract method 0xf3e73875.
+//
+// Solidity: function sharesToUnderlying(uint256 amountShares) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) SharesToUnderlying(amountShares *big.Int) (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.SharesToUnderlying(&_DurationVaultStrategy.CallOpts, amountShares)
+}
+
+// SharesToUnderlyingView is a free data retrieval call binding the contract method 0x7a8b2637.
+//
+// Solidity: function sharesToUnderlyingView(uint256 amountShares) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) SharesToUnderlyingView(opts *bind.CallOpts, amountShares *big.Int) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "sharesToUnderlyingView", amountShares)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// SharesToUnderlyingView is a free data retrieval call binding the contract method 0x7a8b2637.
+//
+// Solidity: function sharesToUnderlyingView(uint256 amountShares) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategySession) SharesToUnderlyingView(amountShares *big.Int) (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.SharesToUnderlyingView(&_DurationVaultStrategy.CallOpts, amountShares)
+}
+
+// SharesToUnderlyingView is a free data retrieval call binding the contract method 0x7a8b2637.
+//
+// Solidity: function sharesToUnderlyingView(uint256 amountShares) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) SharesToUnderlyingView(amountShares *big.Int) (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.SharesToUnderlyingView(&_DurationVaultStrategy.CallOpts, amountShares)
+}
+
+// StakeCap is a free data retrieval call binding the contract method 0xba28fd2e.
+//
+// Solidity: function stakeCap() view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) StakeCap(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "stakeCap")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// StakeCap is a free data retrieval call binding the contract method 0xba28fd2e.
+//
+// Solidity: function stakeCap() view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategySession) StakeCap() (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.StakeCap(&_DurationVaultStrategy.CallOpts)
+}
+
+// StakeCap is a free data retrieval call binding the contract method 0xba28fd2e.
+//
+// Solidity: function stakeCap() view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) StakeCap() (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.StakeCap(&_DurationVaultStrategy.CallOpts)
+}
+
+// State is a free data retrieval call binding the contract method 0xc19d93fb.
+//
+// Solidity: function state() view returns(uint8)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) State(opts *bind.CallOpts) (uint8, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "state")
+
+ if err != nil {
+ return *new(uint8), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
+
+ return out0, err
+
+}
+
+// State is a free data retrieval call binding the contract method 0xc19d93fb.
+//
+// Solidity: function state() view returns(uint8)
+func (_DurationVaultStrategy *DurationVaultStrategySession) State() (uint8, error) {
+ return _DurationVaultStrategy.Contract.State(&_DurationVaultStrategy.CallOpts)
+}
+
+// State is a free data retrieval call binding the contract method 0xc19d93fb.
+//
+// Solidity: function state() view returns(uint8)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) State() (uint8, error) {
+ return _DurationVaultStrategy.Contract.State(&_DurationVaultStrategy.CallOpts)
+}
+
+// StrategyFactory is a free data retrieval call binding the contract method 0x9ef35710.
+//
+// Solidity: function strategyFactory() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) StrategyFactory(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "strategyFactory")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// StrategyFactory is a free data retrieval call binding the contract method 0x9ef35710.
+//
+// Solidity: function strategyFactory() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategySession) StrategyFactory() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.StrategyFactory(&_DurationVaultStrategy.CallOpts)
+}
+
+// StrategyFactory is a free data retrieval call binding the contract method 0x9ef35710.
+//
+// Solidity: function strategyFactory() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) StrategyFactory() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.StrategyFactory(&_DurationVaultStrategy.CallOpts)
+}
+
+// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38.
+//
+// Solidity: function strategyManager() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) StrategyManager(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "strategyManager")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38.
+//
+// Solidity: function strategyManager() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategySession) StrategyManager() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.StrategyManager(&_DurationVaultStrategy.CallOpts)
+}
+
+// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38.
+//
+// Solidity: function strategyManager() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) StrategyManager() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.StrategyManager(&_DurationVaultStrategy.CallOpts)
+}
+
+// TotalShares is a free data retrieval call binding the contract method 0x3a98ef39.
+//
+// Solidity: function totalShares() view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) TotalShares(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "totalShares")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// TotalShares is a free data retrieval call binding the contract method 0x3a98ef39.
+//
+// Solidity: function totalShares() view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategySession) TotalShares() (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.TotalShares(&_DurationVaultStrategy.CallOpts)
+}
+
+// TotalShares is a free data retrieval call binding the contract method 0x3a98ef39.
+//
+// Solidity: function totalShares() view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) TotalShares() (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.TotalShares(&_DurationVaultStrategy.CallOpts)
+}
+
+// UnderlyingToShares is a free data retrieval call binding the contract method 0x8c871019.
+//
+// Solidity: function underlyingToShares(uint256 amountUnderlying) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) UnderlyingToShares(opts *bind.CallOpts, amountUnderlying *big.Int) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "underlyingToShares", amountUnderlying)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// UnderlyingToShares is a free data retrieval call binding the contract method 0x8c871019.
+//
+// Solidity: function underlyingToShares(uint256 amountUnderlying) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategySession) UnderlyingToShares(amountUnderlying *big.Int) (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.UnderlyingToShares(&_DurationVaultStrategy.CallOpts, amountUnderlying)
+}
+
+// UnderlyingToShares is a free data retrieval call binding the contract method 0x8c871019.
+//
+// Solidity: function underlyingToShares(uint256 amountUnderlying) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) UnderlyingToShares(amountUnderlying *big.Int) (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.UnderlyingToShares(&_DurationVaultStrategy.CallOpts, amountUnderlying)
+}
+
+// UnderlyingToSharesView is a free data retrieval call binding the contract method 0xe3dae51c.
+//
+// Solidity: function underlyingToSharesView(uint256 amountUnderlying) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) UnderlyingToSharesView(opts *bind.CallOpts, amountUnderlying *big.Int) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "underlyingToSharesView", amountUnderlying)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// UnderlyingToSharesView is a free data retrieval call binding the contract method 0xe3dae51c.
+//
+// Solidity: function underlyingToSharesView(uint256 amountUnderlying) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategySession) UnderlyingToSharesView(amountUnderlying *big.Int) (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.UnderlyingToSharesView(&_DurationVaultStrategy.CallOpts, amountUnderlying)
+}
+
+// UnderlyingToSharesView is a free data retrieval call binding the contract method 0xe3dae51c.
+//
+// Solidity: function underlyingToSharesView(uint256 amountUnderlying) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) UnderlyingToSharesView(amountUnderlying *big.Int) (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.UnderlyingToSharesView(&_DurationVaultStrategy.CallOpts, amountUnderlying)
+}
+
+// UnderlyingToken is a free data retrieval call binding the contract method 0x2495a599.
+//
+// Solidity: function underlyingToken() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) UnderlyingToken(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "underlyingToken")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// UnderlyingToken is a free data retrieval call binding the contract method 0x2495a599.
+//
+// Solidity: function underlyingToken() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategySession) UnderlyingToken() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.UnderlyingToken(&_DurationVaultStrategy.CallOpts)
+}
+
+// UnderlyingToken is a free data retrieval call binding the contract method 0x2495a599.
+//
+// Solidity: function underlyingToken() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) UnderlyingToken() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.UnderlyingToken(&_DurationVaultStrategy.CallOpts)
+}
+
+// UnlockAt is a free data retrieval call binding the contract method 0xaa5dec6f.
+//
+// Solidity: function unlockAt() view returns(uint32)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) UnlockAt(opts *bind.CallOpts) (uint32, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "unlockAt")
+
+ if err != nil {
+ return *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+ return out0, err
+
+}
+
+// UnlockAt is a free data retrieval call binding the contract method 0xaa5dec6f.
+//
+// Solidity: function unlockAt() view returns(uint32)
+func (_DurationVaultStrategy *DurationVaultStrategySession) UnlockAt() (uint32, error) {
+ return _DurationVaultStrategy.Contract.UnlockAt(&_DurationVaultStrategy.CallOpts)
+}
+
+// UnlockAt is a free data retrieval call binding the contract method 0xaa5dec6f.
+//
+// Solidity: function unlockAt() view returns(uint32)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) UnlockAt() (uint32, error) {
+ return _DurationVaultStrategy.Contract.UnlockAt(&_DurationVaultStrategy.CallOpts)
+}
+
+// UnlockTimestamp is a free data retrieval call binding the contract method 0xaa082a9d.
+//
+// Solidity: function unlockTimestamp() view returns(uint32)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) UnlockTimestamp(opts *bind.CallOpts) (uint32, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "unlockTimestamp")
+
+ if err != nil {
+ return *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+ return out0, err
+
+}
+
+// UnlockTimestamp is a free data retrieval call binding the contract method 0xaa082a9d.
+//
+// Solidity: function unlockTimestamp() view returns(uint32)
+func (_DurationVaultStrategy *DurationVaultStrategySession) UnlockTimestamp() (uint32, error) {
+ return _DurationVaultStrategy.Contract.UnlockTimestamp(&_DurationVaultStrategy.CallOpts)
+}
+
+// UnlockTimestamp is a free data retrieval call binding the contract method 0xaa082a9d.
+//
+// Solidity: function unlockTimestamp() view returns(uint32)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) UnlockTimestamp() (uint32, error) {
+ return _DurationVaultStrategy.Contract.UnlockTimestamp(&_DurationVaultStrategy.CallOpts)
+}
+
+// UserUnderlyingView is a free data retrieval call binding the contract method 0x553ca5f8.
+//
+// Solidity: function userUnderlyingView(address user) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) UserUnderlyingView(opts *bind.CallOpts, user common.Address) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "userUnderlyingView", user)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// UserUnderlyingView is a free data retrieval call binding the contract method 0x553ca5f8.
+//
+// Solidity: function userUnderlyingView(address user) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategySession) UserUnderlyingView(user common.Address) (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.UserUnderlyingView(&_DurationVaultStrategy.CallOpts, user)
+}
+
+// UserUnderlyingView is a free data retrieval call binding the contract method 0x553ca5f8.
+//
+// Solidity: function userUnderlyingView(address user) view returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) UserUnderlyingView(user common.Address) (*big.Int, error) {
+ return _DurationVaultStrategy.Contract.UserUnderlyingView(&_DurationVaultStrategy.CallOpts, user)
+}
+
+// VaultAdmin is a free data retrieval call binding the contract method 0xe7f6f225.
+//
+// Solidity: function vaultAdmin() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) VaultAdmin(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "vaultAdmin")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// VaultAdmin is a free data retrieval call binding the contract method 0xe7f6f225.
+//
+// Solidity: function vaultAdmin() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategySession) VaultAdmin() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.VaultAdmin(&_DurationVaultStrategy.CallOpts)
+}
+
+// VaultAdmin is a free data retrieval call binding the contract method 0xe7f6f225.
+//
+// Solidity: function vaultAdmin() view returns(address)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) VaultAdmin() (common.Address, error) {
+ return _DurationVaultStrategy.Contract.VaultAdmin(&_DurationVaultStrategy.CallOpts)
+}
+
+// WithdrawalsOpen is a free data retrieval call binding the contract method 0x94aad677.
+//
+// Solidity: function withdrawalsOpen() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCaller) WithdrawalsOpen(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _DurationVaultStrategy.contract.Call(opts, &out, "withdrawalsOpen")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// WithdrawalsOpen is a free data retrieval call binding the contract method 0x94aad677.
+//
+// Solidity: function withdrawalsOpen() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategySession) WithdrawalsOpen() (bool, error) {
+ return _DurationVaultStrategy.Contract.WithdrawalsOpen(&_DurationVaultStrategy.CallOpts)
+}
+
+// WithdrawalsOpen is a free data retrieval call binding the contract method 0x94aad677.
+//
+// Solidity: function withdrawalsOpen() view returns(bool)
+func (_DurationVaultStrategy *DurationVaultStrategyCallerSession) WithdrawalsOpen() (bool, error) {
+ return _DurationVaultStrategy.Contract.WithdrawalsOpen(&_DurationVaultStrategy.CallOpts)
+}
+
+// AdvanceToWithdrawals is a paid mutator transaction binding the contract method 0x6325f655.
+//
+// Solidity: function advanceToWithdrawals() returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) AdvanceToWithdrawals(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "advanceToWithdrawals")
+}
+
+// AdvanceToWithdrawals is a paid mutator transaction binding the contract method 0x6325f655.
+//
+// Solidity: function advanceToWithdrawals() returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) AdvanceToWithdrawals() (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.AdvanceToWithdrawals(&_DurationVaultStrategy.TransactOpts)
+}
+
+// AdvanceToWithdrawals is a paid mutator transaction binding the contract method 0x6325f655.
+//
+// Solidity: function advanceToWithdrawals() returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) AdvanceToWithdrawals() (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.AdvanceToWithdrawals(&_DurationVaultStrategy.TransactOpts)
+}
+
+// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
+//
+// Solidity: function deposit(address token, uint256 amount) returns(uint256 newShares)
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) Deposit(opts *bind.TransactOpts, token common.Address, amount *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "deposit", token, amount)
+}
+
+// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
+//
+// Solidity: function deposit(address token, uint256 amount) returns(uint256 newShares)
+func (_DurationVaultStrategy *DurationVaultStrategySession) Deposit(token common.Address, amount *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.Deposit(&_DurationVaultStrategy.TransactOpts, token, amount)
+}
+
+// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
+//
+// Solidity: function deposit(address token, uint256 amount) returns(uint256 newShares)
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) Deposit(token common.Address, amount *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.Deposit(&_DurationVaultStrategy.TransactOpts, token, amount)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc2cca26d.
+//
+// Solidity: function initialize((address,address,address,uint32,uint256,uint256,string,(address,uint32),bytes,address,string) config) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) Initialize(opts *bind.TransactOpts, config IDurationVaultStrategyTypesVaultConfig) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "initialize", config)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc2cca26d.
+//
+// Solidity: function initialize((address,address,address,uint32,uint256,uint256,string,(address,uint32),bytes,address,string) config) returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) Initialize(config IDurationVaultStrategyTypesVaultConfig) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.Initialize(&_DurationVaultStrategy.TransactOpts, config)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc2cca26d.
+//
+// Solidity: function initialize((address,address,address,uint32,uint256,uint256,string,(address,uint32),bytes,address,string) config) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) Initialize(config IDurationVaultStrategyTypesVaultConfig) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.Initialize(&_DurationVaultStrategy.TransactOpts, config)
+}
+
+// Initialize0 is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _underlyingToken) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) Initialize0(opts *bind.TransactOpts, _underlyingToken common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "initialize0", _underlyingToken)
+}
+
+// Initialize0 is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _underlyingToken) returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) Initialize0(_underlyingToken common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.Initialize0(&_DurationVaultStrategy.TransactOpts, _underlyingToken)
+}
+
+// Initialize0 is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _underlyingToken) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) Initialize0(_underlyingToken common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.Initialize0(&_DurationVaultStrategy.TransactOpts, _underlyingToken)
+}
+
+// Lock is a paid mutator transaction binding the contract method 0xf83d08ba.
+//
+// Solidity: function lock() returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) Lock(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "lock")
+}
+
+// Lock is a paid mutator transaction binding the contract method 0xf83d08ba.
+//
+// Solidity: function lock() returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) Lock() (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.Lock(&_DurationVaultStrategy.TransactOpts)
+}
+
+// Lock is a paid mutator transaction binding the contract method 0xf83d08ba.
+//
+// Solidity: function lock() returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) Lock() (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.Lock(&_DurationVaultStrategy.TransactOpts)
+}
+
+// MarkMatured is a paid mutator transaction binding the contract method 0x6d8690a9.
+//
+// Solidity: function markMatured() returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) MarkMatured(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "markMatured")
+}
+
+// MarkMatured is a paid mutator transaction binding the contract method 0x6d8690a9.
+//
+// Solidity: function markMatured() returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) MarkMatured() (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.MarkMatured(&_DurationVaultStrategy.TransactOpts)
+}
+
+// MarkMatured is a paid mutator transaction binding the contract method 0x6d8690a9.
+//
+// Solidity: function markMatured() returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) MarkMatured() (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.MarkMatured(&_DurationVaultStrategy.TransactOpts)
+}
+
+// Pause is a paid mutator transaction binding the contract method 0x136439dd.
+//
+// Solidity: function pause(uint256 newPausedStatus) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "pause", newPausedStatus)
+}
+
+// Pause is a paid mutator transaction binding the contract method 0x136439dd.
+//
+// Solidity: function pause(uint256 newPausedStatus) returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.Pause(&_DurationVaultStrategy.TransactOpts, newPausedStatus)
+}
+
+// Pause is a paid mutator transaction binding the contract method 0x136439dd.
+//
+// Solidity: function pause(uint256 newPausedStatus) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.Pause(&_DurationVaultStrategy.TransactOpts, newPausedStatus)
+}
+
+// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
+//
+// Solidity: function pauseAll() returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "pauseAll")
+}
+
+// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
+//
+// Solidity: function pauseAll() returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) PauseAll() (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.PauseAll(&_DurationVaultStrategy.TransactOpts)
+}
+
+// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
+//
+// Solidity: function pauseAll() returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) PauseAll() (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.PauseAll(&_DurationVaultStrategy.TransactOpts)
+}
+
+// SetRewardsClaimer is a paid mutator transaction binding the contract method 0xb501d660.
+//
+// Solidity: function setRewardsClaimer(address claimer) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) SetRewardsClaimer(opts *bind.TransactOpts, claimer common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "setRewardsClaimer", claimer)
+}
+
+// SetRewardsClaimer is a paid mutator transaction binding the contract method 0xb501d660.
+//
+// Solidity: function setRewardsClaimer(address claimer) returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) SetRewardsClaimer(claimer common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.SetRewardsClaimer(&_DurationVaultStrategy.TransactOpts, claimer)
+}
+
+// SetRewardsClaimer is a paid mutator transaction binding the contract method 0xb501d660.
+//
+// Solidity: function setRewardsClaimer(address claimer) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) SetRewardsClaimer(claimer common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.SetRewardsClaimer(&_DurationVaultStrategy.TransactOpts, claimer)
+}
+
+// SetTVLLimits is a paid mutator transaction binding the contract method 0x11c70c9d.
+//
+// Solidity: function setTVLLimits(uint256 newMaxPerDeposit, uint256 newMaxTotalDeposits) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) SetTVLLimits(opts *bind.TransactOpts, newMaxPerDeposit *big.Int, newMaxTotalDeposits *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "setTVLLimits", newMaxPerDeposit, newMaxTotalDeposits)
+}
+
+// SetTVLLimits is a paid mutator transaction binding the contract method 0x11c70c9d.
+//
+// Solidity: function setTVLLimits(uint256 newMaxPerDeposit, uint256 newMaxTotalDeposits) returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) SetTVLLimits(newMaxPerDeposit *big.Int, newMaxTotalDeposits *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.SetTVLLimits(&_DurationVaultStrategy.TransactOpts, newMaxPerDeposit, newMaxTotalDeposits)
+}
+
+// SetTVLLimits is a paid mutator transaction binding the contract method 0x11c70c9d.
+//
+// Solidity: function setTVLLimits(uint256 newMaxPerDeposit, uint256 newMaxTotalDeposits) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) SetTVLLimits(newMaxPerDeposit *big.Int, newMaxTotalDeposits *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.SetTVLLimits(&_DurationVaultStrategy.TransactOpts, newMaxPerDeposit, newMaxTotalDeposits)
+}
+
+// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
+//
+// Solidity: function unpause(uint256 newPausedStatus) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "unpause", newPausedStatus)
+}
+
+// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
+//
+// Solidity: function unpause(uint256 newPausedStatus) returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.Unpause(&_DurationVaultStrategy.TransactOpts, newPausedStatus)
+}
+
+// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
+//
+// Solidity: function unpause(uint256 newPausedStatus) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.Unpause(&_DurationVaultStrategy.TransactOpts, newPausedStatus)
+}
+
+// UpdateDelegationApprover is a paid mutator transaction binding the contract method 0xb4e20f13.
+//
+// Solidity: function updateDelegationApprover(address newDelegationApprover) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) UpdateDelegationApprover(opts *bind.TransactOpts, newDelegationApprover common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "updateDelegationApprover", newDelegationApprover)
+}
+
+// UpdateDelegationApprover is a paid mutator transaction binding the contract method 0xb4e20f13.
+//
+// Solidity: function updateDelegationApprover(address newDelegationApprover) returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) UpdateDelegationApprover(newDelegationApprover common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.UpdateDelegationApprover(&_DurationVaultStrategy.TransactOpts, newDelegationApprover)
+}
+
+// UpdateDelegationApprover is a paid mutator transaction binding the contract method 0xb4e20f13.
+//
+// Solidity: function updateDelegationApprover(address newDelegationApprover) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) UpdateDelegationApprover(newDelegationApprover common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.UpdateDelegationApprover(&_DurationVaultStrategy.TransactOpts, newDelegationApprover)
+}
+
+// UpdateMetadataURI is a paid mutator transaction binding the contract method 0x53fd3e81.
+//
+// Solidity: function updateMetadataURI(string newMetadataURI) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) UpdateMetadataURI(opts *bind.TransactOpts, newMetadataURI string) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "updateMetadataURI", newMetadataURI)
+}
+
+// UpdateMetadataURI is a paid mutator transaction binding the contract method 0x53fd3e81.
+//
+// Solidity: function updateMetadataURI(string newMetadataURI) returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) UpdateMetadataURI(newMetadataURI string) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.UpdateMetadataURI(&_DurationVaultStrategy.TransactOpts, newMetadataURI)
+}
+
+// UpdateMetadataURI is a paid mutator transaction binding the contract method 0x53fd3e81.
+//
+// Solidity: function updateMetadataURI(string newMetadataURI) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) UpdateMetadataURI(newMetadataURI string) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.UpdateMetadataURI(&_DurationVaultStrategy.TransactOpts, newMetadataURI)
+}
+
+// UpdateOperatorMetadataURI is a paid mutator transaction binding the contract method 0x99be81c8.
+//
+// Solidity: function updateOperatorMetadataURI(string newOperatorMetadataURI) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) UpdateOperatorMetadataURI(opts *bind.TransactOpts, newOperatorMetadataURI string) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "updateOperatorMetadataURI", newOperatorMetadataURI)
+}
+
+// UpdateOperatorMetadataURI is a paid mutator transaction binding the contract method 0x99be81c8.
+//
+// Solidity: function updateOperatorMetadataURI(string newOperatorMetadataURI) returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) UpdateOperatorMetadataURI(newOperatorMetadataURI string) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.UpdateOperatorMetadataURI(&_DurationVaultStrategy.TransactOpts, newOperatorMetadataURI)
+}
+
+// UpdateOperatorMetadataURI is a paid mutator transaction binding the contract method 0x99be81c8.
+//
+// Solidity: function updateOperatorMetadataURI(string newOperatorMetadataURI) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) UpdateOperatorMetadataURI(newOperatorMetadataURI string) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.UpdateOperatorMetadataURI(&_DurationVaultStrategy.TransactOpts, newOperatorMetadataURI)
+}
+
+// UpdateTVLLimits is a paid mutator transaction binding the contract method 0xaf6eb2be.
+//
+// Solidity: function updateTVLLimits(uint256 newMaxPerDeposit, uint256 newStakeCap) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) UpdateTVLLimits(opts *bind.TransactOpts, newMaxPerDeposit *big.Int, newStakeCap *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "updateTVLLimits", newMaxPerDeposit, newStakeCap)
+}
+
+// UpdateTVLLimits is a paid mutator transaction binding the contract method 0xaf6eb2be.
+//
+// Solidity: function updateTVLLimits(uint256 newMaxPerDeposit, uint256 newStakeCap) returns()
+func (_DurationVaultStrategy *DurationVaultStrategySession) UpdateTVLLimits(newMaxPerDeposit *big.Int, newStakeCap *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.UpdateTVLLimits(&_DurationVaultStrategy.TransactOpts, newMaxPerDeposit, newStakeCap)
+}
+
+// UpdateTVLLimits is a paid mutator transaction binding the contract method 0xaf6eb2be.
+//
+// Solidity: function updateTVLLimits(uint256 newMaxPerDeposit, uint256 newStakeCap) returns()
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) UpdateTVLLimits(newMaxPerDeposit *big.Int, newStakeCap *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.UpdateTVLLimits(&_DurationVaultStrategy.TransactOpts, newMaxPerDeposit, newStakeCap)
+}
+
+// UserUnderlying is a paid mutator transaction binding the contract method 0x8f6a6240.
+//
+// Solidity: function userUnderlying(address user) returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) UserUnderlying(opts *bind.TransactOpts, user common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "userUnderlying", user)
+}
+
+// UserUnderlying is a paid mutator transaction binding the contract method 0x8f6a6240.
+//
+// Solidity: function userUnderlying(address user) returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategySession) UserUnderlying(user common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.UserUnderlying(&_DurationVaultStrategy.TransactOpts, user)
+}
+
+// UserUnderlying is a paid mutator transaction binding the contract method 0x8f6a6240.
+//
+// Solidity: function userUnderlying(address user) returns(uint256)
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) UserUnderlying(user common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.UserUnderlying(&_DurationVaultStrategy.TransactOpts, user)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0xd9caed12.
+//
+// Solidity: function withdraw(address recipient, address token, uint256 amountShares) returns(uint256 amountOut)
+func (_DurationVaultStrategy *DurationVaultStrategyTransactor) Withdraw(opts *bind.TransactOpts, recipient common.Address, token common.Address, amountShares *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.contract.Transact(opts, "withdraw", recipient, token, amountShares)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0xd9caed12.
+//
+// Solidity: function withdraw(address recipient, address token, uint256 amountShares) returns(uint256 amountOut)
+func (_DurationVaultStrategy *DurationVaultStrategySession) Withdraw(recipient common.Address, token common.Address, amountShares *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.Withdraw(&_DurationVaultStrategy.TransactOpts, recipient, token, amountShares)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0xd9caed12.
+//
+// Solidity: function withdraw(address recipient, address token, uint256 amountShares) returns(uint256 amountOut)
+func (_DurationVaultStrategy *DurationVaultStrategyTransactorSession) Withdraw(recipient common.Address, token common.Address, amountShares *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategy.Contract.Withdraw(&_DurationVaultStrategy.TransactOpts, recipient, token, amountShares)
+}
+
+// DurationVaultStrategyDeallocateAttemptedIterator is returned from FilterDeallocateAttempted and is used to iterate over the raw logs and unpacked data for DeallocateAttempted events raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyDeallocateAttemptedIterator struct {
+ Event *DurationVaultStrategyDeallocateAttempted // 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 *DurationVaultStrategyDeallocateAttemptedIterator) 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(DurationVaultStrategyDeallocateAttempted)
+ 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(DurationVaultStrategyDeallocateAttempted)
+ 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 *DurationVaultStrategyDeallocateAttemptedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyDeallocateAttemptedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyDeallocateAttempted represents a DeallocateAttempted event raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyDeallocateAttempted struct {
+ Success bool
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDeallocateAttempted is a free log retrieval operation binding the contract event 0x72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b.
+//
+// Solidity: event DeallocateAttempted(bool success)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) FilterDeallocateAttempted(opts *bind.FilterOpts) (*DurationVaultStrategyDeallocateAttemptedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.FilterLogs(opts, "DeallocateAttempted")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyDeallocateAttemptedIterator{contract: _DurationVaultStrategy.contract, event: "DeallocateAttempted", logs: logs, sub: sub}, nil
+}
+
+// WatchDeallocateAttempted is a free log subscription operation binding the contract event 0x72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b.
+//
+// Solidity: event DeallocateAttempted(bool success)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchDeallocateAttempted(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyDeallocateAttempted) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.WatchLogs(opts, "DeallocateAttempted")
+ 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(DurationVaultStrategyDeallocateAttempted)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "DeallocateAttempted", 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
+}
+
+// ParseDeallocateAttempted is a log parse operation binding the contract event 0x72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b.
+//
+// Solidity: event DeallocateAttempted(bool success)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseDeallocateAttempted(log types.Log) (*DurationVaultStrategyDeallocateAttempted, error) {
+ event := new(DurationVaultStrategyDeallocateAttempted)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "DeallocateAttempted", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyDeregisterAttemptedIterator is returned from FilterDeregisterAttempted and is used to iterate over the raw logs and unpacked data for DeregisterAttempted events raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyDeregisterAttemptedIterator struct {
+ Event *DurationVaultStrategyDeregisterAttempted // 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 *DurationVaultStrategyDeregisterAttemptedIterator) 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(DurationVaultStrategyDeregisterAttempted)
+ 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(DurationVaultStrategyDeregisterAttempted)
+ 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 *DurationVaultStrategyDeregisterAttemptedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyDeregisterAttemptedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyDeregisterAttempted represents a DeregisterAttempted event raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyDeregisterAttempted struct {
+ Success bool
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDeregisterAttempted is a free log retrieval operation binding the contract event 0xd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d168.
+//
+// Solidity: event DeregisterAttempted(bool success)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) FilterDeregisterAttempted(opts *bind.FilterOpts) (*DurationVaultStrategyDeregisterAttemptedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.FilterLogs(opts, "DeregisterAttempted")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyDeregisterAttemptedIterator{contract: _DurationVaultStrategy.contract, event: "DeregisterAttempted", logs: logs, sub: sub}, nil
+}
+
+// WatchDeregisterAttempted is a free log subscription operation binding the contract event 0xd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d168.
+//
+// Solidity: event DeregisterAttempted(bool success)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchDeregisterAttempted(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyDeregisterAttempted) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.WatchLogs(opts, "DeregisterAttempted")
+ 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(DurationVaultStrategyDeregisterAttempted)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "DeregisterAttempted", 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
+}
+
+// ParseDeregisterAttempted is a log parse operation binding the contract event 0xd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d168.
+//
+// Solidity: event DeregisterAttempted(bool success)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseDeregisterAttempted(log types.Log) (*DurationVaultStrategyDeregisterAttempted, error) {
+ event := new(DurationVaultStrategyDeregisterAttempted)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "DeregisterAttempted", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyExchangeRateEmittedIterator is returned from FilterExchangeRateEmitted and is used to iterate over the raw logs and unpacked data for ExchangeRateEmitted events raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyExchangeRateEmittedIterator struct {
+ Event *DurationVaultStrategyExchangeRateEmitted // 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 *DurationVaultStrategyExchangeRateEmittedIterator) 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(DurationVaultStrategyExchangeRateEmitted)
+ 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(DurationVaultStrategyExchangeRateEmitted)
+ 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 *DurationVaultStrategyExchangeRateEmittedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyExchangeRateEmittedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyExchangeRateEmitted represents a ExchangeRateEmitted event raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyExchangeRateEmitted struct {
+ Rate *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterExchangeRateEmitted is a free log retrieval operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
+//
+// Solidity: event ExchangeRateEmitted(uint256 rate)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) FilterExchangeRateEmitted(opts *bind.FilterOpts) (*DurationVaultStrategyExchangeRateEmittedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.FilterLogs(opts, "ExchangeRateEmitted")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyExchangeRateEmittedIterator{contract: _DurationVaultStrategy.contract, event: "ExchangeRateEmitted", logs: logs, sub: sub}, nil
+}
+
+// WatchExchangeRateEmitted is a free log subscription operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
+//
+// Solidity: event ExchangeRateEmitted(uint256 rate)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchExchangeRateEmitted(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyExchangeRateEmitted) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.WatchLogs(opts, "ExchangeRateEmitted")
+ 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(DurationVaultStrategyExchangeRateEmitted)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "ExchangeRateEmitted", 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
+}
+
+// ParseExchangeRateEmitted is a log parse operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
+//
+// Solidity: event ExchangeRateEmitted(uint256 rate)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseExchangeRateEmitted(log types.Log) (*DurationVaultStrategyExchangeRateEmitted, error) {
+ event := new(DurationVaultStrategyExchangeRateEmitted)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "ExchangeRateEmitted", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyInitializedIterator struct {
+ Event *DurationVaultStrategyInitialized // 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 *DurationVaultStrategyInitializedIterator) 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(DurationVaultStrategyInitialized)
+ 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(DurationVaultStrategyInitialized)
+ 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 *DurationVaultStrategyInitializedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyInitializedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyInitialized represents a Initialized event raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyInitialized struct {
+ Version uint8
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) FilterInitialized(opts *bind.FilterOpts) (*DurationVaultStrategyInitializedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.FilterLogs(opts, "Initialized")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyInitializedIterator{contract: _DurationVaultStrategy.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyInitialized) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.WatchLogs(opts, "Initialized")
+ 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(DurationVaultStrategyInitialized)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "Initialized", 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
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseInitialized(log types.Log) (*DurationVaultStrategyInitialized, error) {
+ event := new(DurationVaultStrategyInitialized)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "Initialized", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyMaxPerDepositUpdatedIterator is returned from FilterMaxPerDepositUpdated and is used to iterate over the raw logs and unpacked data for MaxPerDepositUpdated events raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyMaxPerDepositUpdatedIterator struct {
+ Event *DurationVaultStrategyMaxPerDepositUpdated // 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 *DurationVaultStrategyMaxPerDepositUpdatedIterator) 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(DurationVaultStrategyMaxPerDepositUpdated)
+ 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(DurationVaultStrategyMaxPerDepositUpdated)
+ 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 *DurationVaultStrategyMaxPerDepositUpdatedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyMaxPerDepositUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyMaxPerDepositUpdated represents a MaxPerDepositUpdated event raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyMaxPerDepositUpdated struct {
+ PreviousValue *big.Int
+ NewValue *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterMaxPerDepositUpdated is a free log retrieval operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
+//
+// Solidity: event MaxPerDepositUpdated(uint256 previousValue, uint256 newValue)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) FilterMaxPerDepositUpdated(opts *bind.FilterOpts) (*DurationVaultStrategyMaxPerDepositUpdatedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.FilterLogs(opts, "MaxPerDepositUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyMaxPerDepositUpdatedIterator{contract: _DurationVaultStrategy.contract, event: "MaxPerDepositUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchMaxPerDepositUpdated is a free log subscription operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
+//
+// Solidity: event MaxPerDepositUpdated(uint256 previousValue, uint256 newValue)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchMaxPerDepositUpdated(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyMaxPerDepositUpdated) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.WatchLogs(opts, "MaxPerDepositUpdated")
+ 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(DurationVaultStrategyMaxPerDepositUpdated)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "MaxPerDepositUpdated", 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
+}
+
+// ParseMaxPerDepositUpdated is a log parse operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
+//
+// Solidity: event MaxPerDepositUpdated(uint256 previousValue, uint256 newValue)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseMaxPerDepositUpdated(log types.Log) (*DurationVaultStrategyMaxPerDepositUpdated, error) {
+ event := new(DurationVaultStrategyMaxPerDepositUpdated)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "MaxPerDepositUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyMaxTotalDepositsUpdatedIterator is returned from FilterMaxTotalDepositsUpdated and is used to iterate over the raw logs and unpacked data for MaxTotalDepositsUpdated events raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyMaxTotalDepositsUpdatedIterator struct {
+ Event *DurationVaultStrategyMaxTotalDepositsUpdated // 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 *DurationVaultStrategyMaxTotalDepositsUpdatedIterator) 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(DurationVaultStrategyMaxTotalDepositsUpdated)
+ 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(DurationVaultStrategyMaxTotalDepositsUpdated)
+ 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 *DurationVaultStrategyMaxTotalDepositsUpdatedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyMaxTotalDepositsUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyMaxTotalDepositsUpdated represents a MaxTotalDepositsUpdated event raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyMaxTotalDepositsUpdated struct {
+ PreviousValue *big.Int
+ NewValue *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterMaxTotalDepositsUpdated is a free log retrieval operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
+//
+// Solidity: event MaxTotalDepositsUpdated(uint256 previousValue, uint256 newValue)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) FilterMaxTotalDepositsUpdated(opts *bind.FilterOpts) (*DurationVaultStrategyMaxTotalDepositsUpdatedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.FilterLogs(opts, "MaxTotalDepositsUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyMaxTotalDepositsUpdatedIterator{contract: _DurationVaultStrategy.contract, event: "MaxTotalDepositsUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchMaxTotalDepositsUpdated is a free log subscription operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
+//
+// Solidity: event MaxTotalDepositsUpdated(uint256 previousValue, uint256 newValue)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchMaxTotalDepositsUpdated(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyMaxTotalDepositsUpdated) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.WatchLogs(opts, "MaxTotalDepositsUpdated")
+ 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(DurationVaultStrategyMaxTotalDepositsUpdated)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "MaxTotalDepositsUpdated", 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
+}
+
+// ParseMaxTotalDepositsUpdated is a log parse operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
+//
+// Solidity: event MaxTotalDepositsUpdated(uint256 previousValue, uint256 newValue)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseMaxTotalDepositsUpdated(log types.Log) (*DurationVaultStrategyMaxTotalDepositsUpdated, error) {
+ event := new(DurationVaultStrategyMaxTotalDepositsUpdated)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "MaxTotalDepositsUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyMetadataURIUpdatedIterator is returned from FilterMetadataURIUpdated and is used to iterate over the raw logs and unpacked data for MetadataURIUpdated events raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyMetadataURIUpdatedIterator struct {
+ Event *DurationVaultStrategyMetadataURIUpdated // 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 *DurationVaultStrategyMetadataURIUpdatedIterator) 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(DurationVaultStrategyMetadataURIUpdated)
+ 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(DurationVaultStrategyMetadataURIUpdated)
+ 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 *DurationVaultStrategyMetadataURIUpdatedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyMetadataURIUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyMetadataURIUpdated represents a MetadataURIUpdated event raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyMetadataURIUpdated struct {
+ NewMetadataURI string
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterMetadataURIUpdated is a free log retrieval operation binding the contract event 0xefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba39.
+//
+// Solidity: event MetadataURIUpdated(string newMetadataURI)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) FilterMetadataURIUpdated(opts *bind.FilterOpts) (*DurationVaultStrategyMetadataURIUpdatedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.FilterLogs(opts, "MetadataURIUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyMetadataURIUpdatedIterator{contract: _DurationVaultStrategy.contract, event: "MetadataURIUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchMetadataURIUpdated is a free log subscription operation binding the contract event 0xefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba39.
+//
+// Solidity: event MetadataURIUpdated(string newMetadataURI)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyMetadataURIUpdated) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.WatchLogs(opts, "MetadataURIUpdated")
+ 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(DurationVaultStrategyMetadataURIUpdated)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "MetadataURIUpdated", 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
+}
+
+// ParseMetadataURIUpdated is a log parse operation binding the contract event 0xefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba39.
+//
+// Solidity: event MetadataURIUpdated(string newMetadataURI)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseMetadataURIUpdated(log types.Log) (*DurationVaultStrategyMetadataURIUpdated, error) {
+ event := new(DurationVaultStrategyMetadataURIUpdated)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "MetadataURIUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyPausedIterator struct {
+ Event *DurationVaultStrategyPaused // 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 *DurationVaultStrategyPausedIterator) 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(DurationVaultStrategyPaused)
+ 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(DurationVaultStrategyPaused)
+ 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 *DurationVaultStrategyPausedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyPausedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyPaused represents a Paused event raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyPaused struct {
+ Account common.Address
+ NewPausedStatus *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterPaused is a free log retrieval operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
+//
+// Solidity: event Paused(address indexed account, uint256 newPausedStatus)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*DurationVaultStrategyPausedIterator, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _DurationVaultStrategy.contract.FilterLogs(opts, "Paused", accountRule)
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyPausedIterator{contract: _DurationVaultStrategy.contract, event: "Paused", logs: logs, sub: sub}, nil
+}
+
+// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
+//
+// Solidity: event Paused(address indexed account, uint256 newPausedStatus)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyPaused, account []common.Address) (event.Subscription, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _DurationVaultStrategy.contract.WatchLogs(opts, "Paused", accountRule)
+ 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(DurationVaultStrategyPaused)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "Paused", 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
+}
+
+// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
+//
+// Solidity: event Paused(address indexed account, uint256 newPausedStatus)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParsePaused(log types.Log) (*DurationVaultStrategyPaused, error) {
+ event := new(DurationVaultStrategyPaused)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "Paused", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyStrategyTokenSetIterator is returned from FilterStrategyTokenSet and is used to iterate over the raw logs and unpacked data for StrategyTokenSet events raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyStrategyTokenSetIterator struct {
+ Event *DurationVaultStrategyStrategyTokenSet // 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 *DurationVaultStrategyStrategyTokenSetIterator) 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(DurationVaultStrategyStrategyTokenSet)
+ 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(DurationVaultStrategyStrategyTokenSet)
+ 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 *DurationVaultStrategyStrategyTokenSetIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyStrategyTokenSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyStrategyTokenSet represents a StrategyTokenSet event raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyStrategyTokenSet struct {
+ Token common.Address
+ Decimals uint8
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterStrategyTokenSet is a free log retrieval operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
+//
+// Solidity: event StrategyTokenSet(address token, uint8 decimals)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) FilterStrategyTokenSet(opts *bind.FilterOpts) (*DurationVaultStrategyStrategyTokenSetIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.FilterLogs(opts, "StrategyTokenSet")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStrategyTokenSetIterator{contract: _DurationVaultStrategy.contract, event: "StrategyTokenSet", logs: logs, sub: sub}, nil
+}
+
+// WatchStrategyTokenSet is a free log subscription operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
+//
+// Solidity: event StrategyTokenSet(address token, uint8 decimals)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchStrategyTokenSet(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStrategyTokenSet) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.WatchLogs(opts, "StrategyTokenSet")
+ 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(DurationVaultStrategyStrategyTokenSet)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "StrategyTokenSet", 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
+}
+
+// ParseStrategyTokenSet is a log parse operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
+//
+// Solidity: event StrategyTokenSet(address token, uint8 decimals)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseStrategyTokenSet(log types.Log) (*DurationVaultStrategyStrategyTokenSet, error) {
+ event := new(DurationVaultStrategyStrategyTokenSet)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "StrategyTokenSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyUnpausedIterator struct {
+ Event *DurationVaultStrategyUnpaused // 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 *DurationVaultStrategyUnpausedIterator) 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(DurationVaultStrategyUnpaused)
+ 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(DurationVaultStrategyUnpaused)
+ 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 *DurationVaultStrategyUnpausedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyUnpausedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyUnpaused represents a Unpaused event raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyUnpaused struct {
+ Account common.Address
+ NewPausedStatus *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterUnpaused is a free log retrieval operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
+//
+// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*DurationVaultStrategyUnpausedIterator, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _DurationVaultStrategy.contract.FilterLogs(opts, "Unpaused", accountRule)
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyUnpausedIterator{contract: _DurationVaultStrategy.contract, event: "Unpaused", logs: logs, sub: sub}, nil
+}
+
+// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
+//
+// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyUnpaused, account []common.Address) (event.Subscription, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _DurationVaultStrategy.contract.WatchLogs(opts, "Unpaused", accountRule)
+ 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(DurationVaultStrategyUnpaused)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "Unpaused", 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
+}
+
+// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
+//
+// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseUnpaused(log types.Log) (*DurationVaultStrategyUnpaused, error) {
+ event := new(DurationVaultStrategyUnpaused)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "Unpaused", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyVaultAdvancedToWithdrawalsIterator is returned from FilterVaultAdvancedToWithdrawals and is used to iterate over the raw logs and unpacked data for VaultAdvancedToWithdrawals events raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyVaultAdvancedToWithdrawalsIterator struct {
+ Event *DurationVaultStrategyVaultAdvancedToWithdrawals // 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 *DurationVaultStrategyVaultAdvancedToWithdrawalsIterator) 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(DurationVaultStrategyVaultAdvancedToWithdrawals)
+ 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(DurationVaultStrategyVaultAdvancedToWithdrawals)
+ 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 *DurationVaultStrategyVaultAdvancedToWithdrawalsIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyVaultAdvancedToWithdrawalsIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyVaultAdvancedToWithdrawals represents a VaultAdvancedToWithdrawals event raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyVaultAdvancedToWithdrawals struct {
+ Arbitrator common.Address
+ MaturedAt uint32
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterVaultAdvancedToWithdrawals is a free log retrieval operation binding the contract event 0x96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb97.
+//
+// Solidity: event VaultAdvancedToWithdrawals(address indexed arbitrator, uint32 maturedAt)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) FilterVaultAdvancedToWithdrawals(opts *bind.FilterOpts, arbitrator []common.Address) (*DurationVaultStrategyVaultAdvancedToWithdrawalsIterator, error) {
+
+ var arbitratorRule []interface{}
+ for _, arbitratorItem := range arbitrator {
+ arbitratorRule = append(arbitratorRule, arbitratorItem)
+ }
+
+ logs, sub, err := _DurationVaultStrategy.contract.FilterLogs(opts, "VaultAdvancedToWithdrawals", arbitratorRule)
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyVaultAdvancedToWithdrawalsIterator{contract: _DurationVaultStrategy.contract, event: "VaultAdvancedToWithdrawals", logs: logs, sub: sub}, nil
+}
+
+// WatchVaultAdvancedToWithdrawals is a free log subscription operation binding the contract event 0x96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb97.
+//
+// Solidity: event VaultAdvancedToWithdrawals(address indexed arbitrator, uint32 maturedAt)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchVaultAdvancedToWithdrawals(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyVaultAdvancedToWithdrawals, arbitrator []common.Address) (event.Subscription, error) {
+
+ var arbitratorRule []interface{}
+ for _, arbitratorItem := range arbitrator {
+ arbitratorRule = append(arbitratorRule, arbitratorItem)
+ }
+
+ logs, sub, err := _DurationVaultStrategy.contract.WatchLogs(opts, "VaultAdvancedToWithdrawals", arbitratorRule)
+ 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(DurationVaultStrategyVaultAdvancedToWithdrawals)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "VaultAdvancedToWithdrawals", 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
+}
+
+// ParseVaultAdvancedToWithdrawals is a log parse operation binding the contract event 0x96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb97.
+//
+// Solidity: event VaultAdvancedToWithdrawals(address indexed arbitrator, uint32 maturedAt)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseVaultAdvancedToWithdrawals(log types.Log) (*DurationVaultStrategyVaultAdvancedToWithdrawals, error) {
+ event := new(DurationVaultStrategyVaultAdvancedToWithdrawals)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "VaultAdvancedToWithdrawals", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyVaultInitializedIterator is returned from FilterVaultInitialized and is used to iterate over the raw logs and unpacked data for VaultInitialized events raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyVaultInitializedIterator struct {
+ Event *DurationVaultStrategyVaultInitialized // 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 *DurationVaultStrategyVaultInitializedIterator) 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(DurationVaultStrategyVaultInitialized)
+ 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(DurationVaultStrategyVaultInitialized)
+ 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 *DurationVaultStrategyVaultInitializedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyVaultInitializedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyVaultInitialized represents a VaultInitialized event raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyVaultInitialized struct {
+ VaultAdmin common.Address
+ Arbitrator common.Address
+ UnderlyingToken common.Address
+ Duration uint32
+ MaxPerDeposit *big.Int
+ StakeCap *big.Int
+ MetadataURI string
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterVaultInitialized is a free log retrieval operation binding the contract event 0xbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e.
+//
+// Solidity: event VaultInitialized(address indexed vaultAdmin, address indexed arbitrator, address indexed underlyingToken, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) FilterVaultInitialized(opts *bind.FilterOpts, vaultAdmin []common.Address, arbitrator []common.Address, underlyingToken []common.Address) (*DurationVaultStrategyVaultInitializedIterator, error) {
+
+ var vaultAdminRule []interface{}
+ for _, vaultAdminItem := range vaultAdmin {
+ vaultAdminRule = append(vaultAdminRule, vaultAdminItem)
+ }
+ var arbitratorRule []interface{}
+ for _, arbitratorItem := range arbitrator {
+ arbitratorRule = append(arbitratorRule, arbitratorItem)
+ }
+ var underlyingTokenRule []interface{}
+ for _, underlyingTokenItem := range underlyingToken {
+ underlyingTokenRule = append(underlyingTokenRule, underlyingTokenItem)
+ }
+
+ logs, sub, err := _DurationVaultStrategy.contract.FilterLogs(opts, "VaultInitialized", vaultAdminRule, arbitratorRule, underlyingTokenRule)
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyVaultInitializedIterator{contract: _DurationVaultStrategy.contract, event: "VaultInitialized", logs: logs, sub: sub}, nil
+}
+
+// WatchVaultInitialized is a free log subscription operation binding the contract event 0xbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e.
+//
+// Solidity: event VaultInitialized(address indexed vaultAdmin, address indexed arbitrator, address indexed underlyingToken, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchVaultInitialized(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyVaultInitialized, vaultAdmin []common.Address, arbitrator []common.Address, underlyingToken []common.Address) (event.Subscription, error) {
+
+ var vaultAdminRule []interface{}
+ for _, vaultAdminItem := range vaultAdmin {
+ vaultAdminRule = append(vaultAdminRule, vaultAdminItem)
+ }
+ var arbitratorRule []interface{}
+ for _, arbitratorItem := range arbitrator {
+ arbitratorRule = append(arbitratorRule, arbitratorItem)
+ }
+ var underlyingTokenRule []interface{}
+ for _, underlyingTokenItem := range underlyingToken {
+ underlyingTokenRule = append(underlyingTokenRule, underlyingTokenItem)
+ }
+
+ logs, sub, err := _DurationVaultStrategy.contract.WatchLogs(opts, "VaultInitialized", vaultAdminRule, arbitratorRule, underlyingTokenRule)
+ 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(DurationVaultStrategyVaultInitialized)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "VaultInitialized", 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
+}
+
+// ParseVaultInitialized is a log parse operation binding the contract event 0xbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e.
+//
+// Solidity: event VaultInitialized(address indexed vaultAdmin, address indexed arbitrator, address indexed underlyingToken, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseVaultInitialized(log types.Log) (*DurationVaultStrategyVaultInitialized, error) {
+ event := new(DurationVaultStrategyVaultInitialized)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "VaultInitialized", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyVaultLockedIterator is returned from FilterVaultLocked and is used to iterate over the raw logs and unpacked data for VaultLocked events raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyVaultLockedIterator struct {
+ Event *DurationVaultStrategyVaultLocked // 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 *DurationVaultStrategyVaultLockedIterator) 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(DurationVaultStrategyVaultLocked)
+ 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(DurationVaultStrategyVaultLocked)
+ 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 *DurationVaultStrategyVaultLockedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyVaultLockedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyVaultLocked represents a VaultLocked event raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyVaultLocked struct {
+ LockedAt uint32
+ UnlockAt uint32
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterVaultLocked is a free log retrieval operation binding the contract event 0x42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4.
+//
+// Solidity: event VaultLocked(uint32 lockedAt, uint32 unlockAt)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) FilterVaultLocked(opts *bind.FilterOpts) (*DurationVaultStrategyVaultLockedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.FilterLogs(opts, "VaultLocked")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyVaultLockedIterator{contract: _DurationVaultStrategy.contract, event: "VaultLocked", logs: logs, sub: sub}, nil
+}
+
+// WatchVaultLocked is a free log subscription operation binding the contract event 0x42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4.
+//
+// Solidity: event VaultLocked(uint32 lockedAt, uint32 unlockAt)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchVaultLocked(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyVaultLocked) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.WatchLogs(opts, "VaultLocked")
+ 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(DurationVaultStrategyVaultLocked)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "VaultLocked", 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
+}
+
+// ParseVaultLocked is a log parse operation binding the contract event 0x42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4.
+//
+// Solidity: event VaultLocked(uint32 lockedAt, uint32 unlockAt)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseVaultLocked(log types.Log) (*DurationVaultStrategyVaultLocked, error) {
+ event := new(DurationVaultStrategyVaultLocked)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "VaultLocked", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyVaultMaturedIterator is returned from FilterVaultMatured and is used to iterate over the raw logs and unpacked data for VaultMatured events raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyVaultMaturedIterator struct {
+ Event *DurationVaultStrategyVaultMatured // 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 *DurationVaultStrategyVaultMaturedIterator) 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(DurationVaultStrategyVaultMatured)
+ 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(DurationVaultStrategyVaultMatured)
+ 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 *DurationVaultStrategyVaultMaturedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyVaultMaturedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyVaultMatured represents a VaultMatured event raised by the DurationVaultStrategy contract.
+type DurationVaultStrategyVaultMatured struct {
+ MaturedAt uint32
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterVaultMatured is a free log retrieval operation binding the contract event 0xff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f2.
+//
+// Solidity: event VaultMatured(uint32 maturedAt)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) FilterVaultMatured(opts *bind.FilterOpts) (*DurationVaultStrategyVaultMaturedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.FilterLogs(opts, "VaultMatured")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyVaultMaturedIterator{contract: _DurationVaultStrategy.contract, event: "VaultMatured", logs: logs, sub: sub}, nil
+}
+
+// WatchVaultMatured is a free log subscription operation binding the contract event 0xff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f2.
+//
+// Solidity: event VaultMatured(uint32 maturedAt)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchVaultMatured(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyVaultMatured) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategy.contract.WatchLogs(opts, "VaultMatured")
+ 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(DurationVaultStrategyVaultMatured)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "VaultMatured", 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
+}
+
+// ParseVaultMatured is a log parse operation binding the contract event 0xff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f2.
+//
+// Solidity: event VaultMatured(uint32 maturedAt)
+func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseVaultMatured(log types.Log) (*DurationVaultStrategyVaultMatured, error) {
+ event := new(DurationVaultStrategyVaultMatured)
+ if err := _DurationVaultStrategy.contract.UnpackLog(event, "VaultMatured", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
diff --git a/pkg/bindings/DurationVaultStrategyStorage/binding.go b/pkg/bindings/DurationVaultStrategyStorage/binding.go
new file mode 100644
index 0000000000..c6c79d5abc
--- /dev/null
+++ b/pkg/bindings/DurationVaultStrategyStorage/binding.go
@@ -0,0 +1,2961 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package DurationVaultStrategyStorage
+
+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
+)
+
+// DurationVaultStrategyStorageMetaData contains all meta data concerning the DurationVaultStrategyStorage contract.
+var DurationVaultStrategyStorageMetaData = &bind.MetaData{
+ ABI: "[{\"type\":\"function\",\"name\":\"advanceToWithdrawals\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationsActive\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"arbitrator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beforeAddShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beforeRemoveShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"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\":\"depositsOpen\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"duration\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isLocked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMatured\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lock\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lockedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"markMatured\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maturedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"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\":\"metadataURI\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorIntegrationConfigured\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSetInfo\",\"inputs\":[],\"outputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSetRegistered\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardsCoordinator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRewardsCoordinator\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setRewardsClaimer\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakeCap\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIDurationVaultStrategyTypes.VaultState\"}],\"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\":\"unlockAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unlockTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateDelegationApprover\",\"inputs\":[{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateMetadataURI\",\"inputs\":[{\"name\":\"newMetadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"newOperatorMetadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newStakeCap\",\"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\":\"vaultAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalsOpen\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DeallocateAttempted\",\"inputs\":[{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DeregisterAttempted\",\"inputs\":[{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"MetadataURIUpdated\",\"inputs\":[{\"name\":\"newMetadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"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\":\"VaultAdvancedToWithdrawals\",\"inputs\":[{\"name\":\"arbitrator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"maturedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultInitialized\",\"inputs\":[{\"name\":\"vaultAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"arbitrator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"underlyingToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"contractIERC20\"},{\"name\":\"duration\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"maxPerDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"stakeCap\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultLocked\",\"inputs\":[{\"name\":\"lockedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"unlockAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultMatured\",\"inputs\":[{\"name\":\"maturedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositExceedsMaxPerDeposit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositsLocked\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationAlreadyElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidArbitrator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidVaultAdmin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeDelegatedToVaultOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyArbitrator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyVaultAdmin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorIntegrationInvalid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PendingAllocation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotSupportedByOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnderlyingTokenBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VaultAlreadyLocked\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VaultNotLocked\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalsLockedDuringAllocations\",\"inputs\":[]}]",
+}
+
+// DurationVaultStrategyStorageABI is the input ABI used to generate the binding from.
+// Deprecated: Use DurationVaultStrategyStorageMetaData.ABI instead.
+var DurationVaultStrategyStorageABI = DurationVaultStrategyStorageMetaData.ABI
+
+// DurationVaultStrategyStorage is an auto generated Go binding around an Ethereum contract.
+type DurationVaultStrategyStorage struct {
+ DurationVaultStrategyStorageCaller // Read-only binding to the contract
+ DurationVaultStrategyStorageTransactor // Write-only binding to the contract
+ DurationVaultStrategyStorageFilterer // Log filterer for contract events
+}
+
+// DurationVaultStrategyStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
+type DurationVaultStrategyStorageCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// DurationVaultStrategyStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type DurationVaultStrategyStorageTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// DurationVaultStrategyStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type DurationVaultStrategyStorageFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// DurationVaultStrategyStorageSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type DurationVaultStrategyStorageSession struct {
+ Contract *DurationVaultStrategyStorage // 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
+}
+
+// DurationVaultStrategyStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type DurationVaultStrategyStorageCallerSession struct {
+ Contract *DurationVaultStrategyStorageCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// DurationVaultStrategyStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type DurationVaultStrategyStorageTransactorSession struct {
+ Contract *DurationVaultStrategyStorageTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// DurationVaultStrategyStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
+type DurationVaultStrategyStorageRaw struct {
+ Contract *DurationVaultStrategyStorage // Generic contract binding to access the raw methods on
+}
+
+// DurationVaultStrategyStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type DurationVaultStrategyStorageCallerRaw struct {
+ Contract *DurationVaultStrategyStorageCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// DurationVaultStrategyStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type DurationVaultStrategyStorageTransactorRaw struct {
+ Contract *DurationVaultStrategyStorageTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewDurationVaultStrategyStorage creates a new instance of DurationVaultStrategyStorage, bound to a specific deployed contract.
+func NewDurationVaultStrategyStorage(address common.Address, backend bind.ContractBackend) (*DurationVaultStrategyStorage, error) {
+ contract, err := bindDurationVaultStrategyStorage(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStorage{DurationVaultStrategyStorageCaller: DurationVaultStrategyStorageCaller{contract: contract}, DurationVaultStrategyStorageTransactor: DurationVaultStrategyStorageTransactor{contract: contract}, DurationVaultStrategyStorageFilterer: DurationVaultStrategyStorageFilterer{contract: contract}}, nil
+}
+
+// NewDurationVaultStrategyStorageCaller creates a new read-only instance of DurationVaultStrategyStorage, bound to a specific deployed contract.
+func NewDurationVaultStrategyStorageCaller(address common.Address, caller bind.ContractCaller) (*DurationVaultStrategyStorageCaller, error) {
+ contract, err := bindDurationVaultStrategyStorage(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStorageCaller{contract: contract}, nil
+}
+
+// NewDurationVaultStrategyStorageTransactor creates a new write-only instance of DurationVaultStrategyStorage, bound to a specific deployed contract.
+func NewDurationVaultStrategyStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*DurationVaultStrategyStorageTransactor, error) {
+ contract, err := bindDurationVaultStrategyStorage(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStorageTransactor{contract: contract}, nil
+}
+
+// NewDurationVaultStrategyStorageFilterer creates a new log filterer instance of DurationVaultStrategyStorage, bound to a specific deployed contract.
+func NewDurationVaultStrategyStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*DurationVaultStrategyStorageFilterer, error) {
+ contract, err := bindDurationVaultStrategyStorage(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStorageFilterer{contract: contract}, nil
+}
+
+// bindDurationVaultStrategyStorage binds a generic wrapper to an already deployed contract.
+func bindDurationVaultStrategyStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := DurationVaultStrategyStorageMetaData.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 (_DurationVaultStrategyStorage *DurationVaultStrategyStorageRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _DurationVaultStrategyStorage.Contract.DurationVaultStrategyStorageCaller.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 (_DurationVaultStrategyStorage *DurationVaultStrategyStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.DurationVaultStrategyStorageTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.DurationVaultStrategyStorageTransactor.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 (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _DurationVaultStrategyStorage.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 (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.contract.Transact(opts, method, params...)
+}
+
+// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
+//
+// Solidity: function allocationManager() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "allocationManager")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
+//
+// Solidity: function allocationManager() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) AllocationManager() (common.Address, error) {
+ return _DurationVaultStrategyStorage.Contract.AllocationManager(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
+//
+// Solidity: function allocationManager() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) AllocationManager() (common.Address, error) {
+ return _DurationVaultStrategyStorage.Contract.AllocationManager(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// AllocationsActive is a free data retrieval call binding the contract method 0xfb4d86b4.
+//
+// Solidity: function allocationsActive() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) AllocationsActive(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "allocationsActive")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// AllocationsActive is a free data retrieval call binding the contract method 0xfb4d86b4.
+//
+// Solidity: function allocationsActive() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) AllocationsActive() (bool, error) {
+ return _DurationVaultStrategyStorage.Contract.AllocationsActive(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// AllocationsActive is a free data retrieval call binding the contract method 0xfb4d86b4.
+//
+// Solidity: function allocationsActive() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) AllocationsActive() (bool, error) {
+ return _DurationVaultStrategyStorage.Contract.AllocationsActive(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// Arbitrator is a free data retrieval call binding the contract method 0x6cc6cde1.
+//
+// Solidity: function arbitrator() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) Arbitrator(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "arbitrator")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// Arbitrator is a free data retrieval call binding the contract method 0x6cc6cde1.
+//
+// Solidity: function arbitrator() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) Arbitrator() (common.Address, error) {
+ return _DurationVaultStrategyStorage.Contract.Arbitrator(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// Arbitrator is a free data retrieval call binding the contract method 0x6cc6cde1.
+//
+// Solidity: function arbitrator() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) Arbitrator() (common.Address, error) {
+ return _DurationVaultStrategyStorage.Contract.Arbitrator(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b.
+//
+// Solidity: function delegationManager() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) DelegationManager(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "delegationManager")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b.
+//
+// Solidity: function delegationManager() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) DelegationManager() (common.Address, error) {
+ return _DurationVaultStrategyStorage.Contract.DelegationManager(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b.
+//
+// Solidity: function delegationManager() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) DelegationManager() (common.Address, error) {
+ return _DurationVaultStrategyStorage.Contract.DelegationManager(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// DepositsOpen is a free data retrieval call binding the contract method 0x549c4627.
+//
+// Solidity: function depositsOpen() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) DepositsOpen(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "depositsOpen")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// DepositsOpen is a free data retrieval call binding the contract method 0x549c4627.
+//
+// Solidity: function depositsOpen() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) DepositsOpen() (bool, error) {
+ return _DurationVaultStrategyStorage.Contract.DepositsOpen(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// DepositsOpen is a free data retrieval call binding the contract method 0x549c4627.
+//
+// Solidity: function depositsOpen() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) DepositsOpen() (bool, error) {
+ return _DurationVaultStrategyStorage.Contract.DepositsOpen(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// Duration is a free data retrieval call binding the contract method 0x0fb5a6b4.
+//
+// Solidity: function duration() view returns(uint32)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) Duration(opts *bind.CallOpts) (uint32, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "duration")
+
+ if err != nil {
+ return *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+ return out0, err
+
+}
+
+// Duration is a free data retrieval call binding the contract method 0x0fb5a6b4.
+//
+// Solidity: function duration() view returns(uint32)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) Duration() (uint32, error) {
+ return _DurationVaultStrategyStorage.Contract.Duration(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// Duration is a free data retrieval call binding the contract method 0x0fb5a6b4.
+//
+// Solidity: function duration() view returns(uint32)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) Duration() (uint32, error) {
+ return _DurationVaultStrategyStorage.Contract.Duration(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// Explanation is a free data retrieval call binding the contract method 0xab5921e1.
+//
+// Solidity: function explanation() view returns(string)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) Explanation(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "explanation")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Explanation is a free data retrieval call binding the contract method 0xab5921e1.
+//
+// Solidity: function explanation() view returns(string)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) Explanation() (string, error) {
+ return _DurationVaultStrategyStorage.Contract.Explanation(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// Explanation is a free data retrieval call binding the contract method 0xab5921e1.
+//
+// Solidity: function explanation() view returns(string)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) Explanation() (string, error) {
+ return _DurationVaultStrategyStorage.Contract.Explanation(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// IsLocked is a free data retrieval call binding the contract method 0xa4e2d634.
+//
+// Solidity: function isLocked() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) IsLocked(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "isLocked")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsLocked is a free data retrieval call binding the contract method 0xa4e2d634.
+//
+// Solidity: function isLocked() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) IsLocked() (bool, error) {
+ return _DurationVaultStrategyStorage.Contract.IsLocked(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// IsLocked is a free data retrieval call binding the contract method 0xa4e2d634.
+//
+// Solidity: function isLocked() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) IsLocked() (bool, error) {
+ return _DurationVaultStrategyStorage.Contract.IsLocked(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// IsMatured is a free data retrieval call binding the contract method 0x7f2b6a0d.
+//
+// Solidity: function isMatured() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) IsMatured(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "isMatured")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsMatured is a free data retrieval call binding the contract method 0x7f2b6a0d.
+//
+// Solidity: function isMatured() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) IsMatured() (bool, error) {
+ return _DurationVaultStrategyStorage.Contract.IsMatured(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// IsMatured is a free data retrieval call binding the contract method 0x7f2b6a0d.
+//
+// Solidity: function isMatured() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) IsMatured() (bool, error) {
+ return _DurationVaultStrategyStorage.Contract.IsMatured(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// LockedAt is a free data retrieval call binding the contract method 0xb2163482.
+//
+// Solidity: function lockedAt() view returns(uint32)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) LockedAt(opts *bind.CallOpts) (uint32, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "lockedAt")
+
+ if err != nil {
+ return *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+ return out0, err
+
+}
+
+// LockedAt is a free data retrieval call binding the contract method 0xb2163482.
+//
+// Solidity: function lockedAt() view returns(uint32)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) LockedAt() (uint32, error) {
+ return _DurationVaultStrategyStorage.Contract.LockedAt(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// LockedAt is a free data retrieval call binding the contract method 0xb2163482.
+//
+// Solidity: function lockedAt() view returns(uint32)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) LockedAt() (uint32, error) {
+ return _DurationVaultStrategyStorage.Contract.LockedAt(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// MaturedAt is a free data retrieval call binding the contract method 0x1f1cc9a3.
+//
+// Solidity: function maturedAt() view returns(uint32)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) MaturedAt(opts *bind.CallOpts) (uint32, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "maturedAt")
+
+ if err != nil {
+ return *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+ return out0, err
+
+}
+
+// MaturedAt is a free data retrieval call binding the contract method 0x1f1cc9a3.
+//
+// Solidity: function maturedAt() view returns(uint32)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) MaturedAt() (uint32, error) {
+ return _DurationVaultStrategyStorage.Contract.MaturedAt(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// MaturedAt is a free data retrieval call binding the contract method 0x1f1cc9a3.
+//
+// Solidity: function maturedAt() view returns(uint32)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) MaturedAt() (uint32, error) {
+ return _DurationVaultStrategyStorage.Contract.MaturedAt(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// MaxPerDeposit is a free data retrieval call binding the contract method 0x43fe08b0.
+//
+// Solidity: function maxPerDeposit() view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) MaxPerDeposit(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "maxPerDeposit")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// MaxPerDeposit is a free data retrieval call binding the contract method 0x43fe08b0.
+//
+// Solidity: function maxPerDeposit() view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) MaxPerDeposit() (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.MaxPerDeposit(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// MaxPerDeposit is a free data retrieval call binding the contract method 0x43fe08b0.
+//
+// Solidity: function maxPerDeposit() view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) MaxPerDeposit() (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.MaxPerDeposit(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// MaxTotalDeposits is a free data retrieval call binding the contract method 0x61b01b5d.
+//
+// Solidity: function maxTotalDeposits() view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) MaxTotalDeposits(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "maxTotalDeposits")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// MaxTotalDeposits is a free data retrieval call binding the contract method 0x61b01b5d.
+//
+// Solidity: function maxTotalDeposits() view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) MaxTotalDeposits() (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.MaxTotalDeposits(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// MaxTotalDeposits is a free data retrieval call binding the contract method 0x61b01b5d.
+//
+// Solidity: function maxTotalDeposits() view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) MaxTotalDeposits() (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.MaxTotalDeposits(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// MetadataURI is a free data retrieval call binding the contract method 0x03ee438c.
+//
+// Solidity: function metadataURI() view returns(string)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) MetadataURI(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "metadataURI")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// MetadataURI is a free data retrieval call binding the contract method 0x03ee438c.
+//
+// Solidity: function metadataURI() view returns(string)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) MetadataURI() (string, error) {
+ return _DurationVaultStrategyStorage.Contract.MetadataURI(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// MetadataURI is a free data retrieval call binding the contract method 0x03ee438c.
+//
+// Solidity: function metadataURI() view returns(string)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) MetadataURI() (string, error) {
+ return _DurationVaultStrategyStorage.Contract.MetadataURI(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// OperatorIntegrationConfigured is a free data retrieval call binding the contract method 0x5438a8c7.
+//
+// Solidity: function operatorIntegrationConfigured() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) OperatorIntegrationConfigured(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "operatorIntegrationConfigured")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// OperatorIntegrationConfigured is a free data retrieval call binding the contract method 0x5438a8c7.
+//
+// Solidity: function operatorIntegrationConfigured() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) OperatorIntegrationConfigured() (bool, error) {
+ return _DurationVaultStrategyStorage.Contract.OperatorIntegrationConfigured(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// OperatorIntegrationConfigured is a free data retrieval call binding the contract method 0x5438a8c7.
+//
+// Solidity: function operatorIntegrationConfigured() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) OperatorIntegrationConfigured() (bool, error) {
+ return _DurationVaultStrategyStorage.Contract.OperatorIntegrationConfigured(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// OperatorSetInfo is a free data retrieval call binding the contract method 0xd4deae81.
+//
+// Solidity: function operatorSetInfo() view returns(address avs, uint32 operatorSetId)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) OperatorSetInfo(opts *bind.CallOpts) (struct {
+ Avs common.Address
+ OperatorSetId uint32
+}, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "operatorSetInfo")
+
+ outstruct := new(struct {
+ Avs common.Address
+ OperatorSetId uint32
+ })
+ if err != nil {
+ return *outstruct, err
+ }
+
+ outstruct.Avs = *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+ outstruct.OperatorSetId = *abi.ConvertType(out[1], new(uint32)).(*uint32)
+
+ return *outstruct, err
+
+}
+
+// OperatorSetInfo is a free data retrieval call binding the contract method 0xd4deae81.
+//
+// Solidity: function operatorSetInfo() view returns(address avs, uint32 operatorSetId)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) OperatorSetInfo() (struct {
+ Avs common.Address
+ OperatorSetId uint32
+}, error) {
+ return _DurationVaultStrategyStorage.Contract.OperatorSetInfo(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// OperatorSetInfo is a free data retrieval call binding the contract method 0xd4deae81.
+//
+// Solidity: function operatorSetInfo() view returns(address avs, uint32 operatorSetId)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) OperatorSetInfo() (struct {
+ Avs common.Address
+ OperatorSetId uint32
+}, error) {
+ return _DurationVaultStrategyStorage.Contract.OperatorSetInfo(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// OperatorSetRegistered is a free data retrieval call binding the contract method 0x59d915ff.
+//
+// Solidity: function operatorSetRegistered() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) OperatorSetRegistered(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "operatorSetRegistered")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// OperatorSetRegistered is a free data retrieval call binding the contract method 0x59d915ff.
+//
+// Solidity: function operatorSetRegistered() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) OperatorSetRegistered() (bool, error) {
+ return _DurationVaultStrategyStorage.Contract.OperatorSetRegistered(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// OperatorSetRegistered is a free data retrieval call binding the contract method 0x59d915ff.
+//
+// Solidity: function operatorSetRegistered() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) OperatorSetRegistered() (bool, error) {
+ return _DurationVaultStrategyStorage.Contract.OperatorSetRegistered(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// RewardsCoordinator is a free data retrieval call binding the contract method 0x8a2fc4e3.
+//
+// Solidity: function rewardsCoordinator() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) RewardsCoordinator(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "rewardsCoordinator")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// RewardsCoordinator is a free data retrieval call binding the contract method 0x8a2fc4e3.
+//
+// Solidity: function rewardsCoordinator() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) RewardsCoordinator() (common.Address, error) {
+ return _DurationVaultStrategyStorage.Contract.RewardsCoordinator(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// RewardsCoordinator is a free data retrieval call binding the contract method 0x8a2fc4e3.
+//
+// Solidity: function rewardsCoordinator() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) RewardsCoordinator() (common.Address, error) {
+ return _DurationVaultStrategyStorage.Contract.RewardsCoordinator(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// Shares is a free data retrieval call binding the contract method 0xce7c2ac2.
+//
+// Solidity: function shares(address user) view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) Shares(opts *bind.CallOpts, user common.Address) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "shares", user)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// Shares is a free data retrieval call binding the contract method 0xce7c2ac2.
+//
+// Solidity: function shares(address user) view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) Shares(user common.Address) (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.Shares(&_DurationVaultStrategyStorage.CallOpts, user)
+}
+
+// Shares is a free data retrieval call binding the contract method 0xce7c2ac2.
+//
+// Solidity: function shares(address user) view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) Shares(user common.Address) (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.Shares(&_DurationVaultStrategyStorage.CallOpts, user)
+}
+
+// SharesToUnderlyingView is a free data retrieval call binding the contract method 0x7a8b2637.
+//
+// Solidity: function sharesToUnderlyingView(uint256 amountShares) view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) SharesToUnderlyingView(opts *bind.CallOpts, amountShares *big.Int) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "sharesToUnderlyingView", amountShares)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// SharesToUnderlyingView is a free data retrieval call binding the contract method 0x7a8b2637.
+//
+// Solidity: function sharesToUnderlyingView(uint256 amountShares) view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) SharesToUnderlyingView(amountShares *big.Int) (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.SharesToUnderlyingView(&_DurationVaultStrategyStorage.CallOpts, amountShares)
+}
+
+// SharesToUnderlyingView is a free data retrieval call binding the contract method 0x7a8b2637.
+//
+// Solidity: function sharesToUnderlyingView(uint256 amountShares) view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) SharesToUnderlyingView(amountShares *big.Int) (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.SharesToUnderlyingView(&_DurationVaultStrategyStorage.CallOpts, amountShares)
+}
+
+// StakeCap is a free data retrieval call binding the contract method 0xba28fd2e.
+//
+// Solidity: function stakeCap() view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) StakeCap(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "stakeCap")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// StakeCap is a free data retrieval call binding the contract method 0xba28fd2e.
+//
+// Solidity: function stakeCap() view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) StakeCap() (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.StakeCap(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// StakeCap is a free data retrieval call binding the contract method 0xba28fd2e.
+//
+// Solidity: function stakeCap() view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) StakeCap() (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.StakeCap(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// State is a free data retrieval call binding the contract method 0xc19d93fb.
+//
+// Solidity: function state() view returns(uint8)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) State(opts *bind.CallOpts) (uint8, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "state")
+
+ if err != nil {
+ return *new(uint8), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
+
+ return out0, err
+
+}
+
+// State is a free data retrieval call binding the contract method 0xc19d93fb.
+//
+// Solidity: function state() view returns(uint8)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) State() (uint8, error) {
+ return _DurationVaultStrategyStorage.Contract.State(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// State is a free data retrieval call binding the contract method 0xc19d93fb.
+//
+// Solidity: function state() view returns(uint8)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) State() (uint8, error) {
+ return _DurationVaultStrategyStorage.Contract.State(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// TotalShares is a free data retrieval call binding the contract method 0x3a98ef39.
+//
+// Solidity: function totalShares() view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) TotalShares(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "totalShares")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// TotalShares is a free data retrieval call binding the contract method 0x3a98ef39.
+//
+// Solidity: function totalShares() view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) TotalShares() (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.TotalShares(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// TotalShares is a free data retrieval call binding the contract method 0x3a98ef39.
+//
+// Solidity: function totalShares() view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) TotalShares() (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.TotalShares(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// UnderlyingToSharesView is a free data retrieval call binding the contract method 0xe3dae51c.
+//
+// Solidity: function underlyingToSharesView(uint256 amountUnderlying) view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) UnderlyingToSharesView(opts *bind.CallOpts, amountUnderlying *big.Int) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "underlyingToSharesView", amountUnderlying)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// UnderlyingToSharesView is a free data retrieval call binding the contract method 0xe3dae51c.
+//
+// Solidity: function underlyingToSharesView(uint256 amountUnderlying) view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) UnderlyingToSharesView(amountUnderlying *big.Int) (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.UnderlyingToSharesView(&_DurationVaultStrategyStorage.CallOpts, amountUnderlying)
+}
+
+// UnderlyingToSharesView is a free data retrieval call binding the contract method 0xe3dae51c.
+//
+// Solidity: function underlyingToSharesView(uint256 amountUnderlying) view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) UnderlyingToSharesView(amountUnderlying *big.Int) (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.UnderlyingToSharesView(&_DurationVaultStrategyStorage.CallOpts, amountUnderlying)
+}
+
+// UnderlyingToken is a free data retrieval call binding the contract method 0x2495a599.
+//
+// Solidity: function underlyingToken() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) UnderlyingToken(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "underlyingToken")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// UnderlyingToken is a free data retrieval call binding the contract method 0x2495a599.
+//
+// Solidity: function underlyingToken() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) UnderlyingToken() (common.Address, error) {
+ return _DurationVaultStrategyStorage.Contract.UnderlyingToken(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// UnderlyingToken is a free data retrieval call binding the contract method 0x2495a599.
+//
+// Solidity: function underlyingToken() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) UnderlyingToken() (common.Address, error) {
+ return _DurationVaultStrategyStorage.Contract.UnderlyingToken(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// UnlockAt is a free data retrieval call binding the contract method 0xaa5dec6f.
+//
+// Solidity: function unlockAt() view returns(uint32)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) UnlockAt(opts *bind.CallOpts) (uint32, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "unlockAt")
+
+ if err != nil {
+ return *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+ return out0, err
+
+}
+
+// UnlockAt is a free data retrieval call binding the contract method 0xaa5dec6f.
+//
+// Solidity: function unlockAt() view returns(uint32)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) UnlockAt() (uint32, error) {
+ return _DurationVaultStrategyStorage.Contract.UnlockAt(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// UnlockAt is a free data retrieval call binding the contract method 0xaa5dec6f.
+//
+// Solidity: function unlockAt() view returns(uint32)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) UnlockAt() (uint32, error) {
+ return _DurationVaultStrategyStorage.Contract.UnlockAt(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// UnlockTimestamp is a free data retrieval call binding the contract method 0xaa082a9d.
+//
+// Solidity: function unlockTimestamp() view returns(uint32)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) UnlockTimestamp(opts *bind.CallOpts) (uint32, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "unlockTimestamp")
+
+ if err != nil {
+ return *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+ return out0, err
+
+}
+
+// UnlockTimestamp is a free data retrieval call binding the contract method 0xaa082a9d.
+//
+// Solidity: function unlockTimestamp() view returns(uint32)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) UnlockTimestamp() (uint32, error) {
+ return _DurationVaultStrategyStorage.Contract.UnlockTimestamp(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// UnlockTimestamp is a free data retrieval call binding the contract method 0xaa082a9d.
+//
+// Solidity: function unlockTimestamp() view returns(uint32)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) UnlockTimestamp() (uint32, error) {
+ return _DurationVaultStrategyStorage.Contract.UnlockTimestamp(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// UserUnderlyingView is a free data retrieval call binding the contract method 0x553ca5f8.
+//
+// Solidity: function userUnderlyingView(address user) view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) UserUnderlyingView(opts *bind.CallOpts, user common.Address) (*big.Int, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "userUnderlyingView", user)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// UserUnderlyingView is a free data retrieval call binding the contract method 0x553ca5f8.
+//
+// Solidity: function userUnderlyingView(address user) view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) UserUnderlyingView(user common.Address) (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.UserUnderlyingView(&_DurationVaultStrategyStorage.CallOpts, user)
+}
+
+// UserUnderlyingView is a free data retrieval call binding the contract method 0x553ca5f8.
+//
+// Solidity: function userUnderlyingView(address user) view returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) UserUnderlyingView(user common.Address) (*big.Int, error) {
+ return _DurationVaultStrategyStorage.Contract.UserUnderlyingView(&_DurationVaultStrategyStorage.CallOpts, user)
+}
+
+// VaultAdmin is a free data retrieval call binding the contract method 0xe7f6f225.
+//
+// Solidity: function vaultAdmin() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) VaultAdmin(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "vaultAdmin")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// VaultAdmin is a free data retrieval call binding the contract method 0xe7f6f225.
+//
+// Solidity: function vaultAdmin() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) VaultAdmin() (common.Address, error) {
+ return _DurationVaultStrategyStorage.Contract.VaultAdmin(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// VaultAdmin is a free data retrieval call binding the contract method 0xe7f6f225.
+//
+// Solidity: function vaultAdmin() view returns(address)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) VaultAdmin() (common.Address, error) {
+ return _DurationVaultStrategyStorage.Contract.VaultAdmin(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// WithdrawalsOpen is a free data retrieval call binding the contract method 0x94aad677.
+//
+// Solidity: function withdrawalsOpen() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCaller) WithdrawalsOpen(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _DurationVaultStrategyStorage.contract.Call(opts, &out, "withdrawalsOpen")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// WithdrawalsOpen is a free data retrieval call binding the contract method 0x94aad677.
+//
+// Solidity: function withdrawalsOpen() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) WithdrawalsOpen() (bool, error) {
+ return _DurationVaultStrategyStorage.Contract.WithdrawalsOpen(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// WithdrawalsOpen is a free data retrieval call binding the contract method 0x94aad677.
+//
+// Solidity: function withdrawalsOpen() view returns(bool)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageCallerSession) WithdrawalsOpen() (bool, error) {
+ return _DurationVaultStrategyStorage.Contract.WithdrawalsOpen(&_DurationVaultStrategyStorage.CallOpts)
+}
+
+// AdvanceToWithdrawals is a paid mutator transaction binding the contract method 0x6325f655.
+//
+// Solidity: function advanceToWithdrawals() returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactor) AdvanceToWithdrawals(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.contract.Transact(opts, "advanceToWithdrawals")
+}
+
+// AdvanceToWithdrawals is a paid mutator transaction binding the contract method 0x6325f655.
+//
+// Solidity: function advanceToWithdrawals() returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) AdvanceToWithdrawals() (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.AdvanceToWithdrawals(&_DurationVaultStrategyStorage.TransactOpts)
+}
+
+// AdvanceToWithdrawals is a paid mutator transaction binding the contract method 0x6325f655.
+//
+// Solidity: function advanceToWithdrawals() returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorSession) AdvanceToWithdrawals() (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.AdvanceToWithdrawals(&_DurationVaultStrategyStorage.TransactOpts)
+}
+
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address staker, uint256 shares) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactor) BeforeAddShares(opts *bind.TransactOpts, staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.contract.Transact(opts, "beforeAddShares", staker, shares)
+}
+
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address staker, uint256 shares) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) BeforeAddShares(staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.BeforeAddShares(&_DurationVaultStrategyStorage.TransactOpts, staker, shares)
+}
+
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address staker, uint256 shares) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorSession) BeforeAddShares(staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.BeforeAddShares(&_DurationVaultStrategyStorage.TransactOpts, staker, shares)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address staker, uint256 shares) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactor) BeforeRemoveShares(opts *bind.TransactOpts, staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.contract.Transact(opts, "beforeRemoveShares", staker, shares)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address staker, uint256 shares) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) BeforeRemoveShares(staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.BeforeRemoveShares(&_DurationVaultStrategyStorage.TransactOpts, staker, shares)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address staker, uint256 shares) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorSession) BeforeRemoveShares(staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.BeforeRemoveShares(&_DurationVaultStrategyStorage.TransactOpts, staker, shares)
+}
+
+// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
+//
+// Solidity: function deposit(address token, uint256 amount) returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactor) Deposit(opts *bind.TransactOpts, token common.Address, amount *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.contract.Transact(opts, "deposit", token, amount)
+}
+
+// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
+//
+// Solidity: function deposit(address token, uint256 amount) returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) Deposit(token common.Address, amount *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.Deposit(&_DurationVaultStrategyStorage.TransactOpts, token, amount)
+}
+
+// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
+//
+// Solidity: function deposit(address token, uint256 amount) returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorSession) Deposit(token common.Address, amount *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.Deposit(&_DurationVaultStrategyStorage.TransactOpts, token, amount)
+}
+
+// Lock is a paid mutator transaction binding the contract method 0xf83d08ba.
+//
+// Solidity: function lock() returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactor) Lock(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.contract.Transact(opts, "lock")
+}
+
+// Lock is a paid mutator transaction binding the contract method 0xf83d08ba.
+//
+// Solidity: function lock() returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) Lock() (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.Lock(&_DurationVaultStrategyStorage.TransactOpts)
+}
+
+// Lock is a paid mutator transaction binding the contract method 0xf83d08ba.
+//
+// Solidity: function lock() returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorSession) Lock() (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.Lock(&_DurationVaultStrategyStorage.TransactOpts)
+}
+
+// MarkMatured is a paid mutator transaction binding the contract method 0x6d8690a9.
+//
+// Solidity: function markMatured() returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactor) MarkMatured(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.contract.Transact(opts, "markMatured")
+}
+
+// MarkMatured is a paid mutator transaction binding the contract method 0x6d8690a9.
+//
+// Solidity: function markMatured() returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) MarkMatured() (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.MarkMatured(&_DurationVaultStrategyStorage.TransactOpts)
+}
+
+// MarkMatured is a paid mutator transaction binding the contract method 0x6d8690a9.
+//
+// Solidity: function markMatured() returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorSession) MarkMatured() (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.MarkMatured(&_DurationVaultStrategyStorage.TransactOpts)
+}
+
+// SetRewardsClaimer is a paid mutator transaction binding the contract method 0xb501d660.
+//
+// Solidity: function setRewardsClaimer(address claimer) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactor) SetRewardsClaimer(opts *bind.TransactOpts, claimer common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.contract.Transact(opts, "setRewardsClaimer", claimer)
+}
+
+// SetRewardsClaimer is a paid mutator transaction binding the contract method 0xb501d660.
+//
+// Solidity: function setRewardsClaimer(address claimer) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) SetRewardsClaimer(claimer common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.SetRewardsClaimer(&_DurationVaultStrategyStorage.TransactOpts, claimer)
+}
+
+// SetRewardsClaimer is a paid mutator transaction binding the contract method 0xb501d660.
+//
+// Solidity: function setRewardsClaimer(address claimer) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorSession) SetRewardsClaimer(claimer common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.SetRewardsClaimer(&_DurationVaultStrategyStorage.TransactOpts, claimer)
+}
+
+// SharesToUnderlying is a paid mutator transaction binding the contract method 0xf3e73875.
+//
+// Solidity: function sharesToUnderlying(uint256 amountShares) returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactor) SharesToUnderlying(opts *bind.TransactOpts, amountShares *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.contract.Transact(opts, "sharesToUnderlying", amountShares)
+}
+
+// SharesToUnderlying is a paid mutator transaction binding the contract method 0xf3e73875.
+//
+// Solidity: function sharesToUnderlying(uint256 amountShares) returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) SharesToUnderlying(amountShares *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.SharesToUnderlying(&_DurationVaultStrategyStorage.TransactOpts, amountShares)
+}
+
+// SharesToUnderlying is a paid mutator transaction binding the contract method 0xf3e73875.
+//
+// Solidity: function sharesToUnderlying(uint256 amountShares) returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorSession) SharesToUnderlying(amountShares *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.SharesToUnderlying(&_DurationVaultStrategyStorage.TransactOpts, amountShares)
+}
+
+// UnderlyingToShares is a paid mutator transaction binding the contract method 0x8c871019.
+//
+// Solidity: function underlyingToShares(uint256 amountUnderlying) returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactor) UnderlyingToShares(opts *bind.TransactOpts, amountUnderlying *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.contract.Transact(opts, "underlyingToShares", amountUnderlying)
+}
+
+// UnderlyingToShares is a paid mutator transaction binding the contract method 0x8c871019.
+//
+// Solidity: function underlyingToShares(uint256 amountUnderlying) returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) UnderlyingToShares(amountUnderlying *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.UnderlyingToShares(&_DurationVaultStrategyStorage.TransactOpts, amountUnderlying)
+}
+
+// UnderlyingToShares is a paid mutator transaction binding the contract method 0x8c871019.
+//
+// Solidity: function underlyingToShares(uint256 amountUnderlying) returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorSession) UnderlyingToShares(amountUnderlying *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.UnderlyingToShares(&_DurationVaultStrategyStorage.TransactOpts, amountUnderlying)
+}
+
+// UpdateDelegationApprover is a paid mutator transaction binding the contract method 0xb4e20f13.
+//
+// Solidity: function updateDelegationApprover(address newDelegationApprover) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactor) UpdateDelegationApprover(opts *bind.TransactOpts, newDelegationApprover common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.contract.Transact(opts, "updateDelegationApprover", newDelegationApprover)
+}
+
+// UpdateDelegationApprover is a paid mutator transaction binding the contract method 0xb4e20f13.
+//
+// Solidity: function updateDelegationApprover(address newDelegationApprover) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) UpdateDelegationApprover(newDelegationApprover common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.UpdateDelegationApprover(&_DurationVaultStrategyStorage.TransactOpts, newDelegationApprover)
+}
+
+// UpdateDelegationApprover is a paid mutator transaction binding the contract method 0xb4e20f13.
+//
+// Solidity: function updateDelegationApprover(address newDelegationApprover) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorSession) UpdateDelegationApprover(newDelegationApprover common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.UpdateDelegationApprover(&_DurationVaultStrategyStorage.TransactOpts, newDelegationApprover)
+}
+
+// UpdateMetadataURI is a paid mutator transaction binding the contract method 0x53fd3e81.
+//
+// Solidity: function updateMetadataURI(string newMetadataURI) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactor) UpdateMetadataURI(opts *bind.TransactOpts, newMetadataURI string) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.contract.Transact(opts, "updateMetadataURI", newMetadataURI)
+}
+
+// UpdateMetadataURI is a paid mutator transaction binding the contract method 0x53fd3e81.
+//
+// Solidity: function updateMetadataURI(string newMetadataURI) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) UpdateMetadataURI(newMetadataURI string) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.UpdateMetadataURI(&_DurationVaultStrategyStorage.TransactOpts, newMetadataURI)
+}
+
+// UpdateMetadataURI is a paid mutator transaction binding the contract method 0x53fd3e81.
+//
+// Solidity: function updateMetadataURI(string newMetadataURI) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorSession) UpdateMetadataURI(newMetadataURI string) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.UpdateMetadataURI(&_DurationVaultStrategyStorage.TransactOpts, newMetadataURI)
+}
+
+// UpdateOperatorMetadataURI is a paid mutator transaction binding the contract method 0x99be81c8.
+//
+// Solidity: function updateOperatorMetadataURI(string newOperatorMetadataURI) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactor) UpdateOperatorMetadataURI(opts *bind.TransactOpts, newOperatorMetadataURI string) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.contract.Transact(opts, "updateOperatorMetadataURI", newOperatorMetadataURI)
+}
+
+// UpdateOperatorMetadataURI is a paid mutator transaction binding the contract method 0x99be81c8.
+//
+// Solidity: function updateOperatorMetadataURI(string newOperatorMetadataURI) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) UpdateOperatorMetadataURI(newOperatorMetadataURI string) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.UpdateOperatorMetadataURI(&_DurationVaultStrategyStorage.TransactOpts, newOperatorMetadataURI)
+}
+
+// UpdateOperatorMetadataURI is a paid mutator transaction binding the contract method 0x99be81c8.
+//
+// Solidity: function updateOperatorMetadataURI(string newOperatorMetadataURI) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorSession) UpdateOperatorMetadataURI(newOperatorMetadataURI string) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.UpdateOperatorMetadataURI(&_DurationVaultStrategyStorage.TransactOpts, newOperatorMetadataURI)
+}
+
+// UpdateTVLLimits is a paid mutator transaction binding the contract method 0xaf6eb2be.
+//
+// Solidity: function updateTVLLimits(uint256 newMaxPerDeposit, uint256 newStakeCap) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactor) UpdateTVLLimits(opts *bind.TransactOpts, newMaxPerDeposit *big.Int, newStakeCap *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.contract.Transact(opts, "updateTVLLimits", newMaxPerDeposit, newStakeCap)
+}
+
+// UpdateTVLLimits is a paid mutator transaction binding the contract method 0xaf6eb2be.
+//
+// Solidity: function updateTVLLimits(uint256 newMaxPerDeposit, uint256 newStakeCap) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) UpdateTVLLimits(newMaxPerDeposit *big.Int, newStakeCap *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.UpdateTVLLimits(&_DurationVaultStrategyStorage.TransactOpts, newMaxPerDeposit, newStakeCap)
+}
+
+// UpdateTVLLimits is a paid mutator transaction binding the contract method 0xaf6eb2be.
+//
+// Solidity: function updateTVLLimits(uint256 newMaxPerDeposit, uint256 newStakeCap) returns()
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorSession) UpdateTVLLimits(newMaxPerDeposit *big.Int, newStakeCap *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.UpdateTVLLimits(&_DurationVaultStrategyStorage.TransactOpts, newMaxPerDeposit, newStakeCap)
+}
+
+// UserUnderlying is a paid mutator transaction binding the contract method 0x8f6a6240.
+//
+// Solidity: function userUnderlying(address user) returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactor) UserUnderlying(opts *bind.TransactOpts, user common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.contract.Transact(opts, "userUnderlying", user)
+}
+
+// UserUnderlying is a paid mutator transaction binding the contract method 0x8f6a6240.
+//
+// Solidity: function userUnderlying(address user) returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) UserUnderlying(user common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.UserUnderlying(&_DurationVaultStrategyStorage.TransactOpts, user)
+}
+
+// UserUnderlying is a paid mutator transaction binding the contract method 0x8f6a6240.
+//
+// Solidity: function userUnderlying(address user) returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorSession) UserUnderlying(user common.Address) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.UserUnderlying(&_DurationVaultStrategyStorage.TransactOpts, user)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0xd9caed12.
+//
+// Solidity: function withdraw(address recipient, address token, uint256 amountShares) returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactor) Withdraw(opts *bind.TransactOpts, recipient common.Address, token common.Address, amountShares *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.contract.Transact(opts, "withdraw", recipient, token, amountShares)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0xd9caed12.
+//
+// Solidity: function withdraw(address recipient, address token, uint256 amountShares) returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageSession) Withdraw(recipient common.Address, token common.Address, amountShares *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.Withdraw(&_DurationVaultStrategyStorage.TransactOpts, recipient, token, amountShares)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0xd9caed12.
+//
+// Solidity: function withdraw(address recipient, address token, uint256 amountShares) returns(uint256)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageTransactorSession) Withdraw(recipient common.Address, token common.Address, amountShares *big.Int) (*types.Transaction, error) {
+ return _DurationVaultStrategyStorage.Contract.Withdraw(&_DurationVaultStrategyStorage.TransactOpts, recipient, token, amountShares)
+}
+
+// DurationVaultStrategyStorageDeallocateAttemptedIterator is returned from FilterDeallocateAttempted and is used to iterate over the raw logs and unpacked data for DeallocateAttempted events raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageDeallocateAttemptedIterator struct {
+ Event *DurationVaultStrategyStorageDeallocateAttempted // 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 *DurationVaultStrategyStorageDeallocateAttemptedIterator) 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(DurationVaultStrategyStorageDeallocateAttempted)
+ 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(DurationVaultStrategyStorageDeallocateAttempted)
+ 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 *DurationVaultStrategyStorageDeallocateAttemptedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyStorageDeallocateAttemptedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyStorageDeallocateAttempted represents a DeallocateAttempted event raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageDeallocateAttempted struct {
+ Success bool
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDeallocateAttempted is a free log retrieval operation binding the contract event 0x72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b.
+//
+// Solidity: event DeallocateAttempted(bool success)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) FilterDeallocateAttempted(opts *bind.FilterOpts) (*DurationVaultStrategyStorageDeallocateAttemptedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.FilterLogs(opts, "DeallocateAttempted")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStorageDeallocateAttemptedIterator{contract: _DurationVaultStrategyStorage.contract, event: "DeallocateAttempted", logs: logs, sub: sub}, nil
+}
+
+// WatchDeallocateAttempted is a free log subscription operation binding the contract event 0x72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b.
+//
+// Solidity: event DeallocateAttempted(bool success)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchDeallocateAttempted(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageDeallocateAttempted) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.WatchLogs(opts, "DeallocateAttempted")
+ 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(DurationVaultStrategyStorageDeallocateAttempted)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "DeallocateAttempted", 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
+}
+
+// ParseDeallocateAttempted is a log parse operation binding the contract event 0x72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b.
+//
+// Solidity: event DeallocateAttempted(bool success)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseDeallocateAttempted(log types.Log) (*DurationVaultStrategyStorageDeallocateAttempted, error) {
+ event := new(DurationVaultStrategyStorageDeallocateAttempted)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "DeallocateAttempted", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyStorageDeregisterAttemptedIterator is returned from FilterDeregisterAttempted and is used to iterate over the raw logs and unpacked data for DeregisterAttempted events raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageDeregisterAttemptedIterator struct {
+ Event *DurationVaultStrategyStorageDeregisterAttempted // 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 *DurationVaultStrategyStorageDeregisterAttemptedIterator) 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(DurationVaultStrategyStorageDeregisterAttempted)
+ 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(DurationVaultStrategyStorageDeregisterAttempted)
+ 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 *DurationVaultStrategyStorageDeregisterAttemptedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyStorageDeregisterAttemptedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyStorageDeregisterAttempted represents a DeregisterAttempted event raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageDeregisterAttempted struct {
+ Success bool
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDeregisterAttempted is a free log retrieval operation binding the contract event 0xd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d168.
+//
+// Solidity: event DeregisterAttempted(bool success)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) FilterDeregisterAttempted(opts *bind.FilterOpts) (*DurationVaultStrategyStorageDeregisterAttemptedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.FilterLogs(opts, "DeregisterAttempted")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStorageDeregisterAttemptedIterator{contract: _DurationVaultStrategyStorage.contract, event: "DeregisterAttempted", logs: logs, sub: sub}, nil
+}
+
+// WatchDeregisterAttempted is a free log subscription operation binding the contract event 0xd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d168.
+//
+// Solidity: event DeregisterAttempted(bool success)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchDeregisterAttempted(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageDeregisterAttempted) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.WatchLogs(opts, "DeregisterAttempted")
+ 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(DurationVaultStrategyStorageDeregisterAttempted)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "DeregisterAttempted", 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
+}
+
+// ParseDeregisterAttempted is a log parse operation binding the contract event 0xd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d168.
+//
+// Solidity: event DeregisterAttempted(bool success)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseDeregisterAttempted(log types.Log) (*DurationVaultStrategyStorageDeregisterAttempted, error) {
+ event := new(DurationVaultStrategyStorageDeregisterAttempted)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "DeregisterAttempted", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyStorageExchangeRateEmittedIterator is returned from FilterExchangeRateEmitted and is used to iterate over the raw logs and unpacked data for ExchangeRateEmitted events raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageExchangeRateEmittedIterator struct {
+ Event *DurationVaultStrategyStorageExchangeRateEmitted // 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 *DurationVaultStrategyStorageExchangeRateEmittedIterator) 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(DurationVaultStrategyStorageExchangeRateEmitted)
+ 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(DurationVaultStrategyStorageExchangeRateEmitted)
+ 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 *DurationVaultStrategyStorageExchangeRateEmittedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyStorageExchangeRateEmittedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyStorageExchangeRateEmitted represents a ExchangeRateEmitted event raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageExchangeRateEmitted struct {
+ Rate *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterExchangeRateEmitted is a free log retrieval operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
+//
+// Solidity: event ExchangeRateEmitted(uint256 rate)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) FilterExchangeRateEmitted(opts *bind.FilterOpts) (*DurationVaultStrategyStorageExchangeRateEmittedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.FilterLogs(opts, "ExchangeRateEmitted")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStorageExchangeRateEmittedIterator{contract: _DurationVaultStrategyStorage.contract, event: "ExchangeRateEmitted", logs: logs, sub: sub}, nil
+}
+
+// WatchExchangeRateEmitted is a free log subscription operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
+//
+// Solidity: event ExchangeRateEmitted(uint256 rate)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchExchangeRateEmitted(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageExchangeRateEmitted) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.WatchLogs(opts, "ExchangeRateEmitted")
+ 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(DurationVaultStrategyStorageExchangeRateEmitted)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "ExchangeRateEmitted", 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
+}
+
+// ParseExchangeRateEmitted is a log parse operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
+//
+// Solidity: event ExchangeRateEmitted(uint256 rate)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseExchangeRateEmitted(log types.Log) (*DurationVaultStrategyStorageExchangeRateEmitted, error) {
+ event := new(DurationVaultStrategyStorageExchangeRateEmitted)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "ExchangeRateEmitted", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyStorageMaxPerDepositUpdatedIterator is returned from FilterMaxPerDepositUpdated and is used to iterate over the raw logs and unpacked data for MaxPerDepositUpdated events raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageMaxPerDepositUpdatedIterator struct {
+ Event *DurationVaultStrategyStorageMaxPerDepositUpdated // 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 *DurationVaultStrategyStorageMaxPerDepositUpdatedIterator) 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(DurationVaultStrategyStorageMaxPerDepositUpdated)
+ 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(DurationVaultStrategyStorageMaxPerDepositUpdated)
+ 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 *DurationVaultStrategyStorageMaxPerDepositUpdatedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyStorageMaxPerDepositUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyStorageMaxPerDepositUpdated represents a MaxPerDepositUpdated event raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageMaxPerDepositUpdated struct {
+ PreviousValue *big.Int
+ NewValue *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterMaxPerDepositUpdated is a free log retrieval operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
+//
+// Solidity: event MaxPerDepositUpdated(uint256 previousValue, uint256 newValue)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) FilterMaxPerDepositUpdated(opts *bind.FilterOpts) (*DurationVaultStrategyStorageMaxPerDepositUpdatedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.FilterLogs(opts, "MaxPerDepositUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStorageMaxPerDepositUpdatedIterator{contract: _DurationVaultStrategyStorage.contract, event: "MaxPerDepositUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchMaxPerDepositUpdated is a free log subscription operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
+//
+// Solidity: event MaxPerDepositUpdated(uint256 previousValue, uint256 newValue)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchMaxPerDepositUpdated(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageMaxPerDepositUpdated) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.WatchLogs(opts, "MaxPerDepositUpdated")
+ 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(DurationVaultStrategyStorageMaxPerDepositUpdated)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "MaxPerDepositUpdated", 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
+}
+
+// ParseMaxPerDepositUpdated is a log parse operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
+//
+// Solidity: event MaxPerDepositUpdated(uint256 previousValue, uint256 newValue)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseMaxPerDepositUpdated(log types.Log) (*DurationVaultStrategyStorageMaxPerDepositUpdated, error) {
+ event := new(DurationVaultStrategyStorageMaxPerDepositUpdated)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "MaxPerDepositUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyStorageMaxTotalDepositsUpdatedIterator is returned from FilterMaxTotalDepositsUpdated and is used to iterate over the raw logs and unpacked data for MaxTotalDepositsUpdated events raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageMaxTotalDepositsUpdatedIterator struct {
+ Event *DurationVaultStrategyStorageMaxTotalDepositsUpdated // 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 *DurationVaultStrategyStorageMaxTotalDepositsUpdatedIterator) 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(DurationVaultStrategyStorageMaxTotalDepositsUpdated)
+ 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(DurationVaultStrategyStorageMaxTotalDepositsUpdated)
+ 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 *DurationVaultStrategyStorageMaxTotalDepositsUpdatedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyStorageMaxTotalDepositsUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyStorageMaxTotalDepositsUpdated represents a MaxTotalDepositsUpdated event raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageMaxTotalDepositsUpdated struct {
+ PreviousValue *big.Int
+ NewValue *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterMaxTotalDepositsUpdated is a free log retrieval operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
+//
+// Solidity: event MaxTotalDepositsUpdated(uint256 previousValue, uint256 newValue)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) FilterMaxTotalDepositsUpdated(opts *bind.FilterOpts) (*DurationVaultStrategyStorageMaxTotalDepositsUpdatedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.FilterLogs(opts, "MaxTotalDepositsUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStorageMaxTotalDepositsUpdatedIterator{contract: _DurationVaultStrategyStorage.contract, event: "MaxTotalDepositsUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchMaxTotalDepositsUpdated is a free log subscription operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
+//
+// Solidity: event MaxTotalDepositsUpdated(uint256 previousValue, uint256 newValue)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchMaxTotalDepositsUpdated(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageMaxTotalDepositsUpdated) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.WatchLogs(opts, "MaxTotalDepositsUpdated")
+ 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(DurationVaultStrategyStorageMaxTotalDepositsUpdated)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "MaxTotalDepositsUpdated", 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
+}
+
+// ParseMaxTotalDepositsUpdated is a log parse operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
+//
+// Solidity: event MaxTotalDepositsUpdated(uint256 previousValue, uint256 newValue)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseMaxTotalDepositsUpdated(log types.Log) (*DurationVaultStrategyStorageMaxTotalDepositsUpdated, error) {
+ event := new(DurationVaultStrategyStorageMaxTotalDepositsUpdated)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "MaxTotalDepositsUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyStorageMetadataURIUpdatedIterator is returned from FilterMetadataURIUpdated and is used to iterate over the raw logs and unpacked data for MetadataURIUpdated events raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageMetadataURIUpdatedIterator struct {
+ Event *DurationVaultStrategyStorageMetadataURIUpdated // 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 *DurationVaultStrategyStorageMetadataURIUpdatedIterator) 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(DurationVaultStrategyStorageMetadataURIUpdated)
+ 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(DurationVaultStrategyStorageMetadataURIUpdated)
+ 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 *DurationVaultStrategyStorageMetadataURIUpdatedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyStorageMetadataURIUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyStorageMetadataURIUpdated represents a MetadataURIUpdated event raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageMetadataURIUpdated struct {
+ NewMetadataURI string
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterMetadataURIUpdated is a free log retrieval operation binding the contract event 0xefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba39.
+//
+// Solidity: event MetadataURIUpdated(string newMetadataURI)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) FilterMetadataURIUpdated(opts *bind.FilterOpts) (*DurationVaultStrategyStorageMetadataURIUpdatedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.FilterLogs(opts, "MetadataURIUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStorageMetadataURIUpdatedIterator{contract: _DurationVaultStrategyStorage.contract, event: "MetadataURIUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchMetadataURIUpdated is a free log subscription operation binding the contract event 0xefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba39.
+//
+// Solidity: event MetadataURIUpdated(string newMetadataURI)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageMetadataURIUpdated) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.WatchLogs(opts, "MetadataURIUpdated")
+ 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(DurationVaultStrategyStorageMetadataURIUpdated)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "MetadataURIUpdated", 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
+}
+
+// ParseMetadataURIUpdated is a log parse operation binding the contract event 0xefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba39.
+//
+// Solidity: event MetadataURIUpdated(string newMetadataURI)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseMetadataURIUpdated(log types.Log) (*DurationVaultStrategyStorageMetadataURIUpdated, error) {
+ event := new(DurationVaultStrategyStorageMetadataURIUpdated)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "MetadataURIUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyStorageStrategyTokenSetIterator is returned from FilterStrategyTokenSet and is used to iterate over the raw logs and unpacked data for StrategyTokenSet events raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageStrategyTokenSetIterator struct {
+ Event *DurationVaultStrategyStorageStrategyTokenSet // 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 *DurationVaultStrategyStorageStrategyTokenSetIterator) 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(DurationVaultStrategyStorageStrategyTokenSet)
+ 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(DurationVaultStrategyStorageStrategyTokenSet)
+ 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 *DurationVaultStrategyStorageStrategyTokenSetIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyStorageStrategyTokenSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyStorageStrategyTokenSet represents a StrategyTokenSet event raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageStrategyTokenSet struct {
+ Token common.Address
+ Decimals uint8
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterStrategyTokenSet is a free log retrieval operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
+//
+// Solidity: event StrategyTokenSet(address token, uint8 decimals)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) FilterStrategyTokenSet(opts *bind.FilterOpts) (*DurationVaultStrategyStorageStrategyTokenSetIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.FilterLogs(opts, "StrategyTokenSet")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStorageStrategyTokenSetIterator{contract: _DurationVaultStrategyStorage.contract, event: "StrategyTokenSet", logs: logs, sub: sub}, nil
+}
+
+// WatchStrategyTokenSet is a free log subscription operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
+//
+// Solidity: event StrategyTokenSet(address token, uint8 decimals)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchStrategyTokenSet(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageStrategyTokenSet) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.WatchLogs(opts, "StrategyTokenSet")
+ 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(DurationVaultStrategyStorageStrategyTokenSet)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "StrategyTokenSet", 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
+}
+
+// ParseStrategyTokenSet is a log parse operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
+//
+// Solidity: event StrategyTokenSet(address token, uint8 decimals)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseStrategyTokenSet(log types.Log) (*DurationVaultStrategyStorageStrategyTokenSet, error) {
+ event := new(DurationVaultStrategyStorageStrategyTokenSet)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "StrategyTokenSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyStorageVaultAdvancedToWithdrawalsIterator is returned from FilterVaultAdvancedToWithdrawals and is used to iterate over the raw logs and unpacked data for VaultAdvancedToWithdrawals events raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageVaultAdvancedToWithdrawalsIterator struct {
+ Event *DurationVaultStrategyStorageVaultAdvancedToWithdrawals // 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 *DurationVaultStrategyStorageVaultAdvancedToWithdrawalsIterator) 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(DurationVaultStrategyStorageVaultAdvancedToWithdrawals)
+ 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(DurationVaultStrategyStorageVaultAdvancedToWithdrawals)
+ 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 *DurationVaultStrategyStorageVaultAdvancedToWithdrawalsIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyStorageVaultAdvancedToWithdrawalsIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyStorageVaultAdvancedToWithdrawals represents a VaultAdvancedToWithdrawals event raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageVaultAdvancedToWithdrawals struct {
+ Arbitrator common.Address
+ MaturedAt uint32
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterVaultAdvancedToWithdrawals is a free log retrieval operation binding the contract event 0x96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb97.
+//
+// Solidity: event VaultAdvancedToWithdrawals(address indexed arbitrator, uint32 maturedAt)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) FilterVaultAdvancedToWithdrawals(opts *bind.FilterOpts, arbitrator []common.Address) (*DurationVaultStrategyStorageVaultAdvancedToWithdrawalsIterator, error) {
+
+ var arbitratorRule []interface{}
+ for _, arbitratorItem := range arbitrator {
+ arbitratorRule = append(arbitratorRule, arbitratorItem)
+ }
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.FilterLogs(opts, "VaultAdvancedToWithdrawals", arbitratorRule)
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStorageVaultAdvancedToWithdrawalsIterator{contract: _DurationVaultStrategyStorage.contract, event: "VaultAdvancedToWithdrawals", logs: logs, sub: sub}, nil
+}
+
+// WatchVaultAdvancedToWithdrawals is a free log subscription operation binding the contract event 0x96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb97.
+//
+// Solidity: event VaultAdvancedToWithdrawals(address indexed arbitrator, uint32 maturedAt)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchVaultAdvancedToWithdrawals(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageVaultAdvancedToWithdrawals, arbitrator []common.Address) (event.Subscription, error) {
+
+ var arbitratorRule []interface{}
+ for _, arbitratorItem := range arbitrator {
+ arbitratorRule = append(arbitratorRule, arbitratorItem)
+ }
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.WatchLogs(opts, "VaultAdvancedToWithdrawals", arbitratorRule)
+ 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(DurationVaultStrategyStorageVaultAdvancedToWithdrawals)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "VaultAdvancedToWithdrawals", 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
+}
+
+// ParseVaultAdvancedToWithdrawals is a log parse operation binding the contract event 0x96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb97.
+//
+// Solidity: event VaultAdvancedToWithdrawals(address indexed arbitrator, uint32 maturedAt)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseVaultAdvancedToWithdrawals(log types.Log) (*DurationVaultStrategyStorageVaultAdvancedToWithdrawals, error) {
+ event := new(DurationVaultStrategyStorageVaultAdvancedToWithdrawals)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "VaultAdvancedToWithdrawals", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyStorageVaultInitializedIterator is returned from FilterVaultInitialized and is used to iterate over the raw logs and unpacked data for VaultInitialized events raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageVaultInitializedIterator struct {
+ Event *DurationVaultStrategyStorageVaultInitialized // 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 *DurationVaultStrategyStorageVaultInitializedIterator) 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(DurationVaultStrategyStorageVaultInitialized)
+ 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(DurationVaultStrategyStorageVaultInitialized)
+ 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 *DurationVaultStrategyStorageVaultInitializedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyStorageVaultInitializedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyStorageVaultInitialized represents a VaultInitialized event raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageVaultInitialized struct {
+ VaultAdmin common.Address
+ Arbitrator common.Address
+ UnderlyingToken common.Address
+ Duration uint32
+ MaxPerDeposit *big.Int
+ StakeCap *big.Int
+ MetadataURI string
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterVaultInitialized is a free log retrieval operation binding the contract event 0xbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e.
+//
+// Solidity: event VaultInitialized(address indexed vaultAdmin, address indexed arbitrator, address indexed underlyingToken, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) FilterVaultInitialized(opts *bind.FilterOpts, vaultAdmin []common.Address, arbitrator []common.Address, underlyingToken []common.Address) (*DurationVaultStrategyStorageVaultInitializedIterator, error) {
+
+ var vaultAdminRule []interface{}
+ for _, vaultAdminItem := range vaultAdmin {
+ vaultAdminRule = append(vaultAdminRule, vaultAdminItem)
+ }
+ var arbitratorRule []interface{}
+ for _, arbitratorItem := range arbitrator {
+ arbitratorRule = append(arbitratorRule, arbitratorItem)
+ }
+ var underlyingTokenRule []interface{}
+ for _, underlyingTokenItem := range underlyingToken {
+ underlyingTokenRule = append(underlyingTokenRule, underlyingTokenItem)
+ }
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.FilterLogs(opts, "VaultInitialized", vaultAdminRule, arbitratorRule, underlyingTokenRule)
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStorageVaultInitializedIterator{contract: _DurationVaultStrategyStorage.contract, event: "VaultInitialized", logs: logs, sub: sub}, nil
+}
+
+// WatchVaultInitialized is a free log subscription operation binding the contract event 0xbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e.
+//
+// Solidity: event VaultInitialized(address indexed vaultAdmin, address indexed arbitrator, address indexed underlyingToken, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchVaultInitialized(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageVaultInitialized, vaultAdmin []common.Address, arbitrator []common.Address, underlyingToken []common.Address) (event.Subscription, error) {
+
+ var vaultAdminRule []interface{}
+ for _, vaultAdminItem := range vaultAdmin {
+ vaultAdminRule = append(vaultAdminRule, vaultAdminItem)
+ }
+ var arbitratorRule []interface{}
+ for _, arbitratorItem := range arbitrator {
+ arbitratorRule = append(arbitratorRule, arbitratorItem)
+ }
+ var underlyingTokenRule []interface{}
+ for _, underlyingTokenItem := range underlyingToken {
+ underlyingTokenRule = append(underlyingTokenRule, underlyingTokenItem)
+ }
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.WatchLogs(opts, "VaultInitialized", vaultAdminRule, arbitratorRule, underlyingTokenRule)
+ 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(DurationVaultStrategyStorageVaultInitialized)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "VaultInitialized", 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
+}
+
+// ParseVaultInitialized is a log parse operation binding the contract event 0xbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e.
+//
+// Solidity: event VaultInitialized(address indexed vaultAdmin, address indexed arbitrator, address indexed underlyingToken, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseVaultInitialized(log types.Log) (*DurationVaultStrategyStorageVaultInitialized, error) {
+ event := new(DurationVaultStrategyStorageVaultInitialized)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "VaultInitialized", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyStorageVaultLockedIterator is returned from FilterVaultLocked and is used to iterate over the raw logs and unpacked data for VaultLocked events raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageVaultLockedIterator struct {
+ Event *DurationVaultStrategyStorageVaultLocked // 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 *DurationVaultStrategyStorageVaultLockedIterator) 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(DurationVaultStrategyStorageVaultLocked)
+ 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(DurationVaultStrategyStorageVaultLocked)
+ 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 *DurationVaultStrategyStorageVaultLockedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyStorageVaultLockedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyStorageVaultLocked represents a VaultLocked event raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageVaultLocked struct {
+ LockedAt uint32
+ UnlockAt uint32
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterVaultLocked is a free log retrieval operation binding the contract event 0x42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4.
+//
+// Solidity: event VaultLocked(uint32 lockedAt, uint32 unlockAt)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) FilterVaultLocked(opts *bind.FilterOpts) (*DurationVaultStrategyStorageVaultLockedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.FilterLogs(opts, "VaultLocked")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStorageVaultLockedIterator{contract: _DurationVaultStrategyStorage.contract, event: "VaultLocked", logs: logs, sub: sub}, nil
+}
+
+// WatchVaultLocked is a free log subscription operation binding the contract event 0x42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4.
+//
+// Solidity: event VaultLocked(uint32 lockedAt, uint32 unlockAt)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchVaultLocked(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageVaultLocked) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.WatchLogs(opts, "VaultLocked")
+ 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(DurationVaultStrategyStorageVaultLocked)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "VaultLocked", 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
+}
+
+// ParseVaultLocked is a log parse operation binding the contract event 0x42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4.
+//
+// Solidity: event VaultLocked(uint32 lockedAt, uint32 unlockAt)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseVaultLocked(log types.Log) (*DurationVaultStrategyStorageVaultLocked, error) {
+ event := new(DurationVaultStrategyStorageVaultLocked)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "VaultLocked", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// DurationVaultStrategyStorageVaultMaturedIterator is returned from FilterVaultMatured and is used to iterate over the raw logs and unpacked data for VaultMatured events raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageVaultMaturedIterator struct {
+ Event *DurationVaultStrategyStorageVaultMatured // 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 *DurationVaultStrategyStorageVaultMaturedIterator) 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(DurationVaultStrategyStorageVaultMatured)
+ 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(DurationVaultStrategyStorageVaultMatured)
+ 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 *DurationVaultStrategyStorageVaultMaturedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DurationVaultStrategyStorageVaultMaturedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// DurationVaultStrategyStorageVaultMatured represents a VaultMatured event raised by the DurationVaultStrategyStorage contract.
+type DurationVaultStrategyStorageVaultMatured struct {
+ MaturedAt uint32
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterVaultMatured is a free log retrieval operation binding the contract event 0xff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f2.
+//
+// Solidity: event VaultMatured(uint32 maturedAt)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) FilterVaultMatured(opts *bind.FilterOpts) (*DurationVaultStrategyStorageVaultMaturedIterator, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.FilterLogs(opts, "VaultMatured")
+ if err != nil {
+ return nil, err
+ }
+ return &DurationVaultStrategyStorageVaultMaturedIterator{contract: _DurationVaultStrategyStorage.contract, event: "VaultMatured", logs: logs, sub: sub}, nil
+}
+
+// WatchVaultMatured is a free log subscription operation binding the contract event 0xff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f2.
+//
+// Solidity: event VaultMatured(uint32 maturedAt)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchVaultMatured(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageVaultMatured) (event.Subscription, error) {
+
+ logs, sub, err := _DurationVaultStrategyStorage.contract.WatchLogs(opts, "VaultMatured")
+ 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(DurationVaultStrategyStorageVaultMatured)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "VaultMatured", 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
+}
+
+// ParseVaultMatured is a log parse operation binding the contract event 0xff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f2.
+//
+// Solidity: event VaultMatured(uint32 maturedAt)
+func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseVaultMatured(log types.Log) (*DurationVaultStrategyStorageVaultMatured, error) {
+ event := new(DurationVaultStrategyStorageVaultMatured)
+ if err := _DurationVaultStrategyStorage.contract.UnpackLog(event, "VaultMatured", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
diff --git a/pkg/bindings/EigenPod/binding.go b/pkg/bindings/EigenPod/binding.go
index 3a57b12a6c..105f672f28 100644
--- a/pkg/bindings/EigenPod/binding.go
+++ b/pkg/bindings/EigenPod/binding.go
@@ -86,7 +86,7 @@ type IEigenPodTypesWithdrawalRequest 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"prevBeaconBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConsolidationRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestConsolidation\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.ConsolidationRequest[]\",\"components\":[{\"name\":\"srcPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"targetPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"requestWithdrawal\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.WithdrawalRequest[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amountGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConsolidationRequested\",\"inputs\":[{\"name\":\"sourcePubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"targetPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExitRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SwitchToCompoundingRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"withdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BeaconTimestampBeforeLatestCheckpoint\",\"inputs\":[]},{\"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\":\"EmptyRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeQueryFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ForkTimestampZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientFunds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidIndex\",\"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\":\"LeavesNotPowerOfTwo\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotEnoughLeaves\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwnerOrProofSubmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PredeployFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalCredentialsNotForEigenPod\",\"inputs\":[]}]",
- Bin: "0x60c060405234801561000f575f5ffd5b5060405161473838038061473883398101604081905261002e91610123565b6001600160a01b03808316608052811660a052610049610050565b505061015b565b5f54610100900460ff16156100bb5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461010a575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610120575f5ffd5b50565b5f5f60408385031215610134575f5ffd5b825161013f8161010c565b60208401519092506101508161010c565b809150509250929050565b60805160a05161455a6101de5f395f818161031e015281816106a801528181610750015281816109fe01528181610dbf01528181610fb9015281816110990152818161159a01528181611641015281816118ca01528181611c1801528181611d4c0152818161222201526130ef01525f818161054e01526116aa015261455a5ff3fe6080604052600436106101b2575f3560e01c80636c0d2d5a116100e7578063c44e30dc11610087578063d06d558711610062578063d06d558714610613578063dda3346c14610632578063ee94d67c14610651578063f074ba6214610670575f5ffd5b8063c44e30dc146105c1578063c4907442146105d5578063c4d66de8146105f4575f5ffd5b806374cdd798116100c257806374cdd7981461053d57806388676cad146105705780639b4e46341461058f578063b522538a146105a2575f5ffd5b80636c0d2d5a146104bd5780636fcd0e53146104dc5780637439841f14610508575f5ffd5b806342ecff2a1161015257806352396a591161012d57806352396a591461042b578063587533571461045f57806358eaee791461047e5780636691954e146104aa575f5ffd5b806342ecff2a146102e75780634665bcda1461030d57806347d2837214610340575f5ffd5b80632340e8d31161018d5780632340e8d31461026f5780633474aa16146102845780633f5fa57a146102b55780633f65cf19146102c8575f5ffd5b8063039157d2146101f05780630b18ff66146102115780631e5155331461024d575f5ffd5b366101ec576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b3480156101fb575f5ffd5b5061020f61020a366004613a01565b61068f565b005b34801561021c575f5ffd5b50603354610230906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610258575f5ffd5b506102616109c4565b604051908152602001610244565b34801561027a575f5ffd5b5061026160395481565b34801561028f575f5ffd5b506034546001600160401b03165b6040516001600160401b039091168152602001610244565b61020f6102c3366004613abc565b6109e5565b3480156102d3575f5ffd5b5061020f6102e2366004613afa565b610d66565b3480156102f2575f5ffd5b50603a5461029d90600160401b90046001600160401b031681565b348015610318575f5ffd5b506102307f000000000000000000000000000000000000000000000000000000000000000081565b34801561034b575f5ffd5b506103d06040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b60405161024491905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b348015610436575f5ffd5b5061029d610445366004613bd1565b603b6020525f90815260409020546001600160401b031681565b34801561046a575f5ffd5b50603e54610230906001600160a01b031681565b348015610489575f5ffd5b5061049d610498366004613c29565b61101e565b6040516102449190613c8f565b61020f6104b8366004613abc565b611080565b3480156104c8575f5ffd5b506102616104d7366004613bd1565b611388565b3480156104e7575f5ffd5b506104fb6104f6366004613c9d565b611496565b6040516102449190613cb4565b348015610513575f5ffd5b5061049d610522366004613c9d565b5f90815260366020526040902054600160c01b900460ff1690565b348015610548575f5ffd5b506102307f000000000000000000000000000000000000000000000000000000000000000081565b34801561057b575f5ffd5b5061020f61058a366004613d14565b611541565b61020f61059d366004613d2f565b611636565b3480156105ad575f5ffd5b506104fb6105bc366004613c29565b6117b4565b3480156105cc575f5ffd5b506102616118a3565b3480156105e0575f5ffd5b5061020f6105ef366004613dc4565b6118bf565b3480156105ff575f5ffd5b5061020f61060e366004613dee565b6119f6565b34801561061e575f5ffd5b5061020f61062d366004613dee565b611b40565b34801561063d575f5ffd5b5061020f61064c366004613ed9565b611bd4565b34801561065c575f5ffd5b50603a5461029d906001600160401b031681565b34801561067b575f5ffd5b5061020f61068a366004613fab565b611d33565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106f5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107199190614012565b156107375760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561079d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c19190614012565b156107df5760405163840a48d560e01b815260040160405180910390fd5b5f6108236107ed858061402d565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061212f92505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561089157610891613c5b565b60028111156108a2576108a2613c5b565b81525050905080604001516001600160401b0316876001600160401b0316116108de576040516337e07ffd60e01b815260040160405180910390fd5b6001816060015160028111156108f6576108f6613c5b565b146109145760405163d49e19a760e01b815260040160405180910390fd5b610957610921868061402d565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061215192505050565b6109745760405163161ce5ed60e31b815260040160405180910390fd5b61098661098088611388565b87612179565b6109b26109928861221e565b873561099e888061402d565b6109ab60208b018b614072565b87516122f5565b6109bb5f612429565b50505050505050565b5f6109e071bbddc7ce488642fb579f8b00f3a5900072516125a9565b905090565b604051635ac86ab760e01b8152600a60048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610a4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a6f9190614012565b15610a8d5760405163840a48d560e01b815260040160405180910390fd5b6033546001600160a01b0316331480610ab05750603e546001600160a01b031633145b610acd5760405163427a777960e01b815260040160405180910390fd5b5f610ad66118a3565b90505f610ae384836140c8565b905080341015610b065760405163356680b760e01b815260040160405180910390fd5b5f610b1182346140df565b90505f5b85811015610d4d5736878783818110610b3057610b306140f2565b9050602002810190610b429190614106565b90505f610b8b610b528380614072565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061262f92505050565b905060015f82815260366020526040902054600160c01b900460ff166002811115610bb857610bb8613c5b565b14610bd65760405163d49e19a760e01b815260040160405180910390fd5b5f610be18380614072565b610bf16040860160208701613bd1565b604051602001610c0393929190614124565b60405160208183030381529060405290505f710961ef480eb55e80d19ad83579a64c0070026001600160a01b03168883604051610c40919061415c565b5f6040518083038185875af1925050503d805f8114610c7a576040519150601f19603f3d011682016040523d82523d5f602084013e610c7f565b606091505b5050905080610ca15760405163fc52d48360e01b815260040160405180910390fd5b610cb16040850160208601613bd1565b6001600160401b03165f03610cef5760405183907f60d8ca014d4765a2b8b389e25714cb1cef83b574222911a01d90c1bd69d2d320905f90a2610d3d565b827f8b2737bb64ab2f2dc09552dfa1c250399e6a42c7ea9f0e1c658f5d65d708ec05610d216040870160208801613bd1565b6040516001600160401b03909116815260200160405180910390a25b505060019092019150610b159050565b508015610d5e57610d5e33826126c0565b505050505050565b6033546001600160a01b0316331480610d895750603e546001600160a01b031633145b610da65760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e0c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e309190614012565b15610e4e5760405163840a48d560e01b815260040160405180910390fd5b8584148015610e5c57508382145b610e79576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610eaf576040516337e07ffd60e01b815260040160405180910390fd5b603a546001600160401b03908116908a1611610ede576040516335e7f6b760e01b815260040160405180910390fd5b610ef0610eea8a611388565b89612179565b5f805b87811015610f8957610f758b8b358b8b85818110610f1357610f136140f2565b9050602002016020810190610f289190614167565b8a8a86818110610f3a57610f3a6140f2565b9050602002810190610f4c9190614072565b8a8a88818110610f5e57610f5e6140f2565b9050602002810190610f70919061402d565b6127d5565b610f7f908361418b565b9150600101610ef3565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610ffc575f5ffd5b505af115801561100e573d5f5f3e3d5ffd5b5050505050505050505050505050565b5f5f61105e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061262f92505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b604051635ac86ab760e01b8152600960048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156110e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110a9190614012565b156111285760405163840a48d560e01b815260040160405180910390fd5b6033546001600160a01b031633148061114b5750603e546001600160a01b031633145b6111685760405163427a777960e01b815260040160405180910390fd5b5f6111716109c4565b90505f61117e84836140c8565b9050803410156111a15760405163356680b760e01b815260040160405180910390fd5b5f6111ac82346140df565b90505f5b85811015610d4d57368787838181106111cb576111cb6140f2565b90506020028101906111dd9190614106565b90505f6111ed610b528380614072565b90505f611200610b526020850185614072565b905060015f82815260366020526040902054600160c01b900460ff16600281111561122d5761122d613c5b565b1461124b5760405163d49e19a760e01b815260040160405180910390fd5b5f6112568480614072565b6112636020870187614072565b604051602001611276949392919061419e565b60405160208183030381529060405290505f71bbddc7ce488642fb579f8b00f3a5900072516001600160a01b031689836040516112b3919061415c565b5f6040518083038185875af1925050503d805f81146112ed576040519150601f19603f3d011682016040523d82523d5f602084013e6112f2565b606091505b50509050806113145760405163fc52d48360e01b815260040160405180910390fd5b82840361134a5760405184907fc97b965b92ae7fd20095fe8eb7b99f81f95f8c4adffb22a19116d8eb2846b016905f90a2611377565b604051839085907f42f9c9db2ca443e9ec62f4588bd0c9b241065c02c2a8001ac164ae1282dc7b94905f90a35b5050600190930192506111b0915050565b5f611396611fff600c6140c8565b6113a96001600160401b038416426140df565b106113c757604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f198184030181529082905261140e9161415c565b5f60405180830381855afa9150503d805f8114611446576040519150601f19603f3d011682016040523d82523d5f602084013e61144b565b606091505b509150915081801561145d57505f8151115b61147a5760405163558ad0a360e01b815260040160405180910390fd5b8080602001905181019061148e91906141bd565b949350505050565b6114bd604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff16600281111561152757611527613c5b565b600281111561153857611538613c5b565b90525092915050565b6033546001600160a01b03163314806115645750603e546001600160a01b031633145b6115815760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156115e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160b9190614012565b156116295760405163840a48d560e01b815260040160405180910390fd5b61163282612429565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461167f57604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec800000146116a85760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec80000087876116eb612cd6565b8888886040518863ffffffff1660e01b815260040161170f9695949392919061422a565b5f604051808303818588803b158015611726575f5ffd5b505af1158015611738573d5f5f3e3d5ffd5b50505050507fa01003766d3cd97cf2ade5429690bf5d206be7fb01ef9d3a0089ecf67bc1121961179c86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061262f92505050565b60405190815260200160405180910390a15050505050565b6117db604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61181c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061262f92505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff16600281111561188857611888613c5b565b600281111561189957611899613c5b565b9052509392505050565b5f6109e0710961ef480eb55e80d19ad83579a64c0070026125a9565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461190857604051633213a66160e21b815260040160405180910390fd5b5f611917633b9aca008361428c565b9050611930633b9aca006001600160401b0383166140c8565b6034549092506001600160401b039081169082161115611963576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906119809084906001600160401b031661429f565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e836040516119df91815260200190565b60405180910390a26119f183836126c0565b505050565b5f54610100900460ff1615808015611a1457505f54600160ff909116105b80611a2d5750303b158015611a2d57505f5460ff166001145b611a955760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611ab6575f805461ff0019166101001790555b6001600160a01b038216611add576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015611632575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b03163314611b6b5760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314611bff5760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611c65573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c899190614012565b15611ca75760405163840a48d560e01b815260040160405180910390fd5b8251845114611cc9576040516343714afd60e01b815260040160405180910390fd5b5f5b8451811015611d2c57611d2483858381518110611cea57611cea6140f2565b6020026020010151878481518110611d0457611d046140f2565b60200260200101516001600160a01b0316612d069092919063ffffffff16565b600101611ccb565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611d99573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dbd9190614012565b15611ddb5760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f819003611e0f57604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b90049091166080820152611e76611e6e8361221e565b825188612d58565b5f805b858110156120d65736878783818110611e9457611e946140f2565b9050602002810190611ea691906142be565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611f1657611f16613c5b565b6002811115611f2757611f27613c5b565b9052509050600181606001516002811115611f4457611f44613c5b565b14611f505750506120ce565b856001600160401b031681604001516001600160401b031610611f745750506120ce565b5f8080611f84848a8f3588612e19565b60208b0180519396509194509250611f9b826142d2565b62ffffff16905250608088018051849190611fb79083906142ef565b6001600160401b0316905250606088018051839190611fd790839061430e565b60070b905250611fe781886142ef565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b83600281111561208b5761208b613c5b565b021790555050604051863591506001600160401b038b16907fe4866335761a51dcaff766448ab0af6064291ee5dc94e68492bb9cd757c1e350905f90a350505050505b600101611e79565b506001600160401b038084165f908152603b6020526040812080548493919291612102918591166142ef565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506109bb82612f2f565b5f815f81518110612142576121426140f2565b60200260200101519050919050565b5f81600381518110612165576121656140f2565b60200260200101515f5f1b14159050919050565b612185600360206140c8565b6121926020830183614072565b9050146121b2576040516313717da960e21b815260040160405180910390fd5b6122016121c26020830183614072565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508692505084359050600361314f565b611632576040516309bde33960e01b815260040160405180910390fd5b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632704351a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561227c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a0919061433d565b9050806001600160401b03165f036122cb576040516341a02cc960e01b815260040160405180910390fd5b806001600160401b0316836001600160401b031611156122ec5760016122ee565b5f5b9392505050565b600884146123165760405163200591bd60e01b815260040160405180910390fd5b5f61232088613184565b90508061232f6028600161418b565b612339919061418b565b6123449060206140c8565b8314612363576040516313717da960e21b815260040160405180910390fd5b5f61239f8787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506131ac92505050565b90505f64ffffffffff84166123b66028600161418b565b600b901b17905061240086868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508d925086915085905061314f565b61241d576040516309bde33960e01b815260040160405180910390fd5b50505050505050505050565b603a54600160401b90046001600160401b0316156124595760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603612487576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b03166124a3633b9aca004761428c565b6124ad919061429f565b90508180156124c357506001600160401b038116155b156124e1576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a001604052806124f642611388565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff000000000000000019909216919091179055905061255a81612f2f565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f5f836001600160a01b03166040515f60405180830381855afa9150503d805f81146125f1576040519150601f19603f3d011682016040523d82523d5f602084013e6125f6565b606091505b5091509150818015612609575080516020145b6126265760405163c90158af60e01b815260040160405180910390fd5b61148e81614358565b5f815160301461265257604051634f88323960e11b815260040160405180910390fd5b6040516002906126689084905f9060200161437b565b60408051601f19818403018152908290526126829161415c565b602060405180830381855afa15801561269d573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061107a91906141bd565b804710156127105760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401611a8c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612759576040519150601f19603f3d011682016040523d82523d5f602084013e61275e565b606091505b50509050806119f15760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401611a8c565b5f5f6128128484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061212f92505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561288057612880613c5b565b600281111561289157612891613c5b565b90525090505f816060015160028111156128ad576128ad613c5b565b146128cb576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b0380166129108686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061347a92505050565b6001600160401b03160361293757604051631958236d60e21b815260040160405180910390fd5b6001600160401b03801661297c8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061349e92505050565b6001600160401b0316146129a357604051632eade63760e01b815260040160405180910390fd5b6129ab612cd6565b6129b490614358565b6129ef8686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506134b592505050565b1480612a4457506129fe6134c9565b612a0790614358565b612a428686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506134b592505050565b145b612a6157604051633772dd5360e11b815260040160405180910390fd5b5f612a9d8686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506134e592505050565b9050612ab6612aab8c61221e565b8b88888c8c8f6122f5565b60398054905f612ac58361439f565b9091555050603a545f90600160401b90046001600160401b031615612afc57603a54600160401b90046001600160401b0316612b09565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115612bde57612bde613c5b565b021790555050603d8054849250601390612c09908490600160981b90046001600160401b03166142ef565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f101790c2993f6a4d962bd17c786126823ba1c4cf04ff4cccb2659d50fb20aee884604051612c5e91815260200190565b60405180910390a1604080518581526001600160401b03838116602083015284168183015290517fcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f9181900360600190a1612cc6633b9aca006001600160401b0384166140c8565b9c9b505050505050505050505050565b604051606090612cf290600160f81b905f9030906020016143b7565b604051602081830303815290604052905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526119f19084906134fc565b5f612d6284613184565b9050612d6f81600361418b565b612d7a9060206140c8565b612d876020840184614072565b905014612da7576040516313717da960e21b815260040160405180910390fd5b6003811b600c17612dfc612dbe6020850185614072565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525088925050863590508461314f565b611d2c576040516309bde33960e01b815260040160405180910390fd5b5f5f5f866020015192505f612e3286895f0151876135cf565b9050836001600160401b0316816001600160401b031614612ea657612e5784826143f5565b60408051873581526001600160401b038a8116602083015284168183015290519194507fcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f919081900360600190a15b6001600160401b0380821660208a0181905290881660408a01525f03612f245760398054905f612ed583614424565b909155505060026060890152612eea83614439565b6040519092508535906001600160401b038916907f5ce0aa04ae51d52da6e680fbe0336d2e2432f7c3dc2d4f3193204c57b9072107905f90a35b509450945094915050565b8051603c556020810151603d805460408401516060850151608086015162ffffff9095166affffffffffffffffffffff19909316831763010000006001600160401b0393841602176fffffffffffffffffffffffffffffffff60581b1916600160581b9183169190910267ffffffffffffffff60981b191617600160981b919094160292909217905515612fc05750565b60808101516034545f91612fdc916001600160401b03166142ef565b90505f82606001518360400151612ff3919061430e565b60408401516034805492935090915f906130179084906001600160401b03166142ef565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061306790633b9aca009085166140c8565b90505f61307c633b9aca00600785900b61445e565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015613132575f5ffd5b505af1158015613144573d5f5f3e3d5ffd5b505050505050505050565b5f8361316e576040516329e7276760e11b815260040160405180910390fd5b8361317a8685856136ad565b1495945050505050565b5f8082600181111561319857613198613c5b565b146131a457600661107a565b600592915050565b5f60018251116131cf5760405163f8ef036760e01b815260040160405180910390fd5b6131d982516137a0565b6131f65760405163f6558f5160e01b815260040160405180910390fd5b5f60028351613205919061428c565b90505f816001600160401b0381111561322057613220613e09565b604051908082528060200260200182016040528015613249578160200160208202803683370190505b5090505f5b828110156133435760028561326383836140c8565b81518110613273576132736140f2565b60200260200101518683600261328991906140c8565b61329490600161418b565b815181106132a4576132a46140f2565b60200260200101516040516020016132c6929190918252602082015260400190565b60408051601f19818403018152908290526132e09161415c565b602060405180830381855afa1580156132fb573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061331e91906141bd565b828281518110613330576133306140f2565b602090810291909101015260010161324e565b505b816001146134575761335860028361428c565b91505f5b828110156134515760028261337183836140c8565b81518110613381576133816140f2565b60200260200101518383600261339791906140c8565b6133a290600161418b565b815181106133b2576133b26140f2565b60200260200101516040516020016133d4929190918252602082015260400190565b60408051601f19818403018152908290526133ee9161415c565b602060405180830381855afa158015613409573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061342c91906141bd565b82828151811061343e5761343e6140f2565b602090810291909101015260010161335c565b50613345565b805f81518110613469576134696140f2565b602002602001015192505050919050565b5f61107a82600581518110613491576134916140f2565b60200260200101516137bf565b5f61107a82600681518110613491576134916140f2565b5f81600181518110612142576121426140f2565b604051606090612cf290600160f91b905f9030906020016143b7565b5f61107a82600281518110613491576134916140f2565b5f613550826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138269092919063ffffffff16565b905080515f14806135705750808060200190518101906135709190614012565b6119f15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611a8c565b5f6135dc6026600161418b565b6135e79060206140c8565b6135f46040840184614072565b905014613614576040516313717da960e21b815260040160405180910390fd5b5f61362060048561448d565b64ffffffffff1690506136796136396040850185614072565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250505060208601358461314f565b613696576040516309bde33960e01b815260040160405180910390fd5b6136a4836020013585613834565b95945050505050565b5f83515f141580156136ca5750602084516136c891906144b6565b155b6136e7576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b855181116137775761370b6002856144b6565b5f0361373d5781515f528086015160205260208260405f60026107d05a03fa613732575f5ffd5b600284049350613765565b808601515f52815160205260208260405f60026107d05a03fa61375e575f5ffd5b6002840493505b61377060208261418b565b90506136f8565b508215613797576040516363df817160e01b815260040160405180910390fd5b51949350505050565b5f811580159061107a57506137b66001836140df565b82161592915050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b606061148e84845f85613860565b5f806138416004846144c9565b61384c9060406144f2565b64ffffffffff16905061148e84821b6137bf565b6060824710156138c15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611a8c565b5f5f866001600160a01b031685876040516138dc919061415c565b5f6040518083038185875af1925050503d805f8114613916576040519150601f19603f3d011682016040523d82523d5f602084013e61391b565b606091505b509150915061392c87838387613937565b979650505050505050565b606083156139a55782515f0361399e576001600160a01b0385163b61399e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611a8c565b508161148e565b61148e83838151156139ba5781518083602001fd5b8060405162461bcd60e51b8152600401611a8c9190614512565b6001600160401b03811681146139e8575f5ffd5b50565b5f604082840312156139fb575f5ffd5b50919050565b5f5f5f60608486031215613a13575f5ffd5b8335613a1e816139d4565b925060208401356001600160401b03811115613a38575f5ffd5b613a44868287016139eb565b92505060408401356001600160401b03811115613a5f575f5ffd5b613a6b868287016139eb565b9150509250925092565b5f5f83601f840112613a85575f5ffd5b5081356001600160401b03811115613a9b575f5ffd5b6020830191508360208260051b8501011115613ab5575f5ffd5b9250929050565b5f5f60208385031215613acd575f5ffd5b82356001600160401b03811115613ae2575f5ffd5b613aee85828601613a75565b90969095509350505050565b5f5f5f5f5f5f5f5f60a0898b031215613b11575f5ffd5b8835613b1c816139d4565b975060208901356001600160401b03811115613b36575f5ffd5b613b428b828c016139eb565b97505060408901356001600160401b03811115613b5d575f5ffd5b613b698b828c01613a75565b90975095505060608901356001600160401b03811115613b87575f5ffd5b613b938b828c01613a75565b90955093505060808901356001600160401b03811115613bb1575f5ffd5b613bbd8b828c01613a75565b999c989b5096995094979396929594505050565b5f60208284031215613be1575f5ffd5b81356122ee816139d4565b5f5f83601f840112613bfc575f5ffd5b5081356001600160401b03811115613c12575f5ffd5b602083019150836020828501011115613ab5575f5ffd5b5f5f60208385031215613c3a575f5ffd5b82356001600160401b03811115613c4f575f5ffd5b613aee85828601613bec565b634e487b7160e01b5f52602160045260245ffd5b60038110613c8b57634e487b7160e01b5f52602160045260245ffd5b9052565b6020810161107a8284613c6f565b5f60208284031215613cad575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b0360408401511660408301526060830151613d006060840182613c6f565b5092915050565b80151581146139e8575f5ffd5b5f60208284031215613d24575f5ffd5b81356122ee81613d07565b5f5f5f5f5f60608688031215613d43575f5ffd5b85356001600160401b03811115613d58575f5ffd5b613d6488828901613bec565b90965094505060208601356001600160401b03811115613d82575f5ffd5b613d8e88828901613bec565b96999598509660400135949350505050565b6001600160a01b03811681146139e8575f5ffd5b8035613dbf81613da0565b919050565b5f5f60408385031215613dd5575f5ffd5b8235613de081613da0565b946020939093013593505050565b5f60208284031215613dfe575f5ffd5b81356122ee81613da0565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613e4557613e45613e09565b604052919050565b5f6001600160401b03821115613e6557613e65613e09565b5060051b60200190565b5f82601f830112613e7e575f5ffd5b8135613e91613e8c82613e4d565b613e1d565b8082825260208201915060208360051b860101925085831115613eb2575f5ffd5b602085015b83811015613ecf578035835260209283019201613eb7565b5095945050505050565b5f5f5f60608486031215613eeb575f5ffd5b83356001600160401b03811115613f00575f5ffd5b8401601f81018613613f10575f5ffd5b8035613f1e613e8c82613e4d565b8082825260208201915060208360051b850101925088831115613f3f575f5ffd5b6020840193505b82841015613f6a578335613f5981613da0565b825260209384019390910190613f46565b955050505060208401356001600160401b03811115613f87575f5ffd5b613f9386828701613e6f565b925050613fa260408501613db4565b90509250925092565b5f5f5f60408486031215613fbd575f5ffd5b83356001600160401b03811115613fd2575f5ffd5b613fde868287016139eb565b93505060208401356001600160401b03811115613ff9575f5ffd5b61400586828701613a75565b9497909650939450505050565b5f60208284031215614022575f5ffd5b81516122ee81613d07565b5f5f8335601e19843603018112614042575f5ffd5b8301803591506001600160401b0382111561405b575f5ffd5b6020019150600581901b3603821315613ab5575f5ffd5b5f5f8335601e19843603018112614087575f5ffd5b8301803591506001600160401b038211156140a0575f5ffd5b602001915036819003821315613ab5575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761107a5761107a6140b4565b8181038181111561107a5761107a6140b4565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e1983360301811261411a575f5ffd5b9190910192915050565b8284823760c09190911b6001600160c01b0319169101908152600801919050565b5f81518060208401855e5f93019283525090919050565b5f6122ee8284614145565b5f60208284031215614177575f5ffd5b813564ffffffffff811681146122ee575f5ffd5b8082018082111561107a5761107a6140b4565b838582375f8482015f8152838582375f93019283525090949350505050565b5f602082840312156141cd575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f61423d60808301888a6141d4565b828103602084015261424f81886141fc565b905082810360408401526142648186886141d4565b915050826060830152979650505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261429a5761429a614278565b500490565b6001600160401b03828116828216039081111561107a5761107a6140b4565b5f8235605e1983360301811261411a575f5ffd5b5f62ffffff8216806142e6576142e66140b4565b5f190192915050565b6001600160401b03818116838216019081111561107a5761107a6140b4565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff198212171561107a5761107a6140b4565b5f6020828403121561434d575f5ffd5b81516122ee816139d4565b805160208083015191908110156139fb575f1960209190910360031b1b16919050565b5f6143868285614145565b6001600160801b03199390931683525050601001919050565b5f600182016143b0576143b06140b4565b5060010190565b6001600160f81b03199390931683526001600160a81b031991909116600183015260601b6bffffffffffffffffffffffff1916600c82015260200190565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff8213171561107a5761107a6140b4565b5f81614432576144326140b4565b505f190190565b5f8160070b677fffffffffffffff198103614456576144566140b4565b5f0392915050565b8082025f8212600160ff1b84141615614479576144796140b4565b818105831482151761107a5761107a6140b4565b5f64ffffffffff8316806144a3576144a3614278565b8064ffffffffff84160491505092915050565b5f826144c4576144c4614278565b500690565b5f64ffffffffff8316806144df576144df614278565b8064ffffffffff84160691505092915050565b64ffffffffff8181168382160290811690818114613d0057613d006140b4565b602081525f6122ee60208301846141fc56fea2646970667358221220a84f22428cb25b584710c1cde5c652669e817ac9b977264e9f674941c3eacf3d64736f6c634300081e0033",
+ Bin: "0x60c060405234801561000f575f5ffd5b5060405161473838038061473883398101604081905261002e91610123565b6001600160a01b03808316608052811660a052610049610050565b505061015b565b5f54610100900460ff16156100bb5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461010a575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610120575f5ffd5b50565b5f5f60408385031215610134575f5ffd5b825161013f8161010c565b60208401519092506101508161010c565b809150509250929050565b60805160a05161455a6101de5f395f818161031e015281816106a801528181610750015281816109fe01528181610dbf01528181610fb9015281816110990152818161159a01528181611641015281816118ca01528181611c1801528181611d4c0152818161222201526130ef01525f818161054e01526116aa015261455a5ff3fe6080604052600436106101b2575f3560e01c80636c0d2d5a116100e7578063c44e30dc11610087578063d06d558711610062578063d06d558714610613578063dda3346c14610632578063ee94d67c14610651578063f074ba6214610670575f5ffd5b8063c44e30dc146105c1578063c4907442146105d5578063c4d66de8146105f4575f5ffd5b806374cdd798116100c257806374cdd7981461053d57806388676cad146105705780639b4e46341461058f578063b522538a146105a2575f5ffd5b80636c0d2d5a146104bd5780636fcd0e53146104dc5780637439841f14610508575f5ffd5b806342ecff2a1161015257806352396a591161012d57806352396a591461042b578063587533571461045f57806358eaee791461047e5780636691954e146104aa575f5ffd5b806342ecff2a146102e75780634665bcda1461030d57806347d2837214610340575f5ffd5b80632340e8d31161018d5780632340e8d31461026f5780633474aa16146102845780633f5fa57a146102b55780633f65cf19146102c8575f5ffd5b8063039157d2146101f05780630b18ff66146102115780631e5155331461024d575f5ffd5b366101ec576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b3480156101fb575f5ffd5b5061020f61020a366004613a01565b61068f565b005b34801561021c575f5ffd5b50603354610230906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610258575f5ffd5b506102616109c4565b604051908152602001610244565b34801561027a575f5ffd5b5061026160395481565b34801561028f575f5ffd5b506034546001600160401b03165b6040516001600160401b039091168152602001610244565b61020f6102c3366004613abc565b6109e5565b3480156102d3575f5ffd5b5061020f6102e2366004613afa565b610d66565b3480156102f2575f5ffd5b50603a5461029d90600160401b90046001600160401b031681565b348015610318575f5ffd5b506102307f000000000000000000000000000000000000000000000000000000000000000081565b34801561034b575f5ffd5b506103d06040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b60405161024491905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b348015610436575f5ffd5b5061029d610445366004613bd1565b603b6020525f90815260409020546001600160401b031681565b34801561046a575f5ffd5b50603e54610230906001600160a01b031681565b348015610489575f5ffd5b5061049d610498366004613c29565b61101e565b6040516102449190613c8f565b61020f6104b8366004613abc565b611080565b3480156104c8575f5ffd5b506102616104d7366004613bd1565b611388565b3480156104e7575f5ffd5b506104fb6104f6366004613c9d565b611496565b6040516102449190613cb4565b348015610513575f5ffd5b5061049d610522366004613c9d565b5f90815260366020526040902054600160c01b900460ff1690565b348015610548575f5ffd5b506102307f000000000000000000000000000000000000000000000000000000000000000081565b34801561057b575f5ffd5b5061020f61058a366004613d14565b611541565b61020f61059d366004613d2f565b611636565b3480156105ad575f5ffd5b506104fb6105bc366004613c29565b6117b4565b3480156105cc575f5ffd5b506102616118a3565b3480156105e0575f5ffd5b5061020f6105ef366004613dc4565b6118bf565b3480156105ff575f5ffd5b5061020f61060e366004613dee565b6119f6565b34801561061e575f5ffd5b5061020f61062d366004613dee565b611b40565b34801561063d575f5ffd5b5061020f61064c366004613ed9565b611bd4565b34801561065c575f5ffd5b50603a5461029d906001600160401b031681565b34801561067b575f5ffd5b5061020f61068a366004613fab565b611d33565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106f5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107199190614012565b156107375760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561079d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c19190614012565b156107df5760405163840a48d560e01b815260040160405180910390fd5b5f6108236107ed858061402d565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061212f92505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561089157610891613c5b565b60028111156108a2576108a2613c5b565b81525050905080604001516001600160401b0316876001600160401b0316116108de576040516337e07ffd60e01b815260040160405180910390fd5b6001816060015160028111156108f6576108f6613c5b565b146109145760405163d49e19a760e01b815260040160405180910390fd5b610957610921868061402d565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061215192505050565b6109745760405163161ce5ed60e31b815260040160405180910390fd5b61098661098088611388565b87612179565b6109b26109928861221e565b873561099e888061402d565b6109ab60208b018b614072565b87516122f5565b6109bb5f612429565b50505050505050565b5f6109e071bbddc7ce488642fb579f8b00f3a5900072516125a9565b905090565b604051635ac86ab760e01b8152600a60048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610a4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a6f9190614012565b15610a8d5760405163840a48d560e01b815260040160405180910390fd5b6033546001600160a01b0316331480610ab05750603e546001600160a01b031633145b610acd5760405163427a777960e01b815260040160405180910390fd5b5f610ad66118a3565b90505f610ae384836140c8565b905080341015610b065760405163356680b760e01b815260040160405180910390fd5b5f610b1182346140df565b90505f5b85811015610d4d5736878783818110610b3057610b306140f2565b9050602002810190610b429190614106565b90505f610b8b610b528380614072565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061262f92505050565b905060015f82815260366020526040902054600160c01b900460ff166002811115610bb857610bb8613c5b565b14610bd65760405163d49e19a760e01b815260040160405180910390fd5b5f610be18380614072565b610bf16040860160208701613bd1565b604051602001610c0393929190614124565b60405160208183030381529060405290505f710961ef480eb55e80d19ad83579a64c0070026001600160a01b03168883604051610c40919061415c565b5f6040518083038185875af1925050503d805f8114610c7a576040519150601f19603f3d011682016040523d82523d5f602084013e610c7f565b606091505b5050905080610ca15760405163fc52d48360e01b815260040160405180910390fd5b610cb16040850160208601613bd1565b6001600160401b03165f03610cef5760405183907f60d8ca014d4765a2b8b389e25714cb1cef83b574222911a01d90c1bd69d2d320905f90a2610d3d565b827f8b2737bb64ab2f2dc09552dfa1c250399e6a42c7ea9f0e1c658f5d65d708ec05610d216040870160208801613bd1565b6040516001600160401b03909116815260200160405180910390a25b505060019092019150610b159050565b508015610d5e57610d5e33826126c0565b505050505050565b6033546001600160a01b0316331480610d895750603e546001600160a01b031633145b610da65760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e0c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e309190614012565b15610e4e5760405163840a48d560e01b815260040160405180910390fd5b8584148015610e5c57508382145b610e79576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610eaf576040516337e07ffd60e01b815260040160405180910390fd5b603a546001600160401b03908116908a1611610ede576040516335e7f6b760e01b815260040160405180910390fd5b610ef0610eea8a611388565b89612179565b5f805b87811015610f8957610f758b8b358b8b85818110610f1357610f136140f2565b9050602002016020810190610f289190614167565b8a8a86818110610f3a57610f3a6140f2565b9050602002810190610f4c9190614072565b8a8a88818110610f5e57610f5e6140f2565b9050602002810190610f70919061402d565b6127d5565b610f7f908361418b565b9150600101610ef3565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610ffc575f5ffd5b505af115801561100e573d5f5f3e3d5ffd5b5050505050505050505050505050565b5f5f61105e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061262f92505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b604051635ac86ab760e01b8152600960048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156110e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110a9190614012565b156111285760405163840a48d560e01b815260040160405180910390fd5b6033546001600160a01b031633148061114b5750603e546001600160a01b031633145b6111685760405163427a777960e01b815260040160405180910390fd5b5f6111716109c4565b90505f61117e84836140c8565b9050803410156111a15760405163356680b760e01b815260040160405180910390fd5b5f6111ac82346140df565b90505f5b85811015610d4d57368787838181106111cb576111cb6140f2565b90506020028101906111dd9190614106565b90505f6111ed610b528380614072565b90505f611200610b526020850185614072565b905060015f82815260366020526040902054600160c01b900460ff16600281111561122d5761122d613c5b565b1461124b5760405163d49e19a760e01b815260040160405180910390fd5b5f6112568480614072565b6112636020870187614072565b604051602001611276949392919061419e565b60405160208183030381529060405290505f71bbddc7ce488642fb579f8b00f3a5900072516001600160a01b031689836040516112b3919061415c565b5f6040518083038185875af1925050503d805f81146112ed576040519150601f19603f3d011682016040523d82523d5f602084013e6112f2565b606091505b50509050806113145760405163fc52d48360e01b815260040160405180910390fd5b82840361134a5760405184907fc97b965b92ae7fd20095fe8eb7b99f81f95f8c4adffb22a19116d8eb2846b016905f90a2611377565b604051839085907f42f9c9db2ca443e9ec62f4588bd0c9b241065c02c2a8001ac164ae1282dc7b94905f90a35b5050600190930192506111b0915050565b5f611396611fff600c6140c8565b6113a96001600160401b038416426140df565b106113c757604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f198184030181529082905261140e9161415c565b5f60405180830381855afa9150503d805f8114611446576040519150601f19603f3d011682016040523d82523d5f602084013e61144b565b606091505b509150915081801561145d57505f8151115b61147a5760405163558ad0a360e01b815260040160405180910390fd5b8080602001905181019061148e91906141bd565b949350505050565b6114bd604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff16600281111561152757611527613c5b565b600281111561153857611538613c5b565b90525092915050565b6033546001600160a01b03163314806115645750603e546001600160a01b031633145b6115815760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156115e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160b9190614012565b156116295760405163840a48d560e01b815260040160405180910390fd5b61163282612429565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461167f57604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec800000146116a85760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec80000087876116eb612cd6565b8888886040518863ffffffff1660e01b815260040161170f9695949392919061422a565b5f604051808303818588803b158015611726575f5ffd5b505af1158015611738573d5f5f3e3d5ffd5b50505050507fa01003766d3cd97cf2ade5429690bf5d206be7fb01ef9d3a0089ecf67bc1121961179c86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061262f92505050565b60405190815260200160405180910390a15050505050565b6117db604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61181c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061262f92505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff16600281111561188857611888613c5b565b600281111561189957611899613c5b565b9052509392505050565b5f6109e0710961ef480eb55e80d19ad83579a64c0070026125a9565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461190857604051633213a66160e21b815260040160405180910390fd5b5f611917633b9aca008361428c565b9050611930633b9aca006001600160401b0383166140c8565b6034549092506001600160401b039081169082161115611963576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906119809084906001600160401b031661429f565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e836040516119df91815260200190565b60405180910390a26119f183836126c0565b505050565b5f54610100900460ff1615808015611a1457505f54600160ff909116105b80611a2d5750303b158015611a2d57505f5460ff166001145b611a955760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611ab6575f805461ff0019166101001790555b6001600160a01b038216611add576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015611632575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b03163314611b6b5760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314611bff5760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611c65573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c899190614012565b15611ca75760405163840a48d560e01b815260040160405180910390fd5b8251845114611cc9576040516343714afd60e01b815260040160405180910390fd5b5f5b8451811015611d2c57611d2483858381518110611cea57611cea6140f2565b6020026020010151878481518110611d0457611d046140f2565b60200260200101516001600160a01b0316612d069092919063ffffffff16565b600101611ccb565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611d99573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dbd9190614012565b15611ddb5760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f819003611e0f57604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b90049091166080820152611e76611e6e8361221e565b825188612d58565b5f805b858110156120d65736878783818110611e9457611e946140f2565b9050602002810190611ea691906142be565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611f1657611f16613c5b565b6002811115611f2757611f27613c5b565b9052509050600181606001516002811115611f4457611f44613c5b565b14611f505750506120ce565b856001600160401b031681604001516001600160401b031610611f745750506120ce565b5f8080611f84848a8f3588612e19565b60208b0180519396509194509250611f9b826142d2565b62ffffff16905250608088018051849190611fb79083906142ef565b6001600160401b0316905250606088018051839190611fd790839061430e565b60070b905250611fe781886142ef565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b83600281111561208b5761208b613c5b565b021790555050604051863591506001600160401b038b16907fe4866335761a51dcaff766448ab0af6064291ee5dc94e68492bb9cd757c1e350905f90a350505050505b600101611e79565b506001600160401b038084165f908152603b6020526040812080548493919291612102918591166142ef565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506109bb82612f2f565b5f815f81518110612142576121426140f2565b60200260200101519050919050565b5f81600381518110612165576121656140f2565b60200260200101515f5f1b14159050919050565b612185600360206140c8565b6121926020830183614072565b9050146121b2576040516313717da960e21b815260040160405180910390fd5b6122016121c26020830183614072565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508692505084359050600361314f565b611632576040516309bde33960e01b815260040160405180910390fd5b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632704351a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561227c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a0919061433d565b9050806001600160401b03165f036122cb576040516341a02cc960e01b815260040160405180910390fd5b806001600160401b0316836001600160401b031611156122ec5760016122ee565b5f5b9392505050565b600884146123165760405163200591bd60e01b815260040160405180910390fd5b5f61232088613184565b90508061232f6028600161418b565b612339919061418b565b6123449060206140c8565b8314612363576040516313717da960e21b815260040160405180910390fd5b5f61239f8787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506131ac92505050565b90505f64ffffffffff84166123b66028600161418b565b600b901b17905061240086868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508d925086915085905061314f565b61241d576040516309bde33960e01b815260040160405180910390fd5b50505050505050505050565b603a54600160401b90046001600160401b0316156124595760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603612487576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b03166124a3633b9aca004761428c565b6124ad919061429f565b90508180156124c357506001600160401b038116155b156124e1576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a001604052806124f642611388565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff000000000000000019909216919091179055905061255a81612f2f565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f5f836001600160a01b03166040515f60405180830381855afa9150503d805f81146125f1576040519150601f19603f3d011682016040523d82523d5f602084013e6125f6565b606091505b5091509150818015612609575080516020145b6126265760405163c90158af60e01b815260040160405180910390fd5b61148e81614358565b5f815160301461265257604051634f88323960e11b815260040160405180910390fd5b6040516002906126689084905f9060200161437b565b60408051601f19818403018152908290526126829161415c565b602060405180830381855afa15801561269d573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061107a91906141bd565b804710156127105760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401611a8c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612759576040519150601f19603f3d011682016040523d82523d5f602084013e61275e565b606091505b50509050806119f15760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401611a8c565b5f5f6128128484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061212f92505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561288057612880613c5b565b600281111561289157612891613c5b565b90525090505f816060015160028111156128ad576128ad613c5b565b146128cb576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b0380166129108686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061347a92505050565b6001600160401b03160361293757604051631958236d60e21b815260040160405180910390fd5b6001600160401b03801661297c8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061349e92505050565b6001600160401b0316146129a357604051632eade63760e01b815260040160405180910390fd5b6129ab612cd6565b6129b490614358565b6129ef8686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506134b592505050565b1480612a4457506129fe6134c9565b612a0790614358565b612a428686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506134b592505050565b145b612a6157604051633772dd5360e11b815260040160405180910390fd5b5f612a9d8686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506134e592505050565b9050612ab6612aab8c61221e565b8b88888c8c8f6122f5565b60398054905f612ac58361439f565b9091555050603a545f90600160401b90046001600160401b031615612afc57603a54600160401b90046001600160401b0316612b09565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115612bde57612bde613c5b565b021790555050603d8054849250601390612c09908490600160981b90046001600160401b03166142ef565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f101790c2993f6a4d962bd17c786126823ba1c4cf04ff4cccb2659d50fb20aee884604051612c5e91815260200190565b60405180910390a1604080518581526001600160401b03838116602083015284168183015290517fcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f9181900360600190a1612cc6633b9aca006001600160401b0384166140c8565b9c9b505050505050505050505050565b604051606090612cf290600160f81b905f9030906020016143b7565b604051602081830303815290604052905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526119f19084906134fc565b5f612d6284613184565b9050612d6f81600361418b565b612d7a9060206140c8565b612d876020840184614072565b905014612da7576040516313717da960e21b815260040160405180910390fd5b6003811b600c17612dfc612dbe6020850185614072565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525088925050863590508461314f565b611d2c576040516309bde33960e01b815260040160405180910390fd5b5f5f5f866020015192505f612e3286895f0151876135cf565b9050836001600160401b0316816001600160401b031614612ea657612e5784826143f5565b60408051873581526001600160401b038a8116602083015284168183015290519194507fcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f919081900360600190a15b6001600160401b0380821660208a0181905290881660408a01525f03612f245760398054905f612ed583614424565b909155505060026060890152612eea83614439565b6040519092508535906001600160401b038916907f5ce0aa04ae51d52da6e680fbe0336d2e2432f7c3dc2d4f3193204c57b9072107905f90a35b509450945094915050565b8051603c556020810151603d805460408401516060850151608086015162ffffff9095166affffffffffffffffffffff19909316831763010000006001600160401b0393841602176fffffffffffffffffffffffffffffffff60581b1916600160581b9183169190910267ffffffffffffffff60981b191617600160981b919094160292909217905515612fc05750565b60808101516034545f91612fdc916001600160401b03166142ef565b90505f82606001518360400151612ff3919061430e565b60408401516034805492935090915f906130179084906001600160401b03166142ef565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061306790633b9aca009085166140c8565b90505f61307c633b9aca00600785900b61445e565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015613132575f5ffd5b505af1158015613144573d5f5f3e3d5ffd5b505050505050505050565b5f8361316e576040516329e7276760e11b815260040160405180910390fd5b8361317a8685856136ad565b1495945050505050565b5f8082600181111561319857613198613c5b565b146131a457600661107a565b600592915050565b5f60018251116131cf5760405163f8ef036760e01b815260040160405180910390fd5b6131d982516137a0565b6131f65760405163f6558f5160e01b815260040160405180910390fd5b5f60028351613205919061428c565b90505f816001600160401b0381111561322057613220613e09565b604051908082528060200260200182016040528015613249578160200160208202803683370190505b5090505f5b828110156133435760028561326383836140c8565b81518110613273576132736140f2565b60200260200101518683600261328991906140c8565b61329490600161418b565b815181106132a4576132a46140f2565b60200260200101516040516020016132c6929190918252602082015260400190565b60408051601f19818403018152908290526132e09161415c565b602060405180830381855afa1580156132fb573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061331e91906141bd565b828281518110613330576133306140f2565b602090810291909101015260010161324e565b505b816001146134575761335860028361428c565b91505f5b828110156134515760028261337183836140c8565b81518110613381576133816140f2565b60200260200101518383600261339791906140c8565b6133a290600161418b565b815181106133b2576133b26140f2565b60200260200101516040516020016133d4929190918252602082015260400190565b60408051601f19818403018152908290526133ee9161415c565b602060405180830381855afa158015613409573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061342c91906141bd565b82828151811061343e5761343e6140f2565b602090810291909101015260010161335c565b50613345565b805f81518110613469576134696140f2565b602002602001015192505050919050565b5f61107a82600581518110613491576134916140f2565b60200260200101516137bf565b5f61107a82600681518110613491576134916140f2565b5f81600181518110612142576121426140f2565b604051606090612cf290600160f91b905f9030906020016143b7565b5f61107a82600281518110613491576134916140f2565b5f613550826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138269092919063ffffffff16565b905080515f14806135705750808060200190518101906135709190614012565b6119f15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611a8c565b5f6135dc6026600161418b565b6135e79060206140c8565b6135f46040840184614072565b905014613614576040516313717da960e21b815260040160405180910390fd5b5f61362060048561448d565b64ffffffffff1690506136796136396040850185614072565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250505060208601358461314f565b613696576040516309bde33960e01b815260040160405180910390fd5b6136a4836020013585613834565b95945050505050565b5f83515f141580156136ca5750602084516136c891906144b6565b155b6136e7576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b855181116137775761370b6002856144b6565b5f0361373d5781515f528086015160205260208260405f60026107d05a03fa613732575f5ffd5b600284049350613765565b808601515f52815160205260208260405f60026107d05a03fa61375e575f5ffd5b6002840493505b61377060208261418b565b90506136f8565b508215613797576040516363df817160e01b815260040160405180910390fd5b51949350505050565b5f811580159061107a57506137b66001836140df565b82161592915050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b606061148e84845f85613860565b5f806138416004846144c9565b61384c9060406144f2565b64ffffffffff16905061148e84821b6137bf565b6060824710156138c15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611a8c565b5f5f866001600160a01b031685876040516138dc919061415c565b5f6040518083038185875af1925050503d805f8114613916576040519150601f19603f3d011682016040523d82523d5f602084013e61391b565b606091505b509150915061392c87838387613937565b979650505050505050565b606083156139a55782515f0361399e576001600160a01b0385163b61399e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611a8c565b508161148e565b61148e83838151156139ba5781518083602001fd5b8060405162461bcd60e51b8152600401611a8c9190614512565b6001600160401b03811681146139e8575f5ffd5b50565b5f604082840312156139fb575f5ffd5b50919050565b5f5f5f60608486031215613a13575f5ffd5b8335613a1e816139d4565b925060208401356001600160401b03811115613a38575f5ffd5b613a44868287016139eb565b92505060408401356001600160401b03811115613a5f575f5ffd5b613a6b868287016139eb565b9150509250925092565b5f5f83601f840112613a85575f5ffd5b5081356001600160401b03811115613a9b575f5ffd5b6020830191508360208260051b8501011115613ab5575f5ffd5b9250929050565b5f5f60208385031215613acd575f5ffd5b82356001600160401b03811115613ae2575f5ffd5b613aee85828601613a75565b90969095509350505050565b5f5f5f5f5f5f5f5f60a0898b031215613b11575f5ffd5b8835613b1c816139d4565b975060208901356001600160401b03811115613b36575f5ffd5b613b428b828c016139eb565b97505060408901356001600160401b03811115613b5d575f5ffd5b613b698b828c01613a75565b90975095505060608901356001600160401b03811115613b87575f5ffd5b613b938b828c01613a75565b90955093505060808901356001600160401b03811115613bb1575f5ffd5b613bbd8b828c01613a75565b999c989b5096995094979396929594505050565b5f60208284031215613be1575f5ffd5b81356122ee816139d4565b5f5f83601f840112613bfc575f5ffd5b5081356001600160401b03811115613c12575f5ffd5b602083019150836020828501011115613ab5575f5ffd5b5f5f60208385031215613c3a575f5ffd5b82356001600160401b03811115613c4f575f5ffd5b613aee85828601613bec565b634e487b7160e01b5f52602160045260245ffd5b60038110613c8b57634e487b7160e01b5f52602160045260245ffd5b9052565b6020810161107a8284613c6f565b5f60208284031215613cad575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b0360408401511660408301526060830151613d006060840182613c6f565b5092915050565b80151581146139e8575f5ffd5b5f60208284031215613d24575f5ffd5b81356122ee81613d07565b5f5f5f5f5f60608688031215613d43575f5ffd5b85356001600160401b03811115613d58575f5ffd5b613d6488828901613bec565b90965094505060208601356001600160401b03811115613d82575f5ffd5b613d8e88828901613bec565b96999598509660400135949350505050565b6001600160a01b03811681146139e8575f5ffd5b8035613dbf81613da0565b919050565b5f5f60408385031215613dd5575f5ffd5b8235613de081613da0565b946020939093013593505050565b5f60208284031215613dfe575f5ffd5b81356122ee81613da0565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613e4557613e45613e09565b604052919050565b5f6001600160401b03821115613e6557613e65613e09565b5060051b60200190565b5f82601f830112613e7e575f5ffd5b8135613e91613e8c82613e4d565b613e1d565b8082825260208201915060208360051b860101925085831115613eb2575f5ffd5b602085015b83811015613ecf578035835260209283019201613eb7565b5095945050505050565b5f5f5f60608486031215613eeb575f5ffd5b83356001600160401b03811115613f00575f5ffd5b8401601f81018613613f10575f5ffd5b8035613f1e613e8c82613e4d565b8082825260208201915060208360051b850101925088831115613f3f575f5ffd5b6020840193505b82841015613f6a578335613f5981613da0565b825260209384019390910190613f46565b955050505060208401356001600160401b03811115613f87575f5ffd5b613f9386828701613e6f565b925050613fa260408501613db4565b90509250925092565b5f5f5f60408486031215613fbd575f5ffd5b83356001600160401b03811115613fd2575f5ffd5b613fde868287016139eb565b93505060208401356001600160401b03811115613ff9575f5ffd5b61400586828701613a75565b9497909650939450505050565b5f60208284031215614022575f5ffd5b81516122ee81613d07565b5f5f8335601e19843603018112614042575f5ffd5b8301803591506001600160401b0382111561405b575f5ffd5b6020019150600581901b3603821315613ab5575f5ffd5b5f5f8335601e19843603018112614087575f5ffd5b8301803591506001600160401b038211156140a0575f5ffd5b602001915036819003821315613ab5575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761107a5761107a6140b4565b8181038181111561107a5761107a6140b4565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e1983360301811261411a575f5ffd5b9190910192915050565b8284823760c09190911b6001600160c01b0319169101908152600801919050565b5f81518060208401855e5f93019283525090919050565b5f6122ee8284614145565b5f60208284031215614177575f5ffd5b813564ffffffffff811681146122ee575f5ffd5b8082018082111561107a5761107a6140b4565b838582375f8482015f8152838582375f93019283525090949350505050565b5f602082840312156141cd575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f61423d60808301888a6141d4565b828103602084015261424f81886141fc565b905082810360408401526142648186886141d4565b915050826060830152979650505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261429a5761429a614278565b500490565b6001600160401b03828116828216039081111561107a5761107a6140b4565b5f8235605e1983360301811261411a575f5ffd5b5f62ffffff8216806142e6576142e66140b4565b5f190192915050565b6001600160401b03818116838216019081111561107a5761107a6140b4565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff198212171561107a5761107a6140b4565b5f6020828403121561434d575f5ffd5b81516122ee816139d4565b805160208083015191908110156139fb575f1960209190910360031b1b16919050565b5f6143868285614145565b6001600160801b03199390931683525050601001919050565b5f600182016143b0576143b06140b4565b5060010190565b6001600160f81b03199390931683526001600160a81b031991909116600183015260601b6bffffffffffffffffffffffff1916600c82015260200190565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff8213171561107a5761107a6140b4565b5f81614432576144326140b4565b505f190190565b5f8160070b677fffffffffffffff198103614456576144566140b4565b5f0392915050565b8082025f8212600160ff1b84141615614479576144796140b4565b818105831482151761107a5761107a6140b4565b5f64ffffffffff8316806144a3576144a3614278565b8064ffffffffff84160491505092915050565b5f826144c4576144c4614278565b500690565b5f64ffffffffff8316806144df576144df614278565b8064ffffffffff84160691505092915050565b64ffffffffff8181168382160290811690818114613d0057613d006140b4565b602081525f6122ee60208301846141fc56fea264697066735822122022ac72dc71b8b3783a93600a5ae563424e60edb4cc798a4c6154766a9ff893d164736f6c634300081e0033",
}
// EigenPodABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/EigenPodManager/binding.go b/pkg/bindings/EigenPodManager/binding.go
index 96e7f1efd1..7abd5ad47f 100644
--- a/pkg/bindings/EigenPodManager/binding.go
+++ b/pkg/bindings/EigenPodManager/binding.go
@@ -38,7 +38,7 @@ type OperatorSet struct {
// 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\":\"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\":\"increaseBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"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\":\"pectraForkTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"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\":\"proofTimestampSetter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"setPectraForkTimestamp\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProofTimestampSetter\",\"inputs\":[{\"name\":\"newProofTimestampSetter\",\"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\":\"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\":\"PectraForkTimestampSet\",\"inputs\":[{\"name\":\"newPectraForkTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"ProofTimestampSetterSet\",\"inputs\":[{\"name\":\"newProofTimestampSetter\",\"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\":\"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\":\"OnlyProofTimestampSetter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]}]",
- Bin: "0x610100604052348015610010575f5ffd5b50604051612ca0380380612ca083398101604081905261002f9161015c565b838383836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e052610080610089565b505050506101b8565b5f54610100900460ff16156100f45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610143575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610159575f5ffd5b50565b5f5f5f5f6080858703121561016f575f5ffd5b845161017a81610145565b602086015190945061018b81610145565b604086015190935061019c81610145565b60608601519092506101ad81610145565b939692955090935050565b60805160a05160c05160e051612a6f6102315f395f81816105e00152818161074f015281816109a801528181610a4e01528181610ba901528181610f260152610fdb01525f81816102800152818161107101526117ce01525f61041f01525f81816104660152818161143901526119eb0152612a6f5ff3fe6080604052600436106101e6575f3560e01c8063886f119511610108578063a6a509be1161009d578063f2fde38b1161006d578063f2fde38b14610602578063f5d4fed314610621578063f6848d2414610636578063fabc1cbc1461066f578063fe243a171461068e575f5ffd5b8063a6a509be14610570578063cd6dc68714610585578063d48e8894146105a4578063ea4d3c9b146105cf575f5ffd5b80639ba06275116100d85780639ba06275146104df578063a1ca780b14610513578063a38406a314610532578063a3d75e0914610551575f5ffd5b8063886f1195146104555780638da5cb5b146104885780639104c319146104a55780639b4e4634146104cc575f5ffd5b8063595edbcb1161017e578063715018a61161014e578063715018a6146103db578063724af423146103ef57806374cdd7981461040e57806384d8106214610441575f5ffd5b8063595edbcb146103405780635a26fbf41461035f5780635ac86ab71461037e5780635c975abb146103bd575f5ffd5b80632eae418c116101b95780632eae418c146102ba5780633fb99ca5146102d957806350ff7225146102f8578063595c6a671461032c575f5ffd5b80630d1e9de1146101ea578063136439dd1461020b5780632704351a1461022a578063292b7b2b1461026f575b5f5ffd5b3480156101f5575f5ffd5b50610209610204366004611cbe565b6106ad565b005b348015610216575f5ffd5b50610209610225366004611cd9565b61070a565b348015610235575f5ffd5b50609f5461025190600160a01b900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561027a575f5ffd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610266565b3480156102c5575f5ffd5b506102096102d4366004611cf0565b610744565b3480156102e4575f5ffd5b506102096102f3366004611d3e565b61099d565b348015610303575f5ffd5b50610317610312366004611d88565b610a41565b60408051928352602083019190915201610266565b348015610337575f5ffd5b50610209610af1565b34801561034b575f5ffd5b50609f546102a2906001600160a01b031681565b34801561036a575f5ffd5b50610209610379366004611dc6565b610b05565b348015610389575f5ffd5b506103ad610398366004611ded565b606654600160ff9092169190911b9081161490565b6040519015158152602001610266565b3480156103c8575f5ffd5b506066545b604051908152602001610266565b3480156103e6575f5ffd5b50610209610b8c565b3480156103fa575f5ffd5b506103cd610409366004611d88565b610b9d565b348015610419575f5ffd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b34801561044c575f5ffd5b506102a2610ce2565b348015610460575f5ffd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b348015610493575f5ffd5b506033546001600160a01b03166102a2565b3480156104b0575f5ffd5b506102a273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102096104da366004611e4b565b610d45565b3480156104ea575f5ffd5b506102a26104f9366004611cbe565b60986020525f90815260409020546001600160a01b031681565b34801561051e575f5ffd5b5061020961052d366004611ebe565b610df6565b34801561053d575f5ffd5b506102a261054c366004611cbe565b611017565b34801561055c575f5ffd5b5061025161056b366004611cbe565b6110e8565b34801561057b575f5ffd5b506103cd60995481565b348015610590575f5ffd5b5061020961059f366004611ef0565b611148565b3480156105af575f5ffd5b506103cd6105be366004611cbe565b609b6020525f908152604090205481565b3480156105da575f5ffd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b34801561060d575f5ffd5b5061020961061c366004611cbe565b611264565b34801561062c575f5ffd5b506103cd609e5481565b348015610641575f5ffd5b506103ad610650366004611cbe565b6001600160a01b039081165f9081526098602052604090205416151590565b34801561067a575f5ffd5b50610209610689366004611cd9565b6112dd565b348015610699575f5ffd5b506103cd6106a8366004611f1a565b61134a565b6106b56113ca565b609f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f7025c71a9fe60d709e71b377dc5f7c72c3e1d8539f8022574254e736ceca01e5906020015b60405180910390a150565b610712611424565b60665481811681146107375760405163c61dca5d60e01b815260040160405180910390fd5b610740826114c7565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461078d5760405163f739589b60e01b815260040160405180910390fd5b610795611504565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146107d257604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0384166107f9576040516339b190bb60e11b815260040160405180910390fd5b5f81136108195760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b6020526040812054908290821215610913575f61084583611f65565b90505f8185111561086357508061085c8186611f7f565b9250610869565b505f9150835b5f6108748286611f92565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906108c49085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161090791815260200190565b60405180910390a25050505b801561098b576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015b5f604051808303815f87803b158015610974575f5ffd5b505af1158015610986573d5f5f3e3d5ffd5b505050505b5050610997600160c955565b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109e65760405163f739589b60e01b815260040160405180910390fd5b6109ee611504565b80609e5f8282546109ff9190611fb9565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a1610997600160c955565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8c5760405163f739589b60e01b815260040160405180910390fd5b610a94611504565b6001600160a01b03841673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610ad157604051632711b74d60e11b815260040160405180910390fd5b610adb858461155d565b91509150610ae9600160c955565b935093915050565b610af9611424565b610b035f196114c7565b565b609f546001600160a01b03163314610b3057604051630986113760e41b815260040160405180910390fd5b609f805467ffffffffffffffff60a01b1916600160a01b67ffffffffffffffff8416908102919091179091556040519081527f1bc8f042a52db3a437620dea4548f2031fb2a16dd8d3b0b854295528dd2cdd33906020016106ff565b610b946113ca565b610b035f6116a4565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610be75760405163f739589b60e01b815260040160405180910390fd5b610bef611504565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610c2c57604051632711b74d60e11b815260040160405180910390fd5b5f610c36836116f5565b6001600160a01b0386165f908152609b6020526040902054610c589190611fcc565b90505f811215610c7b5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0385165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610cc79084815260200190565b60405180910390a29050610cdb600160c955565b9392505050565b5f5f610ced8161175e565b610cf5611504565b335f908152609860205260409020546001600160a01b031615610d2b5760405163031a852160e21b815260040160405180910390fd5b5f610d34611789565b925050610d41600160c955565b5090565b5f610d4f8161175e565b610d57611504565b335f908152609860205260409020546001600160a01b031680610d7f57610d7c611789565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610db5908b908b908b908b908b9060040161201a565b5f604051808303818588803b158015610dcc575f5ffd5b505af1158015610dde573d5f5f3e3d5ffd5b505050505050610dee600160c955565b505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610e31576040516312e16d7160e11b815260040160405180910390fd5b610e39611504565b6001600160a01b038416610e60576040516339b190bb60e11b815260040160405180910390fd5b610e6e633b9aca0083612067565b15610e8c576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610ec557604051634b692bcf60e01b815260040160405180910390fd5b5f831315610f86575f5f610ed9878661155d565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610f69575f5ffd5b505af1158015610f7b573d5f5f3e3d5ffd5b50505050505061100c565b5f83121561100c575f610fa28686610f9d87611f65565b6118e4565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce9060640161095d565b50610997600160c955565b6001600160a01b038082165f90815260986020526040812054909116806110e2576110df836001600160a01b03165f1b60405180610940016040528061090e815260200161212c61090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526110c4929160200161209d565b604051602081830303815290604052805190602001206119dd565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff16928201929092529061113e57670de0b6b3a7640000610cdb565b6020015192915050565b5f54610100900460ff161580801561116657505f54600160ff909116105b8061117f5750303b15801561117f57505f5460ff166001145b6111e75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611208575f805461ff0019166101001790555b611211836116a4565b61121a826114c7565b801561125f575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b61126c6113ca565b6001600160a01b0381166112d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016111de565b6112da816116a4565b50565b6112e56119e9565b6066548019821981161461130c5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461138857604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054126113c2576001600160a01b0383165f908152609b60205260409020546110df565b505f92915050565b6033546001600160a01b03163314610b035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111de565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611486573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114aa91906120b9565b610b0357604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b600260c954036115565760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016111de565b600260c955565b5f806001600160a01b038416611586576040516339b190bb60e11b815260040160405180910390fd5b5f8312156115a75760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916115cb8383611f92565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c61939061161b9086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161165e91815260200190565b60405180910390a25f811361167b575f5f9450945050505061169d565b5f821215611690575f9450925061169d915050565b50925083915061169d9050565b9250929050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6001600160ff1b03821115610d415760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016111de565b606654600160ff83161b908116036112da5760405163840a48d560e01b815260040160405180910390fd5b5f60995f8154611798906120d8565b9091555060408051610940810190915261090e8082525f91611835918391339161212c6020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f1981840301815290829052611821929160200161209d565b604051602081830303815290604052611a9a565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b158015611876575f5ffd5b505af1158015611888573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b5f806118f08385611f7f565b90505f6118fc866110e8565b90505f61191467ffffffffffffffff83168488611b9c565b90505f61192182846120f0565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f6110df838330611c81565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a45573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a699190612110565b6001600160a01b0316336001600160a01b031614610b035760405163794821ff60e01b815260040160405180910390fd5b5f83471015611aeb5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016111de565b81515f03611b3b5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016111de565b8282516020840186f590506001600160a01b038116610cdb5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016111de565b5f80805f19858709858702925082811083820303915050805f03611bd357838281611bc957611bc9612053565b0492505050610cdb565b808411611c1a5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016111de565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6001600160a01b03811681146112da575f5ffd5b5f60208284031215611cce575f5ffd5b8135610cdb81611caa565b5f60208284031215611ce9575f5ffd5b5035919050565b5f5f5f5f60808587031215611d03575f5ffd5b8435611d0e81611caa565b93506020850135611d1e81611caa565b92506040850135611d2e81611caa565b9396929550929360600135925050565b5f5f5f5f84860360a0811215611d52575f5ffd5b6040811215611d5f575f5ffd5b50849350604084013592506060840135611d7881611caa565b9396929550929360800135925050565b5f5f5f60608486031215611d9a575f5ffd5b8335611da581611caa565b92506020840135611db581611caa565b929592945050506040919091013590565b5f60208284031215611dd6575f5ffd5b813567ffffffffffffffff81168114610cdb575f5ffd5b5f60208284031215611dfd575f5ffd5b813560ff81168114610cdb575f5ffd5b5f5f83601f840112611e1d575f5ffd5b50813567ffffffffffffffff811115611e34575f5ffd5b60208301915083602082850101111561169d575f5ffd5b5f5f5f5f5f60608688031215611e5f575f5ffd5b853567ffffffffffffffff811115611e75575f5ffd5b611e8188828901611e0d565b909650945050602086013567ffffffffffffffff811115611ea0575f5ffd5b611eac88828901611e0d565b96999598509660400135949350505050565b5f5f5f60608486031215611ed0575f5ffd5b8335611edb81611caa565b95602085013595506040909401359392505050565b5f5f60408385031215611f01575f5ffd5b8235611f0c81611caa565b946020939093013593505050565b5f5f60408385031215611f2b575f5ffd5b8235611f3681611caa565b91506020830135611f4681611caa565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611f7957611f79611f51565b505f0390565b818103818111156110e2576110e2611f51565b8082018281125f831280158216821582161715611fb157611fb1611f51565b505092915050565b808201808211156110e2576110e2611f51565b8181035f831280158383131683831282161715611feb57611feb611f51565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f61202d606083018789611ff2565b8281036020840152612040818688611ff2565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261208157634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f6120b16120ab8386612086565b84612086565b949350505050565b5f602082840312156120c9575f5ffd5b81518015158114610cdb575f5ffd5b5f600182016120e9576120e9611f51565b5060010190565b67ffffffffffffffff82811682821603908111156110e2576110e2611f51565b5f60208284031215612120575f5ffd5b8151610cdb81611caa56fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220e1155e72c14b352a97517f96d3fa99ba87da7598c13b62b3e4283a843fa5ca7764736f6c634300081e0033",
+ Bin: "0x610100604052348015610010575f5ffd5b50604051612ca0380380612ca083398101604081905261002f9161015c565b838383836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e052610080610089565b505050506101b8565b5f54610100900460ff16156100f45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610143575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610159575f5ffd5b50565b5f5f5f5f6080858703121561016f575f5ffd5b845161017a81610145565b602086015190945061018b81610145565b604086015190935061019c81610145565b60608601519092506101ad81610145565b939692955090935050565b60805160a05160c05160e051612a6f6102315f395f81816105e00152818161074f015281816109a801528181610a4e01528181610ba901528181610f260152610fdb01525f81816102800152818161107101526117ce01525f61041f01525f81816104660152818161143901526119eb0152612a6f5ff3fe6080604052600436106101e6575f3560e01c8063886f119511610108578063a6a509be1161009d578063f2fde38b1161006d578063f2fde38b14610602578063f5d4fed314610621578063f6848d2414610636578063fabc1cbc1461066f578063fe243a171461068e575f5ffd5b8063a6a509be14610570578063cd6dc68714610585578063d48e8894146105a4578063ea4d3c9b146105cf575f5ffd5b80639ba06275116100d85780639ba06275146104df578063a1ca780b14610513578063a38406a314610532578063a3d75e0914610551575f5ffd5b8063886f1195146104555780638da5cb5b146104885780639104c319146104a55780639b4e4634146104cc575f5ffd5b8063595edbcb1161017e578063715018a61161014e578063715018a6146103db578063724af423146103ef57806374cdd7981461040e57806384d8106214610441575f5ffd5b8063595edbcb146103405780635a26fbf41461035f5780635ac86ab71461037e5780635c975abb146103bd575f5ffd5b80632eae418c116101b95780632eae418c146102ba5780633fb99ca5146102d957806350ff7225146102f8578063595c6a671461032c575f5ffd5b80630d1e9de1146101ea578063136439dd1461020b5780632704351a1461022a578063292b7b2b1461026f575b5f5ffd5b3480156101f5575f5ffd5b50610209610204366004611cbe565b6106ad565b005b348015610216575f5ffd5b50610209610225366004611cd9565b61070a565b348015610235575f5ffd5b50609f5461025190600160a01b900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561027a575f5ffd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610266565b3480156102c5575f5ffd5b506102096102d4366004611cf0565b610744565b3480156102e4575f5ffd5b506102096102f3366004611d3e565b61099d565b348015610303575f5ffd5b50610317610312366004611d88565b610a41565b60408051928352602083019190915201610266565b348015610337575f5ffd5b50610209610af1565b34801561034b575f5ffd5b50609f546102a2906001600160a01b031681565b34801561036a575f5ffd5b50610209610379366004611dc6565b610b05565b348015610389575f5ffd5b506103ad610398366004611ded565b606654600160ff9092169190911b9081161490565b6040519015158152602001610266565b3480156103c8575f5ffd5b506066545b604051908152602001610266565b3480156103e6575f5ffd5b50610209610b8c565b3480156103fa575f5ffd5b506103cd610409366004611d88565b610b9d565b348015610419575f5ffd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b34801561044c575f5ffd5b506102a2610ce2565b348015610460575f5ffd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b348015610493575f5ffd5b506033546001600160a01b03166102a2565b3480156104b0575f5ffd5b506102a273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102096104da366004611e4b565b610d45565b3480156104ea575f5ffd5b506102a26104f9366004611cbe565b60986020525f90815260409020546001600160a01b031681565b34801561051e575f5ffd5b5061020961052d366004611ebe565b610df6565b34801561053d575f5ffd5b506102a261054c366004611cbe565b611017565b34801561055c575f5ffd5b5061025161056b366004611cbe565b6110e8565b34801561057b575f5ffd5b506103cd60995481565b348015610590575f5ffd5b5061020961059f366004611ef0565b611148565b3480156105af575f5ffd5b506103cd6105be366004611cbe565b609b6020525f908152604090205481565b3480156105da575f5ffd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b34801561060d575f5ffd5b5061020961061c366004611cbe565b611264565b34801561062c575f5ffd5b506103cd609e5481565b348015610641575f5ffd5b506103ad610650366004611cbe565b6001600160a01b039081165f9081526098602052604090205416151590565b34801561067a575f5ffd5b50610209610689366004611cd9565b6112dd565b348015610699575f5ffd5b506103cd6106a8366004611f1a565b61134a565b6106b56113ca565b609f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f7025c71a9fe60d709e71b377dc5f7c72c3e1d8539f8022574254e736ceca01e5906020015b60405180910390a150565b610712611424565b60665481811681146107375760405163c61dca5d60e01b815260040160405180910390fd5b610740826114c7565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461078d5760405163f739589b60e01b815260040160405180910390fd5b610795611504565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146107d257604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0384166107f9576040516339b190bb60e11b815260040160405180910390fd5b5f81136108195760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b6020526040812054908290821215610913575f61084583611f65565b90505f8185111561086357508061085c8186611f7f565b9250610869565b505f9150835b5f6108748286611f92565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906108c49085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161090791815260200190565b60405180910390a25050505b801561098b576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015b5f604051808303815f87803b158015610974575f5ffd5b505af1158015610986573d5f5f3e3d5ffd5b505050505b5050610997600160c955565b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109e65760405163f739589b60e01b815260040160405180910390fd5b6109ee611504565b80609e5f8282546109ff9190611fb9565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a1610997600160c955565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8c5760405163f739589b60e01b815260040160405180910390fd5b610a94611504565b6001600160a01b03841673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610ad157604051632711b74d60e11b815260040160405180910390fd5b610adb858461155d565b91509150610ae9600160c955565b935093915050565b610af9611424565b610b035f196114c7565b565b609f546001600160a01b03163314610b3057604051630986113760e41b815260040160405180910390fd5b609f805467ffffffffffffffff60a01b1916600160a01b67ffffffffffffffff8416908102919091179091556040519081527f1bc8f042a52db3a437620dea4548f2031fb2a16dd8d3b0b854295528dd2cdd33906020016106ff565b610b946113ca565b610b035f6116a4565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610be75760405163f739589b60e01b815260040160405180910390fd5b610bef611504565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610c2c57604051632711b74d60e11b815260040160405180910390fd5b5f610c36836116f5565b6001600160a01b0386165f908152609b6020526040902054610c589190611fcc565b90505f811215610c7b5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0385165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610cc79084815260200190565b60405180910390a29050610cdb600160c955565b9392505050565b5f5f610ced8161175e565b610cf5611504565b335f908152609860205260409020546001600160a01b031615610d2b5760405163031a852160e21b815260040160405180910390fd5b5f610d34611789565b925050610d41600160c955565b5090565b5f610d4f8161175e565b610d57611504565b335f908152609860205260409020546001600160a01b031680610d7f57610d7c611789565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610db5908b908b908b908b908b9060040161201a565b5f604051808303818588803b158015610dcc575f5ffd5b505af1158015610dde573d5f5f3e3d5ffd5b505050505050610dee600160c955565b505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610e31576040516312e16d7160e11b815260040160405180910390fd5b610e39611504565b6001600160a01b038416610e60576040516339b190bb60e11b815260040160405180910390fd5b610e6e633b9aca0083612067565b15610e8c576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610ec557604051634b692bcf60e01b815260040160405180910390fd5b5f831315610f86575f5f610ed9878661155d565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610f69575f5ffd5b505af1158015610f7b573d5f5f3e3d5ffd5b50505050505061100c565b5f83121561100c575f610fa28686610f9d87611f65565b6118e4565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce9060640161095d565b50610997600160c955565b6001600160a01b038082165f90815260986020526040812054909116806110e2576110df836001600160a01b03165f1b60405180610940016040528061090e815260200161212c61090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526110c4929160200161209d565b604051602081830303815290604052805190602001206119dd565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff16928201929092529061113e57670de0b6b3a7640000610cdb565b6020015192915050565b5f54610100900460ff161580801561116657505f54600160ff909116105b8061117f5750303b15801561117f57505f5460ff166001145b6111e75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611208575f805461ff0019166101001790555b611211836116a4565b61121a826114c7565b801561125f575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b61126c6113ca565b6001600160a01b0381166112d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016111de565b6112da816116a4565b50565b6112e56119e9565b6066548019821981161461130c5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461138857604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054126113c2576001600160a01b0383165f908152609b60205260409020546110df565b505f92915050565b6033546001600160a01b03163314610b035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111de565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611486573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114aa91906120b9565b610b0357604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b600260c954036115565760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016111de565b600260c955565b5f806001600160a01b038416611586576040516339b190bb60e11b815260040160405180910390fd5b5f8312156115a75760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916115cb8383611f92565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c61939061161b9086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161165e91815260200190565b60405180910390a25f811361167b575f5f9450945050505061169d565b5f821215611690575f9450925061169d915050565b50925083915061169d9050565b9250929050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6001600160ff1b03821115610d415760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016111de565b606654600160ff83161b908116036112da5760405163840a48d560e01b815260040160405180910390fd5b5f60995f8154611798906120d8565b9091555060408051610940810190915261090e8082525f91611835918391339161212c6020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f1981840301815290829052611821929160200161209d565b604051602081830303815290604052611a9a565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b158015611876575f5ffd5b505af1158015611888573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b5f806118f08385611f7f565b90505f6118fc866110e8565b90505f61191467ffffffffffffffff83168488611b9c565b90505f61192182846120f0565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f6110df838330611c81565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a45573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a699190612110565b6001600160a01b0316336001600160a01b031614610b035760405163794821ff60e01b815260040160405180910390fd5b5f83471015611aeb5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016111de565b81515f03611b3b5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016111de565b8282516020840186f590506001600160a01b038116610cdb5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016111de565b5f80805f19858709858702925082811083820303915050805f03611bd357838281611bc957611bc9612053565b0492505050610cdb565b808411611c1a5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016111de565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6001600160a01b03811681146112da575f5ffd5b5f60208284031215611cce575f5ffd5b8135610cdb81611caa565b5f60208284031215611ce9575f5ffd5b5035919050565b5f5f5f5f60808587031215611d03575f5ffd5b8435611d0e81611caa565b93506020850135611d1e81611caa565b92506040850135611d2e81611caa565b9396929550929360600135925050565b5f5f5f5f84860360a0811215611d52575f5ffd5b6040811215611d5f575f5ffd5b50849350604084013592506060840135611d7881611caa565b9396929550929360800135925050565b5f5f5f60608486031215611d9a575f5ffd5b8335611da581611caa565b92506020840135611db581611caa565b929592945050506040919091013590565b5f60208284031215611dd6575f5ffd5b813567ffffffffffffffff81168114610cdb575f5ffd5b5f60208284031215611dfd575f5ffd5b813560ff81168114610cdb575f5ffd5b5f5f83601f840112611e1d575f5ffd5b50813567ffffffffffffffff811115611e34575f5ffd5b60208301915083602082850101111561169d575f5ffd5b5f5f5f5f5f60608688031215611e5f575f5ffd5b853567ffffffffffffffff811115611e75575f5ffd5b611e8188828901611e0d565b909650945050602086013567ffffffffffffffff811115611ea0575f5ffd5b611eac88828901611e0d565b96999598509660400135949350505050565b5f5f5f60608486031215611ed0575f5ffd5b8335611edb81611caa565b95602085013595506040909401359392505050565b5f5f60408385031215611f01575f5ffd5b8235611f0c81611caa565b946020939093013593505050565b5f5f60408385031215611f2b575f5ffd5b8235611f3681611caa565b91506020830135611f4681611caa565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611f7957611f79611f51565b505f0390565b818103818111156110e2576110e2611f51565b8082018281125f831280158216821582161715611fb157611fb1611f51565b505092915050565b808201808211156110e2576110e2611f51565b8181035f831280158383131683831282161715611feb57611feb611f51565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f61202d606083018789611ff2565b8281036020840152612040818688611ff2565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261208157634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f6120b16120ab8386612086565b84612086565b949350505050565b5f602082840312156120c9575f5ffd5b81518015158114610cdb575f5ffd5b5f600182016120e9576120e9611f51565b5060010190565b67ffffffffffffffff82811682821603908111156110e2576110e2611f51565b5f60208284031215612120575f5ffd5b8151610cdb81611caa56fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220fbc50b663db261986708ae3cc41f798b18bab8ae5eff153cd10fa1145a54d59764736f6c634300081e0033",
}
// EigenPodManagerABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/EigenStrategy/binding.go b/pkg/bindings/EigenStrategy/binding.go
index c297ff2165..2e8b4e7029 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\":[{\"name\":\"amountOut\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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: "0x60c060405234801561000f575f5ffd5b5060405161160138038061160183398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516114366101cb5f395f818161018b015281816103860152818161071e01526107a001525f81816102540152818161094e0152610e4f01526114365ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c8063886f1195116100b4578063ce7c2ac211610079578063ce7c2ac2146102c4578063d9caed12146102d7578063e3dae51c146102ea578063f3e73875146102fd578063fabc1cbc14610310578063fdc371ce14610323575f5ffd5b8063886f11951461024f5780638c871019146102765780638f6a624014610289578063ab5921e11461029c578063c4d66de8146102b1575f5ffd5b8063485cc95511610105578063485cc955146101d7578063553ca5f8146101ea578063595c6a67146101fd5780635ac86ab7146102055780635c975abb146102345780637a8b26371461023c575f5ffd5b8063136439dd146101415780632495a5991461015657806339b70e38146101865780633a98ef39146101ad57806347e7ef24146101c4575b5f5ffd5b61015461014f366004611129565b610336565b005b603254610169906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b660335481565b60405190815260200161017d565b6101b66101d2366004611154565b610370565b6101546101e536600461117e565b61049f565b6101b66101f83660046111b5565b61058a565b61015461059d565b6102246102133660046111e5565b6001805460ff9092161b9081161490565b604051901515815260200161017d565b6001546101b6565b6101b661024a366004611129565b6105b1565b6101697f000000000000000000000000000000000000000000000000000000000000000081565b6101b6610284366004611129565b6105fa565b6101b66102973660046111b5565b610604565b6102a4610611565b60405161017d9190611200565b6101546102bf3660046111b5565b610631565b6101b66102d23660046111b5565b6106f7565b6101b66102e5366004611235565b610789565b6101b66102f8366004611129565b61088b565b6101b661030b366004611129565b6108c2565b61015461031e366004611129565b6108cc565b606454610169906001600160a01b031681565b61033e610939565b60015481811681146103635760405163c61dca5d60e01b815260040160405180910390fd5b61036c826109dc565b5050565b5f5f61037b81610a19565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103c4576040516348da714f60e01b815260040160405180910390fd5b6103ce8484610a4f565b6033545f6103de6103e883611287565b90505f6103e86103ec610b08565b6103f69190611287565b90505f610403878361129a565b90508061041084896112ad565b61041a91906112c4565b9550855f0361043c57604051630c392ed360e11b815260040160405180910390fd5b6104468685611287565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561047b57604051632f14e8a360e11b815260040160405180910390fd5b610494826103e860335461048f9190611287565b610b77565b505050505092915050565b5f54610100900460ff16158080156104bd57505f54600160ff909116105b806104d65750303b1580156104d657505f5460ff166001145b6104fb5760405162461bcd60e51b81526004016104f2906112e3565b60405180910390fd5b5f805460ff19166001179055801561051c575f805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b03851617905561054082610bc3565b8015610585575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f61059761024a836106f7565b92915050565b6105a5610939565b6105af5f196109dc565b565b5f5f6103e86033546105c39190611287565b90505f6103e86105d1610b08565b6105db9190611287565b9050816105e885836112ad565b6105f291906112c4565b949350505050565b5f6105978261088b565b5f61059761030b836106f7565b60606040518060800160405280604d81526020016113b4604d9139905090565b5f54610100900460ff161580801561064f57505f54600160ff909116105b806106685750303b15801561066857505f5460ff166001145b6106845760405162461bcd60e51b81526004016104f2906112e3565b5f805460ff1916600117905580156106a5575f805461ff0019166101001790555b6106ae82610bc3565b801561036c575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa158015610765573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105979190611331565b5f600161079581610a19565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107de576040516348da714f60e01b815260040160405180910390fd5b6107e9858585610d0e565b6033548084111561080d57604051630b469df360e41b815260040160405180910390fd5b5f61081a6103e883611287565b90505f6103e8610828610b08565b6108329190611287565b90508161083f87836112ad565b61084991906112c4565b9450610855868461129a565b603355610875610865868361129a565b6103e860335461048f9190611287565b610880888887610d54565b505050509392505050565b5f5f6103e860335461089d9190611287565b90505f6103e86108ab610b08565b6108b59190611287565b9050806105e883866112ad565b5f610597826105b1565b6108d4610e4d565b600154801982198116146108fb5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561099b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109bf9190611348565b6105af57604051631d77d47760e21b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b610a2e816001805460ff9092161b9081161490565b15610a4c5760405163840a48d560e01b815260040160405180910390fd5b50565b6032546001600160a01b0383811691161480610a7857506064546001600160a01b038381169116145b610a9557604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b039081169083160361036c57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e906024015f604051808303815f87803b158015610aee575f5ffd5b505af1158015610b00573d5f5f3e3d5ffd5b505050505050565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b4e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b729190611331565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610bab84670de0b6b3a76400006112ad565b610bb591906112c4565b6040519081526020016106eb565b5f54610100900460ff16610c2d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016104f2565b603280546001600160a01b0319166001600160a01b038316179055610c515f6109dc565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cc3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce79190611367565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b0383811691161480610d3757506064546001600160a01b038381169116145b61058557604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610e395760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303815f875af1158015610dba573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dde9190611348565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb0906024015f604051808303815f87803b158015610e22575f5ffd5b505af1158015610e34573d5f5f3e3d5ffd5b505050505b6105856001600160a01b0383168483610efe565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ecd9190611382565b6001600160a01b0316336001600160a01b0316146105af5760405163794821ff60e01b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610585928692915f91610f8d91851690849061100c565b905080515f1480610fad575080806020019051810190610fad9190611348565b6105855760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104f2565b60606105f284845f85855f5f866001600160a01b03168587604051611031919061139d565b5f6040518083038185875af1925050503d805f811461106b576040519150601f19603f3d011682016040523d82523d5f602084013e611070565b606091505b50915091506110818783838761108c565b979650505050505050565b606083156110fa5782515f036110f3576001600160a01b0385163b6110f35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104f2565b50816105f2565b6105f2838381511561110f5781518083602001fd5b8060405162461bcd60e51b81526004016104f29190611200565b5f60208284031215611139575f5ffd5b5035919050565b6001600160a01b0381168114610a4c575f5ffd5b5f5f60408385031215611165575f5ffd5b823561117081611140565b946020939093013593505050565b5f5f6040838503121561118f575f5ffd5b823561119a81611140565b915060208301356111aa81611140565b809150509250929050565b5f602082840312156111c5575f5ffd5b81356111d081611140565b9392505050565b60ff81168114610a4c575f5ffd5b5f602082840312156111f5575f5ffd5b81356111d0816111d7565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611247575f5ffd5b833561125281611140565b9250602084013561126281611140565b929592945050506040919091013590565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561059757610597611273565b8181038181111561059757610597611273565b808202811582820484141761059757610597611273565b5f826112de57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f60208284031215611341575f5ffd5b5051919050565b5f60208284031215611358575f5ffd5b815180151581146111d0575f5ffd5b5f60208284031215611377575f5ffd5b81516111d0816111d7565b5f60208284031215611392575f5ffd5b81516111d081611140565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220c3d1b68ce4a04509d1f163fd5261b6db458d026188f783832bc2aebf5bf4eb1e64736f6c634300081e0033",
+ 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\":\"beforeAddShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beforeRemoveShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"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\":\"_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\":[{\"name\":\"amountOut\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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: "0x60c060405234801561000f575f5ffd5b5060405161167a38038061167a83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516114a86101d25f395f81816101b40152818161036a015281816103f801528181610790015261081201525f818161027d015281816109c00152610ec101526114a85ff3fe608060405234801561000f575f5ffd5b5060043610610153575f3560e01c80637a8b2637116100bf578063ce7c2ac211610079578063ce7c2ac2146102ed578063d9caed1214610300578063e3dae51c14610313578063f3e7387514610326578063fabc1cbc14610339578063fdc371ce1461034c575f5ffd5b80637a8b263714610265578063886f1195146102785780638c8710191461029f5780638f6a6240146102b2578063ab5921e1146102c5578063c4d66de8146102da575f5ffd5b8063485cc95511610110578063485cc95514610200578063553ca5f814610213578063595c6a67146102265780635ac86ab71461022e5780635c975abb1461025d57806373e3c28014610157575f5ffd5b806303e3e6eb14610157578063136439dd1461016c5780632495a5991461017f57806339b70e38146101af5780633a98ef39146101d657806347e7ef24146101ed575b5f5ffd5b61016a6101653660046111af565b61035f565b005b61016a61017a3660046111d9565b6103ac565b603254610192906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101927f000000000000000000000000000000000000000000000000000000000000000081565b6101df60335481565b6040519081526020016101a6565b6101df6101fb3660046111af565b6103e2565b61016a61020e3660046111f0565b610511565b6101df610221366004611227565b6105fc565b61016a61060f565b61024d61023c366004611257565b6001805460ff9092161b9081161490565b60405190151581526020016101a6565b6001546101df565b6101df6102733660046111d9565b610623565b6101927f000000000000000000000000000000000000000000000000000000000000000081565b6101df6102ad3660046111d9565b61066c565b6101df6102c0366004611227565b610676565b6102cd610683565b6040516101a69190611272565b61016a6102e8366004611227565b6106a3565b6101df6102fb366004611227565b610769565b6101df61030e3660046112a7565b6107fb565b6101df6103213660046111d9565b6108fd565b6101df6103343660046111d9565b610934565b61016a6103473660046111d9565b61093e565b606454610192906001600160a01b031681565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103a8576040516348da714f60e01b815260040160405180910390fd5b5050565b6103b46109ab565b60015481811681146103d95760405163c61dca5d60e01b815260040160405180910390fd5b6103a882610a4e565b5f5f6103ed81610a8b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610436576040516348da714f60e01b815260040160405180910390fd5b6104408484610ac1565b6033545f6104506103e8836112f9565b90505f6103e861045e610b7a565b61046891906112f9565b90505f610475878361130c565b905080610482848961131f565b61048c9190611336565b9550855f036104ae57604051630c392ed360e11b815260040160405180910390fd5b6104b886856112f9565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156104ed57604051632f14e8a360e11b815260040160405180910390fd5b610506826103e860335461050191906112f9565b610be9565b505050505092915050565b5f54610100900460ff161580801561052f57505f54600160ff909116105b806105485750303b15801561054857505f5460ff166001145b61056d5760405162461bcd60e51b815260040161056490611355565b60405180910390fd5b5f805460ff19166001179055801561058e575f805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0385161790556105b282610c35565b80156105f7575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b5f61060961027383610769565b92915050565b6106176109ab565b6106215f19610a4e565b565b5f5f6103e860335461063591906112f9565b90505f6103e8610643610b7a565b61064d91906112f9565b90508161065a858361131f565b6106649190611336565b949350505050565b5f610609826108fd565b5f61060961033483610769565b60606040518060800160405280604d8152602001611426604d9139905090565b5f54610100900460ff16158080156106c157505f54600160ff909116105b806106da5750303b1580156106da57505f5460ff166001145b6106f65760405162461bcd60e51b815260040161056490611355565b5f805460ff191660011790558015610717575f805461ff0019166101001790555b61072082610c35565b80156103a8575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156107d7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060991906113a3565b5f600161080781610a8b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610850576040516348da714f60e01b815260040160405180910390fd5b61085b858585610d80565b6033548084111561087f57604051630b469df360e41b815260040160405180910390fd5b5f61088c6103e8836112f9565b90505f6103e861089a610b7a565b6108a491906112f9565b9050816108b1878361131f565b6108bb9190611336565b94506108c7868461130c565b6033556108e76108d7868361130c565b6103e860335461050191906112f9565b6108f2888887610dc6565b505050509392505050565b5f5f6103e860335461090f91906112f9565b90505f6103e861091d610b7a565b61092791906112f9565b90508061065a838661131f565b5f61060982610623565b610946610ebf565b6001548019821981161461096d5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a0d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3191906113ba565b61062157604051631d77d47760e21b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b610aa0816001805460ff9092161b9081161490565b15610abe5760405163840a48d560e01b815260040160405180910390fd5b50565b6032546001600160a01b0383811691161480610aea57506064546001600160a01b038381169116145b610b0757604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b03908116908316036103a857606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e906024015f604051808303815f87803b158015610b60575f5ffd5b505af1158015610b72573d5f5f3e3d5ffd5b505050505050565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610bc0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be491906113a3565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610c1d84670de0b6b3a764000061131f565b610c279190611336565b60405190815260200161075d565b5f54610100900460ff16610c9f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610564565b603280546001600160a01b0319166001600160a01b038316179055610cc35f610a4e565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5991906113d9565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b0383811691161480610da957506064546001600160a01b038381169116145b6105f757604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610eab5760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303815f875af1158015610e2c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5091906113ba565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb0906024015f604051808303815f87803b158015610e94575f5ffd5b505af1158015610ea6573d5f5f3e3d5ffd5b505050505b6105f76001600160a01b0383168483610f70565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f1b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3f91906113f4565b6001600160a01b0316336001600160a01b0316146106215760405163794821ff60e01b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526105f7928692915f91610fff91851690849061107e565b905080515f148061101f57508080602001905181019061101f91906113ba565b6105f75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610564565b606061066484845f85855f5f866001600160a01b031685876040516110a3919061140f565b5f6040518083038185875af1925050503d805f81146110dd576040519150601f19603f3d011682016040523d82523d5f602084013e6110e2565b606091505b50915091506110f3878383876110fe565b979650505050505050565b6060831561116c5782515f03611165576001600160a01b0385163b6111655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610564565b5081610664565b61066483838151156111815781518083602001fd5b8060405162461bcd60e51b81526004016105649190611272565b6001600160a01b0381168114610abe575f5ffd5b5f5f604083850312156111c0575f5ffd5b82356111cb8161119b565b946020939093013593505050565b5f602082840312156111e9575f5ffd5b5035919050565b5f5f60408385031215611201575f5ffd5b823561120c8161119b565b9150602083013561121c8161119b565b809150509250929050565b5f60208284031215611237575f5ffd5b81356112428161119b565b9392505050565b60ff81168114610abe575f5ffd5b5f60208284031215611267575f5ffd5b813561124281611249565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f606084860312156112b9575f5ffd5b83356112c48161119b565b925060208401356112d48161119b565b929592945050506040919091013590565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610609576106096112e5565b81810381811115610609576106096112e5565b8082028115828204841417610609576106096112e5565b5f8261135057634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156113b3575f5ffd5b5051919050565b5f602082840312156113ca575f5ffd5b81518015158114611242575f5ffd5b5f602082840312156113e9575f5ffd5b815161124281611249565b5f60208284031215611404575f5ffd5b81516112428161119b565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212201e029437f2e814142ddc4881ce7cd13c117417abfb9dfe1532a2bb4316affd0b64736f6c634300081e0033",
}
// EigenStrategyABI is the input ABI used to generate the binding from.
@@ -636,6 +636,48 @@ func (_EigenStrategy *EigenStrategyCallerSession) UserUnderlyingView(user common
return _EigenStrategy.Contract.UserUnderlyingView(&_EigenStrategy.CallOpts, user)
}
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address , uint256 ) returns()
+func (_EigenStrategy *EigenStrategyTransactor) BeforeAddShares(opts *bind.TransactOpts, arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _EigenStrategy.contract.Transact(opts, "beforeAddShares", arg0, arg1)
+}
+
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address , uint256 ) returns()
+func (_EigenStrategy *EigenStrategySession) BeforeAddShares(arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _EigenStrategy.Contract.BeforeAddShares(&_EigenStrategy.TransactOpts, arg0, arg1)
+}
+
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address , uint256 ) returns()
+func (_EigenStrategy *EigenStrategyTransactorSession) BeforeAddShares(arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _EigenStrategy.Contract.BeforeAddShares(&_EigenStrategy.TransactOpts, arg0, arg1)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address , uint256 ) returns()
+func (_EigenStrategy *EigenStrategyTransactor) BeforeRemoveShares(opts *bind.TransactOpts, arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _EigenStrategy.contract.Transact(opts, "beforeRemoveShares", arg0, arg1)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address , uint256 ) returns()
+func (_EigenStrategy *EigenStrategySession) BeforeRemoveShares(arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _EigenStrategy.Contract.BeforeRemoveShares(&_EigenStrategy.TransactOpts, arg0, arg1)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address , uint256 ) returns()
+func (_EigenStrategy *EigenStrategyTransactorSession) BeforeRemoveShares(arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _EigenStrategy.Contract.BeforeRemoveShares(&_EigenStrategy.TransactOpts, arg0, arg1)
+}
+
// 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/EmissionsController/binding.go b/pkg/bindings/EmissionsController/binding.go
new file mode 100644
index 0000000000..66ab9de2f0
--- /dev/null
+++ b/pkg/bindings/EmissionsController/binding.go
@@ -0,0 +1,2436 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package EmissionsController
+
+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
+)
+
+// IEmissionsControllerTypesDistribution is an auto generated low-level Go binding around an user-defined struct.
+type IEmissionsControllerTypesDistribution struct {
+ Weight uint64
+ StartEpoch uint64
+ TotalEpochs uint64
+ DistributionType uint8
+ OperatorSet OperatorSet
+ StrategiesAndMultipliers [][]IRewardsCoordinatorTypesStrategyAndMultiplier
+}
+
+// IRewardsCoordinatorTypesStrategyAndMultiplier is an auto generated low-level Go binding around an user-defined struct.
+type IRewardsCoordinatorTypesStrategyAndMultiplier struct {
+ Strategy common.Address
+ Multiplier *big.Int
+}
+
+// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
+type OperatorSet struct {
+ Avs common.Address
+ Id uint32
+}
+
+// EmissionsControllerMetaData contains all meta data concerning the EmissionsController contract.
+var EmissionsControllerMetaData = &bind.MetaData{
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"eigen\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"backingEigen\",\"type\":\"address\",\"internalType\":\"contractIBackingEigen\"},{\"name\":\"allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"rewardsCoordinator\",\"type\":\"address\",\"internalType\":\"contractIRewardsCoordinator\"},{\"name\":\"pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"inflationRate\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"cooldownSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"calculationIntervalSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ALLOCATION_MANAGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BACKING_EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBackingEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EMISSIONS_EPOCH_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EMISSIONS_INFLATION_RATE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EMISSIONS_START_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_TOTAL_WEIGHT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"REWARDS_COORDINATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRewardsCoordinator\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addDistribution\",\"inputs\":[{\"name\":\"distribution\",\"type\":\"tuple\",\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"outputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentEpoch\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistribution\",\"inputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributions\",\"inputs\":[{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"distributions\",\"type\":\"tuple[]\",\"internalType\":\"structIEmissionsControllerTypes.Distribution[]\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTotalProcessableDistributions\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"incentiveCouncil\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialIncentiveCouncil\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isButtonPressable\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastTimeButtonPressable\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextTimeButtonPressable\",\"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\":\"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\":\"pressButton\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setIncentiveCouncil\",\"inputs\":[{\"name\":\"newIncentiveCouncil\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sweep\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"totalWeight\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"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\":\"updateDistribution\",\"inputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"distribution\",\"type\":\"tuple\",\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"DistributionAdded\",\"inputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"epoch\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"distribution\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionProcessed\",\"inputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"epoch\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"distribution\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]},{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionUpdated\",\"inputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"epoch\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"distribution\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"IncentiveCouncilUpdated\",\"inputs\":[{\"name\":\"incentiveCouncil\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":\"Swept\",\"inputs\":[{\"name\":\"incentiveCouncil\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"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\":\"AllDistributionsMustBeProcessed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AllDistributionsProcessed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotIncentiveCouncil\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotAddDisabledDistribution\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmissionsNotStarted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EpochLengthNotAlignedWithCalculationInterval\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDistributionType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaliciousCallDetected\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorSetNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsSubmissionsCannotBeEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartEpochMustBeInTheFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimeNotAlignedWithCalculationInterval\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalWeightExceedsMax\",\"inputs\":[]}]",
+ Bin: "0x610180604052348015610010575f5ffd5b506040516135a83803806135a883398101604081905261002f916101d7565b88888888878787878c6001600160a01b03811661005f576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0316608052610075818361026e565b1561009357604051630cb091bf60e01b815260040160405180910390fd5b61009d818461026e565b156100bb57604051632f545d3f60e01b815260040160405180910390fd5b506001600160a01b0396871660a05294861660c05292851660e0529316610100526101209290925261014091909152610160526100f6610104565b50505050505050505061028d565b5f54610100900460ff161561016f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101be575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101d4575f5ffd5b50565b5f5f5f5f5f5f5f5f5f6101208a8c0312156101f0575f5ffd5b89516101fb816101c0565b60208b015190995061020c816101c0565b60408b015190985061021d816101c0565b60608b015190975061022e816101c0565b60808b015190965061023f816101c0565b60a08b015160c08c015160e08d0151610100909d01519b9e9a9d50989b979a9199909897965090945092505050565b5f8261028857634e487b7160e01b5f52601260045260245ffd5b500690565b60805160a05160c05160e051610100516101205161014051610160516131f56103b35f395f81816103ea01528181610ef301528181611344015281816115a6015281816116c70152611b6101525f818161043701528181610f1d0152818161131601528181611368015281816115d0015261169101525f81816102e101528181610c4401528181610d1401528181610dba01528181610e4c01526119f201525f818161035301528181610cec01526122a601525f81816102540152611f1601525f818161047901528181610c6a0152610de001525f81816104d6015281816108bf0152818161095c01528181610c1c01528181610d3a01528181610e7201528181611b200152611da501525f818161037a0152818161176d015261211f01526131f55ff3fe608060405234801561000f575f5ffd5b50600436106101e7575f3560e01c80638da5cb5b11610109578063cd1e341b1161009e578063f2fde38b1161006e578063f2fde38b146104a3578063f769479f146104b6578063fabc1cbc146104be578063fdc371ce146104d1575f5ffd5b8063cd1e341b14610459578063d44b1c9e1461046c578063d455724e14610474578063d83931501461049b575f5ffd5b8063c2f208e4116100d9578063c2f208e4146103e5578063c44cb7271461040c578063c695acdb1461041f578063c9d3eff914610432575f5ffd5b80638da5cb5b1461039c57806396c82e57146103ad578063b97dd9e2146103d5578063be851337146103dd575f5ffd5b806344a320281161017f5780635c975abb1161014f5780635c975abb1461033e578063715018a61461034657806371e2c2641461034e578063886f119514610375575f5ffd5b806344a32028146102c957806347a28ea2146102dc578063595c6a67146103035780635ac86ab71461030b575f5ffd5b806331232bc9116101ba57806331232bc91461024f57806335faa4161461028e5780633b345a8714610296578063400efa85146102b6575f5ffd5b806309a3bbe4146101eb578063136439dd14610207578063147a7a5b1461021c5780631794bb3c1461023c575b5f5ffd5b6101f461271081565b6040519081526020015b60405180910390f35b61021a6102153660046125b8565b6104f8565b005b61022f61022a3660046125cf565b610532565b6040516101fe919061275c565b61021a61024a3660046127c7565b610770565b6102767f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101fe565b61021a610896565b6102a96102a43660046125b8565b6109d6565b6040516101fe9190612805565b61021a6102c43660046125b8565b610b6a565b61021a6102d736600461282e565b6111c4565b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61021a6112f0565b61032e610319366004612871565b606654600160ff9092169190911b9081161490565b60405190151581526020016101fe565b6066546101f4565b61021a611302565b6102767f000000000000000000000000000000000000000000000000000000000000000081565b6102767f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b0316610276565b60c9546103c290600160a01b900461ffff1681565b60405161ffff90911681526020016101fe565b6101f4611313565b6101f461139c565b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b60c954610276906001600160a01b031681565b61021a61042d366004612891565b6113e9565b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b6101f46104673660046128ac565b6113fa565b6101f4611584565b6102767f000000000000000000000000000000000000000000000000000000000000000081565b61032e6115f4565b61021a6104b1366004612891565b611605565b6101f461167b565b61021a6104cc3660046125b8565b6116eb565b6102767f000000000000000000000000000000000000000000000000000000000000000081565b610500611758565b60665481811681146105255760405163c61dca5d60e01b815260040160405180910390fd5b61052e826117fb565b5050565b60ca546060908061054384866128f1565b111561055657610553848261290a565b92505b826001600160401b0381111561056e5761056e61291d565b6040519080825280602002602001820160405280156105a757816020015b610594612574565b81526020019060019003908161058c5790505b5091505f5b838110156107685760ca6105c082876128f1565b815481106105d0576105d0612931565b5f9182526020918290206040805160c081018252600390930290910180546001600160401b038082168552600160401b8204811695850195909552600160801b8104909416918301919091529091606083019060ff600160c01b90910416600581111561063f5761063f6125ef565b6005811115610650576106506125ef565b815260408051808201825260018401546001600160a01b0381168252600160a01b900463ffffffff16602080830191909152808401919091526002840180548351818402810184018552818152939094019390915f9084015b8282101561073b578382905f5260205f2001805480602002602001604051908101604052809291908181526020015f905b82821015610728575f84815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b0316818301528252600190920191016106da565b50505050815260200190600101906106a9565b505050508152505083828151811061075557610755612931565b60209081029190910101526001016105ac565b505092915050565b5f54610100900460ff161580801561078e57505f54600160ff909116105b806107a75750303b1580156107a757505f5460ff166001145b61080f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015610830575f805461ff0019166101001790555b61083984611838565b61084283611889565b61084b826117fb565b8015610890575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b61089e6118f9565b5f6108a881611952565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561090c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109309190612945565b905061093a6115f4565b15801561094657508015155b156109c85760c954610985906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168361197d565b60c9546040518281526001600160a01b03909116907fc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe351096969060200160405180910390a25b50506109d46001609755565b565b6109de612574565b60ca82815481106109f1576109f1612931565b5f9182526020918290206040805160c081018252600390930290910180546001600160401b038082168552600160401b8204811695850195909552600160801b8104909416918301919091529091606083019060ff600160c01b909104166005811115610a6057610a606125ef565b6005811115610a7157610a716125ef565b815260408051808201825260018401546001600160a01b0381168252600160a01b900463ffffffff16602080830191909152808401919091526002840180548351818402810184018552818152939094019390915f9084015b82821015610b5c578382905f5260205f2001805480602002602001604051908101604052809291908181526020015f905b82821015610b49575f84815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101610afb565b5050505081526020019060010190610aca565b505050915250909392505050565b610b726118f9565b5f610b7c81611952565b5f610b85611313565b90505f198103610ba857604051638f98404160e01b815260040160405180910390fd5b5f610bb161139c565b5f83815260cb602052604090205490915061010090046001600160401b0316818110610bf0576040516314568a0960e11b815260040160405180910390fd5b5f83815260cb602052604090205460ff16610eec5760405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af1158015610cb0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd4919061295c565b5060405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af1158015610d80573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da4919061295c565b506040516340c10f1960e01b81523060048201527f000000000000000000000000000000000000000000000000000000000000000060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f19906044015f604051808303815f87803b158015610e29575f5ffd5b505af1158015610e3b573d5f5f3e3d5ffd5b5050604051630ea598cb60e41b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316925063ea598cb091506024015f604051808303815f87803b158015610ebd575f5ffd5b505af1158015610ecf573d5f5f3e3d5ffd5b5050505f84815260cb60205260409020805460ff19166001179055505b5f610f17847f000000000000000000000000000000000000000000000000000000000000000061297b565b610f41907f00000000000000000000000000000000000000000000000000000000000000006128f1565b90505f610f4e87846128f1565b905083811115610f5b5750825b825b8181101561117e575f60ca8281548110610f7957610f79612931565b5f9182526020918290206040805160c081018252600390930290910180546001600160401b038082168552600160401b8204811695850195909552600160801b8104909416918301919091529091606083019060ff600160c01b909104166005811115610fe857610fe86125ef565b6005811115610ff957610ff96125ef565b815260408051808201825260018401546001600160a01b0381168252600160a01b900463ffffffff16602080830191909152808401919091526002840180548351818402810184018552818152939094019390915f9084015b828210156110e4578382905f5260205f2001805480602002602001604051908101604052809291908181526020015f905b828210156110d1575f84815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101611083565b5050505081526020019060010190611052565b5050509152509091505f905081606001516005811115611106576111066125ef565b036111115750611176565b8681602001516001600160401b0316111561112c5750611176565b60408101516001600160401b03161561116857806040015181602001516111539190612992565b6001600160401b031687106111685750611176565b611174818389876119db565b505b600101610f5d565b505f94855260cb602052604090942080546001600160401b039095166101000268ffffffffffffffff001990951694909417909355506111c192506119d4915050565b50565b6111cc611e59565b5f6111d5611313565b90505f60c960149054906101000a900461ffff1661ffff1690505f60ca858154811061120357611203612931565b5f9182526020909120600390910201546001600160401b0316905061122783611e84565b61123b8484611236848661290a565b611eab565b61124860208501856129c5565b6001600160401b031661125b828461290a565b61126591906128f1565b60c960146101000a81548161ffff021916908361ffff1602179055508360ca868154811061129557611295612931565b905f5260205f20906003020181816112ad9190612cbe565b90505082857f548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c866040516112e19190612f16565b60405180910390a35050505050565b6112f8611758565b6109d45f196117fb565b61130a612085565b6109d45f611838565b5f7f000000000000000000000000000000000000000000000000000000000000000042101561134257505f1990565b7f000000000000000000000000000000000000000000000000000000000000000061138d7f00000000000000000000000000000000000000000000000000000000000000004261290a565b6113979190612fc7565b905090565b5f5f6113a6611313565b90505f1981036113b857505060ca5490565b5f81815260cb602052604090205460ca546113e391600160481b90046001600160401b03169061290a565b91505090565b6113f1612085565b6111c181611889565b5f611403611e59565b5f61140c611313565b90505f61141f6080850160608601612fe6565b6005811115611430576114306125ef565b0361144e57604051637051feff60e01b815260040160405180910390fd5b61145781611e84565b60c954600160a01b900461ffff16611470848383611eab565b5f82815260cb60205260409020805460099061149b90600160481b90046001600160401b0316613001565b82546001600160401b039182166101009390930a928302919092021990911617905560ca5492506114cf60208501856129c5565b6114e2906001600160401b0316826128f1565b60c9805461ffff92909216600160a01b0261ffff60a01b1990921691909117905560ca80546001810182555f9190915284906003027f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee1016115438282612cbe565b505081837e6f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef866040516115759190612f16565b60405180910390a35050919050565b5f5f61158e611313565b90505f1981036115a0575f1991505090565b6115ca817f000000000000000000000000000000000000000000000000000000000000000061297b565b6113e3907f00000000000000000000000000000000000000000000000000000000000000006128f1565b5f611397611600611313565b6120df565b61160d612085565b6001600160a01b0381166116725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610806565b6111c181611838565b5f5f611685611313565b90505f1981036116b6577f000000000000000000000000000000000000000000000000000000000000000091505090565b6116c18160016128f1565b6115ca907f000000000000000000000000000000000000000000000000000000000000000061297b565b6116f361211d565b6066548019821981161461171a5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156117ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117de919061295c565b6109d457604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0381166118b0576040516339b190bb60e11b815260040160405180910390fd5b60c980546001600160a01b0319166001600160a01b0383169081179091556040517f8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216905f90a250565b60026097540361194b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610806565b6002609755565b606654600160ff83161b908116036111c15760405163840a48d560e01b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526119cf9084906121ce565b505050565b6001609755565b83515f9061271090611a16906001600160401b03167f000000000000000000000000000000000000000000000000000000000000000061297b565b611a209190612fc7565b90505f815f03611a31575050610890565b600586606001516005811115611a4957611a496125ef565b14611d575760a08601515182811115611a6457505050610890565b5f611a6f8285612fc7565b90505f826001600160401b03811115611a8a57611a8a61291d565b604051908082528060200260200182016040528015611ae257816020015b6040805160a08101825260608082525f6020808401829052938301819052908201819052608082015282525f19909201910181611aa85790505b5090505f5b8151811015611bae576040518060a001604052808b60a001518381518110611b1157611b11612931565b602002602001015181526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018481526020018863ffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250828281518110611b9b57611b9b612931565b6020908102919091010152600101611ae7565b50600189606001516005811115611bc757611bc76125ef565b03611c1957611c1281604051602401611be091906130c1565b60408051601f198184030181529190526020810180516001600160e01b031660016230499960e11b03191790526122a1565b9350611d4f565b600389606001516005811115611c3157611c316125ef565b03611c7f57611c12896080015182604051602401611c509291906130d3565b60408051601f198184030181529190526020810180516001600160e01b0316637ae3058360e01b1790526122a1565b600289606001516005811115611c9757611c976125ef565b03611ce557611c12896080015182604051602401611cb69291906130d3565b60408051601f198184030181529190526020810180516001600160e01b0316638cb0ae1b60e01b1790526122a1565b600489606001516005811115611cfd57611cfd6125ef565b03611d4f57608089015151604051611d4c91611d1d918490602401613105565b60408051601f198184030181529190526020810180516001600160e01b031663394151a960e11b1790526122a1565b93505b505050611e16565b60c954604080516001600160a01b039283166024820152604480820186905282518083039091018152606490910182526020810180516001600160e01b031663a9059cbb60e01b17905290517f000000000000000000000000000000000000000000000000000000000000000090921691611dd29190613128565b5f604051808303815f865af19150503d805f8114611e0b576040519150601f19603f3d011682016040523d82523d5f602084013e611e10565b606091505b50909150505b83857fba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b8884604051611e4992919061313e565b60405180910390a3505050505050565b60c9546001600160a01b031633146109d45760405163235e4b5160e11b815260040160405180910390fd5b611e8d816120df565b156111c157604051631179354b60e11b815260040160405180910390fd5b6002611ebd6080850160608601612fe6565b6005811115611ece57611ece6125ef565b1480611efa57506003611ee76080850160608601612fe6565b6005811115611ef857611ef86125ef565b145b15611faa576040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890611f4e906080870190600401613161565b602060405180830381865afa158015611f69573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8d919061295c565b611faa57604051631d171d6360e11b815260040160405180910390fd5b5f198214611fe95781611fc360408501602086016129c5565b6001600160401b031611611fe9576040516285be8b60e21b815260040160405180910390fd5b61271081611ffa60208601866129c5565b6001600160401b031661200d91906128f1565b111561202c57604051630d1418e160e01b815260040160405180910390fd5b600561203e6080850160608601612fe6565b600581111561204f5761204f6125ef565b148061206857505f61206460c0850185612aa7565b9050115b6119cf5760405163ef1a114f60e01b815260040160405180910390fd5b6033546001600160a01b031633146109d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610806565b5f5f1982036120ef57505f919050565b6120f761139c565b5f92835260cb60205260409092205461010090046001600160401b031691909110919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612179573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061219d919061316f565b6001600160a01b0316336001600160a01b0316146109d45760405163794821ff60e01b815260040160405180910390fd5b5f612222826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123529092919063ffffffff16565b905080515f1480612242575080806020019051810190612242919061295c565b6119cf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610806565b5f60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836040516122dc9190613128565b5f604051808303815f865af19150503d805f8114612315576040519150601f19603f3d011682016040523d82523d5f602084013e61231a565b606091505b5090925090508161234c5761232e81612368565b1561234c576040516331e4566760e01b815260040160405180910390fd5b50919050565b606061236084845f85612400565b949350505050565b60405160206024820152601f60448201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060648201525f9060840160408051601f19818403018152919052602080820180516001600160e01b031662461bcd60e51b1781529151909120835191840191909120036123e957506001919050565b81515f036123f957506001919050565b505f919050565b6060824710156124615760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610806565b5f5f866001600160a01b0316858760405161247c9190613128565b5f6040518083038185875af1925050503d805f81146124b6576040519150601f19603f3d011682016040523d82523d5f602084013e6124bb565b606091505b50915091506124cc878383876124d7565b979650505050505050565b606083156125455782515f0361253e576001600160a01b0385163b61253e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610806565b5081612360565b612360838381511561255a5781518083602001fd5b8060405162461bcd60e51b8152600401610806919061318a565b6040805160c0810182525f80825260208083018290528284018290526060830182905283518085019094528184528301529060808201908152602001606081525090565b5f602082840312156125c8575f5ffd5b5035919050565b5f5f604083850312156125e0575f5ffd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061261f57634e487b7160e01b5f52602160045260245ffd5b9052565b5f8151808452602084019350602083015f5b8281101561267157815180516001600160a01b031687526020908101516001600160601b03168188015260409096019590910190600101612635565b5093949350505050565b5f60e083016001600160401b0383511684526001600160401b0360208401511660208501526001600160401b03604084015116604085015260608301516126c56060860182612603565b5060808301516126f1608086018280516001600160a01b0316825260209081015163ffffffff16910152565b5060a083015160e060c0860152818151808452610100870191506101008160051b88010193506020830192505f5b818110156127505760ff1988860301835261273b858551612623565b9450602093840193929092019160010161271f565b50929695505050505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561275057603f1987860301845261279e85835161267b565b94506020938401939190910190600101612782565b6001600160a01b03811681146111c1575f5ffd5b5f5f5f606084860312156127d9575f5ffd5b83356127e4816127b3565b925060208401356127f4816127b3565b929592945050506040919091013590565b602081525f612817602083018461267b565b9392505050565b5f60e0828403121561234c575f5ffd5b5f5f6040838503121561283f575f5ffd5b8235915060208301356001600160401b0381111561285b575f5ffd5b6128678582860161281e565b9150509250929050565b5f60208284031215612881575f5ffd5b813560ff81168114612817575f5ffd5b5f602082840312156128a1575f5ffd5b8135612817816127b3565b5f602082840312156128bc575f5ffd5b81356001600160401b038111156128d1575f5ffd5b6123608482850161281e565b634e487b7160e01b5f52601160045260245ffd5b80820180821115612904576129046128dd565b92915050565b81810381811115612904576129046128dd565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612955575f5ffd5b5051919050565b5f6020828403121561296c575f5ffd5b81518015158114612817575f5ffd5b8082028115828204841417612904576129046128dd565b6001600160401b038181168382160190811115612904576129046128dd565b6001600160401b03811681146111c1575f5ffd5b5f602082840312156129d5575f5ffd5b8135612817816129b1565b600681106111c1575f5ffd5b5f8135612904816129e0565b60068210612a1457634e487b7160e01b5f52602160045260245ffd5b805460ff60c01b191660c09290921b60ff60c01b16919091179055565b80546001600160a01b0319166001600160a01b0392909216919091179055565b63ffffffff811681146111c1575f5ffd5b8135612a6d816127b3565b612a778183612a31565b506020820135612a8681612a51565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b1617905550565b5f5f8335601e19843603018112612abc575f5ffd5b8301803591506001600160401b03821115612ad5575f5ffd5b6020019150600581901b3603821315612aec575f5ffd5b9250929050565b5f5f8335601e19843603018112612b08575f5ffd5b8301803591506001600160401b03821115612b21575f5ffd5b6020019150600681901b3603821315612aec575f5ffd5b80545f8255801561052e57815f5260205f208181015b80821015610890575f8255600182019150612b4e565b6001600160601b03811681146111c1575f5ffd5b600160401b831115612b8c57612b8c61291d565b805483825580841015612bc1575f828152602090208481019082015b80821015612bbe575f8255600182019150612ba8565b50505b5081815f5260205f205f5b85811015612c29578235612bdf816127b3565b612be98184612a31565b506020830135612bf881612b64565b82546001600160a01b031660a09190911b6001600160a01b0319161782556040929092019160019182019101612bcc565b505050505050565b600160401b831115612c4557612c4561291d565b805483825580841015612c80575f828152602090208481019082015b80821015612c7d57612c7282612b38565b600182019150612c61565b50505b505f8181526020812083915b85811015612c2957612c9e8386612af3565b612ca9818386612b78565b50506020929092019160019182019101612c8c565b8135612cc9816129b1565b6001600160401b03811690508154816001600160401b031982161783556020840135612cf4816129b1565b6fffffffffffffffff00000000000000008160401b16836fffffffffffffffffffffffffffffffff198416171784555050505f6040830135612d35816129b1565b825467ffffffffffffffff60801b191660809190911b67ffffffffffffffff60801b1617825550612d71612d6b606084016129ec565b826129f8565b612d816080830160018301612a62565b612d8e60c0830183612aa7565b610890818360028601612c31565b8035612da7816129e0565b919050565b8035612db7816127b3565b6001600160a01b031682526020810135612dd081612a51565b63ffffffff81166020840152505050565b5f5f8335601e19843603018112612df6575f5ffd5b83016020810192503590506001600160401b03811115612e14575f5ffd5b8060051b3603821315612aec575f5ffd5b8183526020830192505f815f5b84811015612671578135612e45816127b3565b6001600160a01b031686526020820135612e5e81612b64565b6001600160601b031660208701526040958601959190910190600101612e32565b5f8383855260208501945060208460051b820101835f5b86811015612f0a57838303601f19018852813536879003601e19018112612ebb575f5ffd5b86016020810190356001600160401b03811115612ed6575f5ffd5b8060061b3603821315612ee7575f5ffd5b612ef2858284612e25565b60209a8b019a90955093909301925050600101612e96565b50909695505050505050565b602081525f8235612f26816129b1565b6001600160401b0381166020840152506020830135612f44816129b1565b6001600160401b0381166040840152506040830135612f62816129b1565b6001600160401b038116606084015250612f7e60608401612d9c565b612f8b6080840182612603565b50612f9c60a0830160808501612dac565b612fa960c0840184612de1565b60e080850152612fbe61010085018284612e7f565b95945050505050565b5f82612fe157634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612ff6575f5ffd5b8135612817816129e0565b5f6001600160401b0382166001600160401b038103613022576130226128dd565b60010192915050565b5f82825180855260208501945060208160051b830101602085015f5b83811015612f0a57601f198584030188528151805160a0855261306d60a0860182612623565b6020838101516001600160a01b0316878201526040808501519088015260608085015163ffffffff908116918901919091526080948501511693909601929092525097830197929190910190600101613047565b602081525f612817602083018461302b565b82516001600160a01b0316815260208084015163ffffffff1690820152606060408201525f612360606083018461302b565b6001600160a01b03831681526040602082018190525f906123609083018461302b565b5f82518060208501845e5f920191825250919050565b604081525f613150604083018561267b565b905082151560208301529392505050565b604081016129048284612dac565b5f6020828403121561317f575f5ffd5b8151612817816127b3565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea26469706673582212204118a68a88b86b9a481fe9b89ffc40c37cac11c2662e5f22bd61d499871328d264736f6c634300081e0033",
+}
+
+// EmissionsControllerABI is the input ABI used to generate the binding from.
+// Deprecated: Use EmissionsControllerMetaData.ABI instead.
+var EmissionsControllerABI = EmissionsControllerMetaData.ABI
+
+// EmissionsControllerBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use EmissionsControllerMetaData.Bin instead.
+var EmissionsControllerBin = EmissionsControllerMetaData.Bin
+
+// DeployEmissionsController deploys a new Ethereum contract, binding an instance of EmissionsController to it.
+func DeployEmissionsController(auth *bind.TransactOpts, backend bind.ContractBackend, eigen common.Address, backingEigen common.Address, allocationManager common.Address, rewardsCoordinator common.Address, pauserRegistry common.Address, inflationRate *big.Int, startTime *big.Int, cooldownSeconds *big.Int, calculationIntervalSeconds *big.Int) (common.Address, *types.Transaction, *EmissionsController, error) {
+ parsed, err := EmissionsControllerMetaData.GetAbi()
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ if parsed == nil {
+ return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+ }
+
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(EmissionsControllerBin), backend, eigen, backingEigen, allocationManager, rewardsCoordinator, pauserRegistry, inflationRate, startTime, cooldownSeconds, calculationIntervalSeconds)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &EmissionsController{EmissionsControllerCaller: EmissionsControllerCaller{contract: contract}, EmissionsControllerTransactor: EmissionsControllerTransactor{contract: contract}, EmissionsControllerFilterer: EmissionsControllerFilterer{contract: contract}}, nil
+}
+
+// EmissionsController is an auto generated Go binding around an Ethereum contract.
+type EmissionsController struct {
+ EmissionsControllerCaller // Read-only binding to the contract
+ EmissionsControllerTransactor // Write-only binding to the contract
+ EmissionsControllerFilterer // Log filterer for contract events
+}
+
+// EmissionsControllerCaller is an auto generated read-only Go binding around an Ethereum contract.
+type EmissionsControllerCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// EmissionsControllerTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type EmissionsControllerTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// EmissionsControllerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type EmissionsControllerFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// EmissionsControllerSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type EmissionsControllerSession struct {
+ Contract *EmissionsController // 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
+}
+
+// EmissionsControllerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type EmissionsControllerCallerSession struct {
+ Contract *EmissionsControllerCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// EmissionsControllerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type EmissionsControllerTransactorSession struct {
+ Contract *EmissionsControllerTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// EmissionsControllerRaw is an auto generated low-level Go binding around an Ethereum contract.
+type EmissionsControllerRaw struct {
+ Contract *EmissionsController // Generic contract binding to access the raw methods on
+}
+
+// EmissionsControllerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type EmissionsControllerCallerRaw struct {
+ Contract *EmissionsControllerCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// EmissionsControllerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type EmissionsControllerTransactorRaw struct {
+ Contract *EmissionsControllerTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewEmissionsController creates a new instance of EmissionsController, bound to a specific deployed contract.
+func NewEmissionsController(address common.Address, backend bind.ContractBackend) (*EmissionsController, error) {
+ contract, err := bindEmissionsController(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsController{EmissionsControllerCaller: EmissionsControllerCaller{contract: contract}, EmissionsControllerTransactor: EmissionsControllerTransactor{contract: contract}, EmissionsControllerFilterer: EmissionsControllerFilterer{contract: contract}}, nil
+}
+
+// NewEmissionsControllerCaller creates a new read-only instance of EmissionsController, bound to a specific deployed contract.
+func NewEmissionsControllerCaller(address common.Address, caller bind.ContractCaller) (*EmissionsControllerCaller, error) {
+ contract, err := bindEmissionsController(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerCaller{contract: contract}, nil
+}
+
+// NewEmissionsControllerTransactor creates a new write-only instance of EmissionsController, bound to a specific deployed contract.
+func NewEmissionsControllerTransactor(address common.Address, transactor bind.ContractTransactor) (*EmissionsControllerTransactor, error) {
+ contract, err := bindEmissionsController(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerTransactor{contract: contract}, nil
+}
+
+// NewEmissionsControllerFilterer creates a new log filterer instance of EmissionsController, bound to a specific deployed contract.
+func NewEmissionsControllerFilterer(address common.Address, filterer bind.ContractFilterer) (*EmissionsControllerFilterer, error) {
+ contract, err := bindEmissionsController(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerFilterer{contract: contract}, nil
+}
+
+// bindEmissionsController binds a generic wrapper to an already deployed contract.
+func bindEmissionsController(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := EmissionsControllerMetaData.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 (_EmissionsController *EmissionsControllerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _EmissionsController.Contract.EmissionsControllerCaller.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 (_EmissionsController *EmissionsControllerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _EmissionsController.Contract.EmissionsControllerTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_EmissionsController *EmissionsControllerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _EmissionsController.Contract.EmissionsControllerTransactor.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 (_EmissionsController *EmissionsControllerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _EmissionsController.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 (_EmissionsController *EmissionsControllerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _EmissionsController.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_EmissionsController *EmissionsControllerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _EmissionsController.Contract.contract.Transact(opts, method, params...)
+}
+
+// ALLOCATIONMANAGER is a free data retrieval call binding the contract method 0x31232bc9.
+//
+// Solidity: function ALLOCATION_MANAGER() view returns(address)
+func (_EmissionsController *EmissionsControllerCaller) ALLOCATIONMANAGER(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "ALLOCATION_MANAGER")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// ALLOCATIONMANAGER is a free data retrieval call binding the contract method 0x31232bc9.
+//
+// Solidity: function ALLOCATION_MANAGER() view returns(address)
+func (_EmissionsController *EmissionsControllerSession) ALLOCATIONMANAGER() (common.Address, error) {
+ return _EmissionsController.Contract.ALLOCATIONMANAGER(&_EmissionsController.CallOpts)
+}
+
+// ALLOCATIONMANAGER is a free data retrieval call binding the contract method 0x31232bc9.
+//
+// Solidity: function ALLOCATION_MANAGER() view returns(address)
+func (_EmissionsController *EmissionsControllerCallerSession) ALLOCATIONMANAGER() (common.Address, error) {
+ return _EmissionsController.Contract.ALLOCATIONMANAGER(&_EmissionsController.CallOpts)
+}
+
+// BACKINGEIGEN is a free data retrieval call binding the contract method 0xd455724e.
+//
+// Solidity: function BACKING_EIGEN() view returns(address)
+func (_EmissionsController *EmissionsControllerCaller) BACKINGEIGEN(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "BACKING_EIGEN")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// BACKINGEIGEN is a free data retrieval call binding the contract method 0xd455724e.
+//
+// Solidity: function BACKING_EIGEN() view returns(address)
+func (_EmissionsController *EmissionsControllerSession) BACKINGEIGEN() (common.Address, error) {
+ return _EmissionsController.Contract.BACKINGEIGEN(&_EmissionsController.CallOpts)
+}
+
+// BACKINGEIGEN is a free data retrieval call binding the contract method 0xd455724e.
+//
+// Solidity: function BACKING_EIGEN() view returns(address)
+func (_EmissionsController *EmissionsControllerCallerSession) BACKINGEIGEN() (common.Address, error) {
+ return _EmissionsController.Contract.BACKINGEIGEN(&_EmissionsController.CallOpts)
+}
+
+// EIGEN is a free data retrieval call binding the contract method 0xfdc371ce.
+//
+// Solidity: function EIGEN() view returns(address)
+func (_EmissionsController *EmissionsControllerCaller) EIGEN(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "EIGEN")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// EIGEN is a free data retrieval call binding the contract method 0xfdc371ce.
+//
+// Solidity: function EIGEN() view returns(address)
+func (_EmissionsController *EmissionsControllerSession) EIGEN() (common.Address, error) {
+ return _EmissionsController.Contract.EIGEN(&_EmissionsController.CallOpts)
+}
+
+// EIGEN is a free data retrieval call binding the contract method 0xfdc371ce.
+//
+// Solidity: function EIGEN() view returns(address)
+func (_EmissionsController *EmissionsControllerCallerSession) EIGEN() (common.Address, error) {
+ return _EmissionsController.Contract.EIGEN(&_EmissionsController.CallOpts)
+}
+
+// EMISSIONSEPOCHLENGTH is a free data retrieval call binding the contract method 0xc2f208e4.
+//
+// Solidity: function EMISSIONS_EPOCH_LENGTH() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCaller) EMISSIONSEPOCHLENGTH(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "EMISSIONS_EPOCH_LENGTH")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// EMISSIONSEPOCHLENGTH is a free data retrieval call binding the contract method 0xc2f208e4.
+//
+// Solidity: function EMISSIONS_EPOCH_LENGTH() view returns(uint256)
+func (_EmissionsController *EmissionsControllerSession) EMISSIONSEPOCHLENGTH() (*big.Int, error) {
+ return _EmissionsController.Contract.EMISSIONSEPOCHLENGTH(&_EmissionsController.CallOpts)
+}
+
+// EMISSIONSEPOCHLENGTH is a free data retrieval call binding the contract method 0xc2f208e4.
+//
+// Solidity: function EMISSIONS_EPOCH_LENGTH() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCallerSession) EMISSIONSEPOCHLENGTH() (*big.Int, error) {
+ return _EmissionsController.Contract.EMISSIONSEPOCHLENGTH(&_EmissionsController.CallOpts)
+}
+
+// EMISSIONSINFLATIONRATE is a free data retrieval call binding the contract method 0x47a28ea2.
+//
+// Solidity: function EMISSIONS_INFLATION_RATE() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCaller) EMISSIONSINFLATIONRATE(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "EMISSIONS_INFLATION_RATE")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// EMISSIONSINFLATIONRATE is a free data retrieval call binding the contract method 0x47a28ea2.
+//
+// Solidity: function EMISSIONS_INFLATION_RATE() view returns(uint256)
+func (_EmissionsController *EmissionsControllerSession) EMISSIONSINFLATIONRATE() (*big.Int, error) {
+ return _EmissionsController.Contract.EMISSIONSINFLATIONRATE(&_EmissionsController.CallOpts)
+}
+
+// EMISSIONSINFLATIONRATE is a free data retrieval call binding the contract method 0x47a28ea2.
+//
+// Solidity: function EMISSIONS_INFLATION_RATE() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCallerSession) EMISSIONSINFLATIONRATE() (*big.Int, error) {
+ return _EmissionsController.Contract.EMISSIONSINFLATIONRATE(&_EmissionsController.CallOpts)
+}
+
+// EMISSIONSSTARTTIME is a free data retrieval call binding the contract method 0xc9d3eff9.
+//
+// Solidity: function EMISSIONS_START_TIME() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCaller) EMISSIONSSTARTTIME(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "EMISSIONS_START_TIME")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// EMISSIONSSTARTTIME is a free data retrieval call binding the contract method 0xc9d3eff9.
+//
+// Solidity: function EMISSIONS_START_TIME() view returns(uint256)
+func (_EmissionsController *EmissionsControllerSession) EMISSIONSSTARTTIME() (*big.Int, error) {
+ return _EmissionsController.Contract.EMISSIONSSTARTTIME(&_EmissionsController.CallOpts)
+}
+
+// EMISSIONSSTARTTIME is a free data retrieval call binding the contract method 0xc9d3eff9.
+//
+// Solidity: function EMISSIONS_START_TIME() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCallerSession) EMISSIONSSTARTTIME() (*big.Int, error) {
+ return _EmissionsController.Contract.EMISSIONSSTARTTIME(&_EmissionsController.CallOpts)
+}
+
+// MAXTOTALWEIGHT is a free data retrieval call binding the contract method 0x09a3bbe4.
+//
+// Solidity: function MAX_TOTAL_WEIGHT() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCaller) MAXTOTALWEIGHT(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "MAX_TOTAL_WEIGHT")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// MAXTOTALWEIGHT is a free data retrieval call binding the contract method 0x09a3bbe4.
+//
+// Solidity: function MAX_TOTAL_WEIGHT() view returns(uint256)
+func (_EmissionsController *EmissionsControllerSession) MAXTOTALWEIGHT() (*big.Int, error) {
+ return _EmissionsController.Contract.MAXTOTALWEIGHT(&_EmissionsController.CallOpts)
+}
+
+// MAXTOTALWEIGHT is a free data retrieval call binding the contract method 0x09a3bbe4.
+//
+// Solidity: function MAX_TOTAL_WEIGHT() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCallerSession) MAXTOTALWEIGHT() (*big.Int, error) {
+ return _EmissionsController.Contract.MAXTOTALWEIGHT(&_EmissionsController.CallOpts)
+}
+
+// REWARDSCOORDINATOR is a free data retrieval call binding the contract method 0x71e2c264.
+//
+// Solidity: function REWARDS_COORDINATOR() view returns(address)
+func (_EmissionsController *EmissionsControllerCaller) REWARDSCOORDINATOR(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "REWARDS_COORDINATOR")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// REWARDSCOORDINATOR is a free data retrieval call binding the contract method 0x71e2c264.
+//
+// Solidity: function REWARDS_COORDINATOR() view returns(address)
+func (_EmissionsController *EmissionsControllerSession) REWARDSCOORDINATOR() (common.Address, error) {
+ return _EmissionsController.Contract.REWARDSCOORDINATOR(&_EmissionsController.CallOpts)
+}
+
+// REWARDSCOORDINATOR is a free data retrieval call binding the contract method 0x71e2c264.
+//
+// Solidity: function REWARDS_COORDINATOR() view returns(address)
+func (_EmissionsController *EmissionsControllerCallerSession) REWARDSCOORDINATOR() (common.Address, error) {
+ return _EmissionsController.Contract.REWARDSCOORDINATOR(&_EmissionsController.CallOpts)
+}
+
+// GetCurrentEpoch is a free data retrieval call binding the contract method 0xb97dd9e2.
+//
+// Solidity: function getCurrentEpoch() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCaller) GetCurrentEpoch(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "getCurrentEpoch")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// GetCurrentEpoch is a free data retrieval call binding the contract method 0xb97dd9e2.
+//
+// Solidity: function getCurrentEpoch() view returns(uint256)
+func (_EmissionsController *EmissionsControllerSession) GetCurrentEpoch() (*big.Int, error) {
+ return _EmissionsController.Contract.GetCurrentEpoch(&_EmissionsController.CallOpts)
+}
+
+// GetCurrentEpoch is a free data retrieval call binding the contract method 0xb97dd9e2.
+//
+// Solidity: function getCurrentEpoch() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCallerSession) GetCurrentEpoch() (*big.Int, error) {
+ return _EmissionsController.Contract.GetCurrentEpoch(&_EmissionsController.CallOpts)
+}
+
+// GetDistribution is a free data retrieval call binding the contract method 0x3b345a87.
+//
+// Solidity: function getDistribution(uint256 distributionId) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]))
+func (_EmissionsController *EmissionsControllerCaller) GetDistribution(opts *bind.CallOpts, distributionId *big.Int) (IEmissionsControllerTypesDistribution, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "getDistribution", distributionId)
+
+ if err != nil {
+ return *new(IEmissionsControllerTypesDistribution), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(IEmissionsControllerTypesDistribution)).(*IEmissionsControllerTypesDistribution)
+
+ return out0, err
+
+}
+
+// GetDistribution is a free data retrieval call binding the contract method 0x3b345a87.
+//
+// Solidity: function getDistribution(uint256 distributionId) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]))
+func (_EmissionsController *EmissionsControllerSession) GetDistribution(distributionId *big.Int) (IEmissionsControllerTypesDistribution, error) {
+ return _EmissionsController.Contract.GetDistribution(&_EmissionsController.CallOpts, distributionId)
+}
+
+// GetDistribution is a free data retrieval call binding the contract method 0x3b345a87.
+//
+// Solidity: function getDistribution(uint256 distributionId) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]))
+func (_EmissionsController *EmissionsControllerCallerSession) GetDistribution(distributionId *big.Int) (IEmissionsControllerTypesDistribution, error) {
+ return _EmissionsController.Contract.GetDistribution(&_EmissionsController.CallOpts, distributionId)
+}
+
+// GetDistributions is a free data retrieval call binding the contract method 0x147a7a5b.
+//
+// Solidity: function getDistributions(uint256 start, uint256 length) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][])[] distributions)
+func (_EmissionsController *EmissionsControllerCaller) GetDistributions(opts *bind.CallOpts, start *big.Int, length *big.Int) ([]IEmissionsControllerTypesDistribution, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "getDistributions", start, length)
+
+ if err != nil {
+ return *new([]IEmissionsControllerTypesDistribution), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]IEmissionsControllerTypesDistribution)).(*[]IEmissionsControllerTypesDistribution)
+
+ return out0, err
+
+}
+
+// GetDistributions is a free data retrieval call binding the contract method 0x147a7a5b.
+//
+// Solidity: function getDistributions(uint256 start, uint256 length) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][])[] distributions)
+func (_EmissionsController *EmissionsControllerSession) GetDistributions(start *big.Int, length *big.Int) ([]IEmissionsControllerTypesDistribution, error) {
+ return _EmissionsController.Contract.GetDistributions(&_EmissionsController.CallOpts, start, length)
+}
+
+// GetDistributions is a free data retrieval call binding the contract method 0x147a7a5b.
+//
+// Solidity: function getDistributions(uint256 start, uint256 length) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][])[] distributions)
+func (_EmissionsController *EmissionsControllerCallerSession) GetDistributions(start *big.Int, length *big.Int) ([]IEmissionsControllerTypesDistribution, error) {
+ return _EmissionsController.Contract.GetDistributions(&_EmissionsController.CallOpts, start, length)
+}
+
+// GetTotalProcessableDistributions is a free data retrieval call binding the contract method 0xbe851337.
+//
+// Solidity: function getTotalProcessableDistributions() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCaller) GetTotalProcessableDistributions(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "getTotalProcessableDistributions")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// GetTotalProcessableDistributions is a free data retrieval call binding the contract method 0xbe851337.
+//
+// Solidity: function getTotalProcessableDistributions() view returns(uint256)
+func (_EmissionsController *EmissionsControllerSession) GetTotalProcessableDistributions() (*big.Int, error) {
+ return _EmissionsController.Contract.GetTotalProcessableDistributions(&_EmissionsController.CallOpts)
+}
+
+// GetTotalProcessableDistributions is a free data retrieval call binding the contract method 0xbe851337.
+//
+// Solidity: function getTotalProcessableDistributions() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCallerSession) GetTotalProcessableDistributions() (*big.Int, error) {
+ return _EmissionsController.Contract.GetTotalProcessableDistributions(&_EmissionsController.CallOpts)
+}
+
+// IncentiveCouncil is a free data retrieval call binding the contract method 0xc44cb727.
+//
+// Solidity: function incentiveCouncil() view returns(address)
+func (_EmissionsController *EmissionsControllerCaller) IncentiveCouncil(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "incentiveCouncil")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// IncentiveCouncil is a free data retrieval call binding the contract method 0xc44cb727.
+//
+// Solidity: function incentiveCouncil() view returns(address)
+func (_EmissionsController *EmissionsControllerSession) IncentiveCouncil() (common.Address, error) {
+ return _EmissionsController.Contract.IncentiveCouncil(&_EmissionsController.CallOpts)
+}
+
+// IncentiveCouncil is a free data retrieval call binding the contract method 0xc44cb727.
+//
+// Solidity: function incentiveCouncil() view returns(address)
+func (_EmissionsController *EmissionsControllerCallerSession) IncentiveCouncil() (common.Address, error) {
+ return _EmissionsController.Contract.IncentiveCouncil(&_EmissionsController.CallOpts)
+}
+
+// IsButtonPressable is a free data retrieval call binding the contract method 0xd8393150.
+//
+// Solidity: function isButtonPressable() view returns(bool)
+func (_EmissionsController *EmissionsControllerCaller) IsButtonPressable(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "isButtonPressable")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsButtonPressable is a free data retrieval call binding the contract method 0xd8393150.
+//
+// Solidity: function isButtonPressable() view returns(bool)
+func (_EmissionsController *EmissionsControllerSession) IsButtonPressable() (bool, error) {
+ return _EmissionsController.Contract.IsButtonPressable(&_EmissionsController.CallOpts)
+}
+
+// IsButtonPressable is a free data retrieval call binding the contract method 0xd8393150.
+//
+// Solidity: function isButtonPressable() view returns(bool)
+func (_EmissionsController *EmissionsControllerCallerSession) IsButtonPressable() (bool, error) {
+ return _EmissionsController.Contract.IsButtonPressable(&_EmissionsController.CallOpts)
+}
+
+// LastTimeButtonPressable is a free data retrieval call binding the contract method 0xd44b1c9e.
+//
+// Solidity: function lastTimeButtonPressable() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCaller) LastTimeButtonPressable(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "lastTimeButtonPressable")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// LastTimeButtonPressable is a free data retrieval call binding the contract method 0xd44b1c9e.
+//
+// Solidity: function lastTimeButtonPressable() view returns(uint256)
+func (_EmissionsController *EmissionsControllerSession) LastTimeButtonPressable() (*big.Int, error) {
+ return _EmissionsController.Contract.LastTimeButtonPressable(&_EmissionsController.CallOpts)
+}
+
+// LastTimeButtonPressable is a free data retrieval call binding the contract method 0xd44b1c9e.
+//
+// Solidity: function lastTimeButtonPressable() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCallerSession) LastTimeButtonPressable() (*big.Int, error) {
+ return _EmissionsController.Contract.LastTimeButtonPressable(&_EmissionsController.CallOpts)
+}
+
+// NextTimeButtonPressable is a free data retrieval call binding the contract method 0xf769479f.
+//
+// Solidity: function nextTimeButtonPressable() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCaller) NextTimeButtonPressable(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "nextTimeButtonPressable")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// NextTimeButtonPressable is a free data retrieval call binding the contract method 0xf769479f.
+//
+// Solidity: function nextTimeButtonPressable() view returns(uint256)
+func (_EmissionsController *EmissionsControllerSession) NextTimeButtonPressable() (*big.Int, error) {
+ return _EmissionsController.Contract.NextTimeButtonPressable(&_EmissionsController.CallOpts)
+}
+
+// NextTimeButtonPressable is a free data retrieval call binding the contract method 0xf769479f.
+//
+// Solidity: function nextTimeButtonPressable() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCallerSession) NextTimeButtonPressable() (*big.Int, error) {
+ return _EmissionsController.Contract.NextTimeButtonPressable(&_EmissionsController.CallOpts)
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_EmissionsController *EmissionsControllerCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "owner")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_EmissionsController *EmissionsControllerSession) Owner() (common.Address, error) {
+ return _EmissionsController.Contract.Owner(&_EmissionsController.CallOpts)
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_EmissionsController *EmissionsControllerCallerSession) Owner() (common.Address, error) {
+ return _EmissionsController.Contract.Owner(&_EmissionsController.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
+//
+// Solidity: function paused(uint8 index) view returns(bool)
+func (_EmissionsController *EmissionsControllerCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "paused", index)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
+//
+// Solidity: function paused(uint8 index) view returns(bool)
+func (_EmissionsController *EmissionsControllerSession) Paused(index uint8) (bool, error) {
+ return _EmissionsController.Contract.Paused(&_EmissionsController.CallOpts, index)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
+//
+// Solidity: function paused(uint8 index) view returns(bool)
+func (_EmissionsController *EmissionsControllerCallerSession) Paused(index uint8) (bool, error) {
+ return _EmissionsController.Contract.Paused(&_EmissionsController.CallOpts, index)
+}
+
+// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCaller) Paused0(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "paused0")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(uint256)
+func (_EmissionsController *EmissionsControllerSession) Paused0() (*big.Int, error) {
+ return _EmissionsController.Contract.Paused0(&_EmissionsController.CallOpts)
+}
+
+// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(uint256)
+func (_EmissionsController *EmissionsControllerCallerSession) Paused0() (*big.Int, error) {
+ return _EmissionsController.Contract.Paused0(&_EmissionsController.CallOpts)
+}
+
+// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
+//
+// Solidity: function pauserRegistry() view returns(address)
+func (_EmissionsController *EmissionsControllerCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "pauserRegistry")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
+//
+// Solidity: function pauserRegistry() view returns(address)
+func (_EmissionsController *EmissionsControllerSession) PauserRegistry() (common.Address, error) {
+ return _EmissionsController.Contract.PauserRegistry(&_EmissionsController.CallOpts)
+}
+
+// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
+//
+// Solidity: function pauserRegistry() view returns(address)
+func (_EmissionsController *EmissionsControllerCallerSession) PauserRegistry() (common.Address, error) {
+ return _EmissionsController.Contract.PauserRegistry(&_EmissionsController.CallOpts)
+}
+
+// TotalWeight is a free data retrieval call binding the contract method 0x96c82e57.
+//
+// Solidity: function totalWeight() view returns(uint16)
+func (_EmissionsController *EmissionsControllerCaller) TotalWeight(opts *bind.CallOpts) (uint16, error) {
+ var out []interface{}
+ err := _EmissionsController.contract.Call(opts, &out, "totalWeight")
+
+ if err != nil {
+ return *new(uint16), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16)
+
+ return out0, err
+
+}
+
+// TotalWeight is a free data retrieval call binding the contract method 0x96c82e57.
+//
+// Solidity: function totalWeight() view returns(uint16)
+func (_EmissionsController *EmissionsControllerSession) TotalWeight() (uint16, error) {
+ return _EmissionsController.Contract.TotalWeight(&_EmissionsController.CallOpts)
+}
+
+// TotalWeight is a free data retrieval call binding the contract method 0x96c82e57.
+//
+// Solidity: function totalWeight() view returns(uint16)
+func (_EmissionsController *EmissionsControllerCallerSession) TotalWeight() (uint16, error) {
+ return _EmissionsController.Contract.TotalWeight(&_EmissionsController.CallOpts)
+}
+
+// AddDistribution is a paid mutator transaction binding the contract method 0xcd1e341b.
+//
+// Solidity: function addDistribution((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns(uint256 distributionId)
+func (_EmissionsController *EmissionsControllerTransactor) AddDistribution(opts *bind.TransactOpts, distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _EmissionsController.contract.Transact(opts, "addDistribution", distribution)
+}
+
+// AddDistribution is a paid mutator transaction binding the contract method 0xcd1e341b.
+//
+// Solidity: function addDistribution((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns(uint256 distributionId)
+func (_EmissionsController *EmissionsControllerSession) AddDistribution(distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _EmissionsController.Contract.AddDistribution(&_EmissionsController.TransactOpts, distribution)
+}
+
+// AddDistribution is a paid mutator transaction binding the contract method 0xcd1e341b.
+//
+// Solidity: function addDistribution((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns(uint256 distributionId)
+func (_EmissionsController *EmissionsControllerTransactorSession) AddDistribution(distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _EmissionsController.Contract.AddDistribution(&_EmissionsController.TransactOpts, distribution)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c.
+//
+// Solidity: function initialize(address initialOwner, address initialIncentiveCouncil, uint256 initialPausedStatus) returns()
+func (_EmissionsController *EmissionsControllerTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialIncentiveCouncil common.Address, initialPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsController.contract.Transact(opts, "initialize", initialOwner, initialIncentiveCouncil, initialPausedStatus)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c.
+//
+// Solidity: function initialize(address initialOwner, address initialIncentiveCouncil, uint256 initialPausedStatus) returns()
+func (_EmissionsController *EmissionsControllerSession) Initialize(initialOwner common.Address, initialIncentiveCouncil common.Address, initialPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsController.Contract.Initialize(&_EmissionsController.TransactOpts, initialOwner, initialIncentiveCouncil, initialPausedStatus)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c.
+//
+// Solidity: function initialize(address initialOwner, address initialIncentiveCouncil, uint256 initialPausedStatus) returns()
+func (_EmissionsController *EmissionsControllerTransactorSession) Initialize(initialOwner common.Address, initialIncentiveCouncil common.Address, initialPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsController.Contract.Initialize(&_EmissionsController.TransactOpts, initialOwner, initialIncentiveCouncil, initialPausedStatus)
+}
+
+// Pause is a paid mutator transaction binding the contract method 0x136439dd.
+//
+// Solidity: function pause(uint256 newPausedStatus) returns()
+func (_EmissionsController *EmissionsControllerTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsController.contract.Transact(opts, "pause", newPausedStatus)
+}
+
+// Pause is a paid mutator transaction binding the contract method 0x136439dd.
+//
+// Solidity: function pause(uint256 newPausedStatus) returns()
+func (_EmissionsController *EmissionsControllerSession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsController.Contract.Pause(&_EmissionsController.TransactOpts, newPausedStatus)
+}
+
+// Pause is a paid mutator transaction binding the contract method 0x136439dd.
+//
+// Solidity: function pause(uint256 newPausedStatus) returns()
+func (_EmissionsController *EmissionsControllerTransactorSession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsController.Contract.Pause(&_EmissionsController.TransactOpts, newPausedStatus)
+}
+
+// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
+//
+// Solidity: function pauseAll() returns()
+func (_EmissionsController *EmissionsControllerTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _EmissionsController.contract.Transact(opts, "pauseAll")
+}
+
+// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
+//
+// Solidity: function pauseAll() returns()
+func (_EmissionsController *EmissionsControllerSession) PauseAll() (*types.Transaction, error) {
+ return _EmissionsController.Contract.PauseAll(&_EmissionsController.TransactOpts)
+}
+
+// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
+//
+// Solidity: function pauseAll() returns()
+func (_EmissionsController *EmissionsControllerTransactorSession) PauseAll() (*types.Transaction, error) {
+ return _EmissionsController.Contract.PauseAll(&_EmissionsController.TransactOpts)
+}
+
+// PressButton is a paid mutator transaction binding the contract method 0x400efa85.
+//
+// Solidity: function pressButton(uint256 length) returns()
+func (_EmissionsController *EmissionsControllerTransactor) PressButton(opts *bind.TransactOpts, length *big.Int) (*types.Transaction, error) {
+ return _EmissionsController.contract.Transact(opts, "pressButton", length)
+}
+
+// PressButton is a paid mutator transaction binding the contract method 0x400efa85.
+//
+// Solidity: function pressButton(uint256 length) returns()
+func (_EmissionsController *EmissionsControllerSession) PressButton(length *big.Int) (*types.Transaction, error) {
+ return _EmissionsController.Contract.PressButton(&_EmissionsController.TransactOpts, length)
+}
+
+// PressButton is a paid mutator transaction binding the contract method 0x400efa85.
+//
+// Solidity: function pressButton(uint256 length) returns()
+func (_EmissionsController *EmissionsControllerTransactorSession) PressButton(length *big.Int) (*types.Transaction, error) {
+ return _EmissionsController.Contract.PressButton(&_EmissionsController.TransactOpts, length)
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_EmissionsController *EmissionsControllerTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _EmissionsController.contract.Transact(opts, "renounceOwnership")
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_EmissionsController *EmissionsControllerSession) RenounceOwnership() (*types.Transaction, error) {
+ return _EmissionsController.Contract.RenounceOwnership(&_EmissionsController.TransactOpts)
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_EmissionsController *EmissionsControllerTransactorSession) RenounceOwnership() (*types.Transaction, error) {
+ return _EmissionsController.Contract.RenounceOwnership(&_EmissionsController.TransactOpts)
+}
+
+// SetIncentiveCouncil is a paid mutator transaction binding the contract method 0xc695acdb.
+//
+// Solidity: function setIncentiveCouncil(address newIncentiveCouncil) returns()
+func (_EmissionsController *EmissionsControllerTransactor) SetIncentiveCouncil(opts *bind.TransactOpts, newIncentiveCouncil common.Address) (*types.Transaction, error) {
+ return _EmissionsController.contract.Transact(opts, "setIncentiveCouncil", newIncentiveCouncil)
+}
+
+// SetIncentiveCouncil is a paid mutator transaction binding the contract method 0xc695acdb.
+//
+// Solidity: function setIncentiveCouncil(address newIncentiveCouncil) returns()
+func (_EmissionsController *EmissionsControllerSession) SetIncentiveCouncil(newIncentiveCouncil common.Address) (*types.Transaction, error) {
+ return _EmissionsController.Contract.SetIncentiveCouncil(&_EmissionsController.TransactOpts, newIncentiveCouncil)
+}
+
+// SetIncentiveCouncil is a paid mutator transaction binding the contract method 0xc695acdb.
+//
+// Solidity: function setIncentiveCouncil(address newIncentiveCouncil) returns()
+func (_EmissionsController *EmissionsControllerTransactorSession) SetIncentiveCouncil(newIncentiveCouncil common.Address) (*types.Transaction, error) {
+ return _EmissionsController.Contract.SetIncentiveCouncil(&_EmissionsController.TransactOpts, newIncentiveCouncil)
+}
+
+// Sweep is a paid mutator transaction binding the contract method 0x35faa416.
+//
+// Solidity: function sweep() returns()
+func (_EmissionsController *EmissionsControllerTransactor) Sweep(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _EmissionsController.contract.Transact(opts, "sweep")
+}
+
+// Sweep is a paid mutator transaction binding the contract method 0x35faa416.
+//
+// Solidity: function sweep() returns()
+func (_EmissionsController *EmissionsControllerSession) Sweep() (*types.Transaction, error) {
+ return _EmissionsController.Contract.Sweep(&_EmissionsController.TransactOpts)
+}
+
+// Sweep is a paid mutator transaction binding the contract method 0x35faa416.
+//
+// Solidity: function sweep() returns()
+func (_EmissionsController *EmissionsControllerTransactorSession) Sweep() (*types.Transaction, error) {
+ return _EmissionsController.Contract.Sweep(&_EmissionsController.TransactOpts)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_EmissionsController *EmissionsControllerTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
+ return _EmissionsController.contract.Transact(opts, "transferOwnership", newOwner)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_EmissionsController *EmissionsControllerSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
+ return _EmissionsController.Contract.TransferOwnership(&_EmissionsController.TransactOpts, newOwner)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_EmissionsController *EmissionsControllerTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
+ return _EmissionsController.Contract.TransferOwnership(&_EmissionsController.TransactOpts, newOwner)
+}
+
+// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
+//
+// Solidity: function unpause(uint256 newPausedStatus) returns()
+func (_EmissionsController *EmissionsControllerTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsController.contract.Transact(opts, "unpause", newPausedStatus)
+}
+
+// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
+//
+// Solidity: function unpause(uint256 newPausedStatus) returns()
+func (_EmissionsController *EmissionsControllerSession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsController.Contract.Unpause(&_EmissionsController.TransactOpts, newPausedStatus)
+}
+
+// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
+//
+// Solidity: function unpause(uint256 newPausedStatus) returns()
+func (_EmissionsController *EmissionsControllerTransactorSession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsController.Contract.Unpause(&_EmissionsController.TransactOpts, newPausedStatus)
+}
+
+// UpdateDistribution is a paid mutator transaction binding the contract method 0x44a32028.
+//
+// Solidity: function updateDistribution(uint256 distributionId, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns()
+func (_EmissionsController *EmissionsControllerTransactor) UpdateDistribution(opts *bind.TransactOpts, distributionId *big.Int, distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _EmissionsController.contract.Transact(opts, "updateDistribution", distributionId, distribution)
+}
+
+// UpdateDistribution is a paid mutator transaction binding the contract method 0x44a32028.
+//
+// Solidity: function updateDistribution(uint256 distributionId, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns()
+func (_EmissionsController *EmissionsControllerSession) UpdateDistribution(distributionId *big.Int, distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _EmissionsController.Contract.UpdateDistribution(&_EmissionsController.TransactOpts, distributionId, distribution)
+}
+
+// UpdateDistribution is a paid mutator transaction binding the contract method 0x44a32028.
+//
+// Solidity: function updateDistribution(uint256 distributionId, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns()
+func (_EmissionsController *EmissionsControllerTransactorSession) UpdateDistribution(distributionId *big.Int, distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _EmissionsController.Contract.UpdateDistribution(&_EmissionsController.TransactOpts, distributionId, distribution)
+}
+
+// EmissionsControllerDistributionAddedIterator is returned from FilterDistributionAdded and is used to iterate over the raw logs and unpacked data for DistributionAdded events raised by the EmissionsController contract.
+type EmissionsControllerDistributionAddedIterator struct {
+ Event *EmissionsControllerDistributionAdded // 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 *EmissionsControllerDistributionAddedIterator) 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(EmissionsControllerDistributionAdded)
+ 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(EmissionsControllerDistributionAdded)
+ 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 *EmissionsControllerDistributionAddedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerDistributionAddedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerDistributionAdded represents a DistributionAdded event raised by the EmissionsController contract.
+type EmissionsControllerDistributionAdded struct {
+ DistributionId *big.Int
+ Epoch *big.Int
+ Distribution IEmissionsControllerTypesDistribution
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDistributionAdded is a free log retrieval operation binding the contract event 0x006f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef.
+//
+// Solidity: event DistributionAdded(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_EmissionsController *EmissionsControllerFilterer) FilterDistributionAdded(opts *bind.FilterOpts, distributionId []*big.Int, epoch []*big.Int) (*EmissionsControllerDistributionAddedIterator, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.FilterLogs(opts, "DistributionAdded", distributionIdRule, epochRule)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerDistributionAddedIterator{contract: _EmissionsController.contract, event: "DistributionAdded", logs: logs, sub: sub}, nil
+}
+
+// WatchDistributionAdded is a free log subscription operation binding the contract event 0x006f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef.
+//
+// Solidity: event DistributionAdded(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_EmissionsController *EmissionsControllerFilterer) WatchDistributionAdded(opts *bind.WatchOpts, sink chan<- *EmissionsControllerDistributionAdded, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.WatchLogs(opts, "DistributionAdded", distributionIdRule, epochRule)
+ 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(EmissionsControllerDistributionAdded)
+ if err := _EmissionsController.contract.UnpackLog(event, "DistributionAdded", 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
+}
+
+// ParseDistributionAdded is a log parse operation binding the contract event 0x006f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef.
+//
+// Solidity: event DistributionAdded(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_EmissionsController *EmissionsControllerFilterer) ParseDistributionAdded(log types.Log) (*EmissionsControllerDistributionAdded, error) {
+ event := new(EmissionsControllerDistributionAdded)
+ if err := _EmissionsController.contract.UnpackLog(event, "DistributionAdded", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// EmissionsControllerDistributionProcessedIterator is returned from FilterDistributionProcessed and is used to iterate over the raw logs and unpacked data for DistributionProcessed events raised by the EmissionsController contract.
+type EmissionsControllerDistributionProcessedIterator struct {
+ Event *EmissionsControllerDistributionProcessed // 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 *EmissionsControllerDistributionProcessedIterator) 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(EmissionsControllerDistributionProcessed)
+ 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(EmissionsControllerDistributionProcessed)
+ 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 *EmissionsControllerDistributionProcessedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerDistributionProcessedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerDistributionProcessed represents a DistributionProcessed event raised by the EmissionsController contract.
+type EmissionsControllerDistributionProcessed struct {
+ DistributionId *big.Int
+ Epoch *big.Int
+ Distribution IEmissionsControllerTypesDistribution
+ Success bool
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDistributionProcessed is a free log retrieval operation binding the contract event 0xba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b.
+//
+// Solidity: event DistributionProcessed(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution, bool success)
+func (_EmissionsController *EmissionsControllerFilterer) FilterDistributionProcessed(opts *bind.FilterOpts, distributionId []*big.Int, epoch []*big.Int) (*EmissionsControllerDistributionProcessedIterator, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.FilterLogs(opts, "DistributionProcessed", distributionIdRule, epochRule)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerDistributionProcessedIterator{contract: _EmissionsController.contract, event: "DistributionProcessed", logs: logs, sub: sub}, nil
+}
+
+// WatchDistributionProcessed is a free log subscription operation binding the contract event 0xba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b.
+//
+// Solidity: event DistributionProcessed(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution, bool success)
+func (_EmissionsController *EmissionsControllerFilterer) WatchDistributionProcessed(opts *bind.WatchOpts, sink chan<- *EmissionsControllerDistributionProcessed, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.WatchLogs(opts, "DistributionProcessed", distributionIdRule, epochRule)
+ 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(EmissionsControllerDistributionProcessed)
+ if err := _EmissionsController.contract.UnpackLog(event, "DistributionProcessed", 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
+}
+
+// ParseDistributionProcessed is a log parse operation binding the contract event 0xba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b.
+//
+// Solidity: event DistributionProcessed(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution, bool success)
+func (_EmissionsController *EmissionsControllerFilterer) ParseDistributionProcessed(log types.Log) (*EmissionsControllerDistributionProcessed, error) {
+ event := new(EmissionsControllerDistributionProcessed)
+ if err := _EmissionsController.contract.UnpackLog(event, "DistributionProcessed", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// EmissionsControllerDistributionUpdatedIterator is returned from FilterDistributionUpdated and is used to iterate over the raw logs and unpacked data for DistributionUpdated events raised by the EmissionsController contract.
+type EmissionsControllerDistributionUpdatedIterator struct {
+ Event *EmissionsControllerDistributionUpdated // 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 *EmissionsControllerDistributionUpdatedIterator) 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(EmissionsControllerDistributionUpdated)
+ 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(EmissionsControllerDistributionUpdated)
+ 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 *EmissionsControllerDistributionUpdatedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerDistributionUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerDistributionUpdated represents a DistributionUpdated event raised by the EmissionsController contract.
+type EmissionsControllerDistributionUpdated struct {
+ DistributionId *big.Int
+ Epoch *big.Int
+ Distribution IEmissionsControllerTypesDistribution
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDistributionUpdated is a free log retrieval operation binding the contract event 0x548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c.
+//
+// Solidity: event DistributionUpdated(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_EmissionsController *EmissionsControllerFilterer) FilterDistributionUpdated(opts *bind.FilterOpts, distributionId []*big.Int, epoch []*big.Int) (*EmissionsControllerDistributionUpdatedIterator, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.FilterLogs(opts, "DistributionUpdated", distributionIdRule, epochRule)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerDistributionUpdatedIterator{contract: _EmissionsController.contract, event: "DistributionUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchDistributionUpdated is a free log subscription operation binding the contract event 0x548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c.
+//
+// Solidity: event DistributionUpdated(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_EmissionsController *EmissionsControllerFilterer) WatchDistributionUpdated(opts *bind.WatchOpts, sink chan<- *EmissionsControllerDistributionUpdated, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.WatchLogs(opts, "DistributionUpdated", distributionIdRule, epochRule)
+ 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(EmissionsControllerDistributionUpdated)
+ if err := _EmissionsController.contract.UnpackLog(event, "DistributionUpdated", 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
+}
+
+// ParseDistributionUpdated is a log parse operation binding the contract event 0x548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c.
+//
+// Solidity: event DistributionUpdated(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_EmissionsController *EmissionsControllerFilterer) ParseDistributionUpdated(log types.Log) (*EmissionsControllerDistributionUpdated, error) {
+ event := new(EmissionsControllerDistributionUpdated)
+ if err := _EmissionsController.contract.UnpackLog(event, "DistributionUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// EmissionsControllerIncentiveCouncilUpdatedIterator is returned from FilterIncentiveCouncilUpdated and is used to iterate over the raw logs and unpacked data for IncentiveCouncilUpdated events raised by the EmissionsController contract.
+type EmissionsControllerIncentiveCouncilUpdatedIterator struct {
+ Event *EmissionsControllerIncentiveCouncilUpdated // 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 *EmissionsControllerIncentiveCouncilUpdatedIterator) 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(EmissionsControllerIncentiveCouncilUpdated)
+ 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(EmissionsControllerIncentiveCouncilUpdated)
+ 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 *EmissionsControllerIncentiveCouncilUpdatedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerIncentiveCouncilUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerIncentiveCouncilUpdated represents a IncentiveCouncilUpdated event raised by the EmissionsController contract.
+type EmissionsControllerIncentiveCouncilUpdated struct {
+ IncentiveCouncil common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterIncentiveCouncilUpdated is a free log retrieval operation binding the contract event 0x8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216.
+//
+// Solidity: event IncentiveCouncilUpdated(address indexed incentiveCouncil)
+func (_EmissionsController *EmissionsControllerFilterer) FilterIncentiveCouncilUpdated(opts *bind.FilterOpts, incentiveCouncil []common.Address) (*EmissionsControllerIncentiveCouncilUpdatedIterator, error) {
+
+ var incentiveCouncilRule []interface{}
+ for _, incentiveCouncilItem := range incentiveCouncil {
+ incentiveCouncilRule = append(incentiveCouncilRule, incentiveCouncilItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.FilterLogs(opts, "IncentiveCouncilUpdated", incentiveCouncilRule)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerIncentiveCouncilUpdatedIterator{contract: _EmissionsController.contract, event: "IncentiveCouncilUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchIncentiveCouncilUpdated is a free log subscription operation binding the contract event 0x8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216.
+//
+// Solidity: event IncentiveCouncilUpdated(address indexed incentiveCouncil)
+func (_EmissionsController *EmissionsControllerFilterer) WatchIncentiveCouncilUpdated(opts *bind.WatchOpts, sink chan<- *EmissionsControllerIncentiveCouncilUpdated, incentiveCouncil []common.Address) (event.Subscription, error) {
+
+ var incentiveCouncilRule []interface{}
+ for _, incentiveCouncilItem := range incentiveCouncil {
+ incentiveCouncilRule = append(incentiveCouncilRule, incentiveCouncilItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.WatchLogs(opts, "IncentiveCouncilUpdated", incentiveCouncilRule)
+ 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(EmissionsControllerIncentiveCouncilUpdated)
+ if err := _EmissionsController.contract.UnpackLog(event, "IncentiveCouncilUpdated", 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
+}
+
+// ParseIncentiveCouncilUpdated is a log parse operation binding the contract event 0x8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216.
+//
+// Solidity: event IncentiveCouncilUpdated(address indexed incentiveCouncil)
+func (_EmissionsController *EmissionsControllerFilterer) ParseIncentiveCouncilUpdated(log types.Log) (*EmissionsControllerIncentiveCouncilUpdated, error) {
+ event := new(EmissionsControllerIncentiveCouncilUpdated)
+ if err := _EmissionsController.contract.UnpackLog(event, "IncentiveCouncilUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// EmissionsControllerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the EmissionsController contract.
+type EmissionsControllerInitializedIterator struct {
+ Event *EmissionsControllerInitialized // 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 *EmissionsControllerInitializedIterator) 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(EmissionsControllerInitialized)
+ 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(EmissionsControllerInitialized)
+ 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 *EmissionsControllerInitializedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerInitializedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerInitialized represents a Initialized event raised by the EmissionsController contract.
+type EmissionsControllerInitialized struct {
+ Version uint8
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_EmissionsController *EmissionsControllerFilterer) FilterInitialized(opts *bind.FilterOpts) (*EmissionsControllerInitializedIterator, error) {
+
+ logs, sub, err := _EmissionsController.contract.FilterLogs(opts, "Initialized")
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerInitializedIterator{contract: _EmissionsController.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_EmissionsController *EmissionsControllerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *EmissionsControllerInitialized) (event.Subscription, error) {
+
+ logs, sub, err := _EmissionsController.contract.WatchLogs(opts, "Initialized")
+ 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(EmissionsControllerInitialized)
+ if err := _EmissionsController.contract.UnpackLog(event, "Initialized", 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
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_EmissionsController *EmissionsControllerFilterer) ParseInitialized(log types.Log) (*EmissionsControllerInitialized, error) {
+ event := new(EmissionsControllerInitialized)
+ if err := _EmissionsController.contract.UnpackLog(event, "Initialized", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// EmissionsControllerOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the EmissionsController contract.
+type EmissionsControllerOwnershipTransferredIterator struct {
+ Event *EmissionsControllerOwnershipTransferred // 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 *EmissionsControllerOwnershipTransferredIterator) 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(EmissionsControllerOwnershipTransferred)
+ 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(EmissionsControllerOwnershipTransferred)
+ 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 *EmissionsControllerOwnershipTransferredIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerOwnershipTransferredIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerOwnershipTransferred represents a OwnershipTransferred event raised by the EmissionsController contract.
+type EmissionsControllerOwnershipTransferred struct {
+ PreviousOwner common.Address
+ NewOwner common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_EmissionsController *EmissionsControllerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*EmissionsControllerOwnershipTransferredIterator, error) {
+
+ var previousOwnerRule []interface{}
+ for _, previousOwnerItem := range previousOwner {
+ previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
+ }
+ var newOwnerRule []interface{}
+ for _, newOwnerItem := range newOwner {
+ newOwnerRule = append(newOwnerRule, newOwnerItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerOwnershipTransferredIterator{contract: _EmissionsController.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_EmissionsController *EmissionsControllerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *EmissionsControllerOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) {
+
+ var previousOwnerRule []interface{}
+ for _, previousOwnerItem := range previousOwner {
+ previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
+ }
+ var newOwnerRule []interface{}
+ for _, newOwnerItem := range newOwner {
+ newOwnerRule = append(newOwnerRule, newOwnerItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
+ 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(EmissionsControllerOwnershipTransferred)
+ if err := _EmissionsController.contract.UnpackLog(event, "OwnershipTransferred", 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
+}
+
+// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_EmissionsController *EmissionsControllerFilterer) ParseOwnershipTransferred(log types.Log) (*EmissionsControllerOwnershipTransferred, error) {
+ event := new(EmissionsControllerOwnershipTransferred)
+ if err := _EmissionsController.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// EmissionsControllerPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the EmissionsController contract.
+type EmissionsControllerPausedIterator struct {
+ Event *EmissionsControllerPaused // 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 *EmissionsControllerPausedIterator) 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(EmissionsControllerPaused)
+ 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(EmissionsControllerPaused)
+ 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 *EmissionsControllerPausedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerPausedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerPaused represents a Paused event raised by the EmissionsController contract.
+type EmissionsControllerPaused struct {
+ Account common.Address
+ NewPausedStatus *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterPaused is a free log retrieval operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
+//
+// Solidity: event Paused(address indexed account, uint256 newPausedStatus)
+func (_EmissionsController *EmissionsControllerFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*EmissionsControllerPausedIterator, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.FilterLogs(opts, "Paused", accountRule)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerPausedIterator{contract: _EmissionsController.contract, event: "Paused", logs: logs, sub: sub}, nil
+}
+
+// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
+//
+// Solidity: event Paused(address indexed account, uint256 newPausedStatus)
+func (_EmissionsController *EmissionsControllerFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *EmissionsControllerPaused, account []common.Address) (event.Subscription, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.WatchLogs(opts, "Paused", accountRule)
+ 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(EmissionsControllerPaused)
+ if err := _EmissionsController.contract.UnpackLog(event, "Paused", 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
+}
+
+// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
+//
+// Solidity: event Paused(address indexed account, uint256 newPausedStatus)
+func (_EmissionsController *EmissionsControllerFilterer) ParsePaused(log types.Log) (*EmissionsControllerPaused, error) {
+ event := new(EmissionsControllerPaused)
+ if err := _EmissionsController.contract.UnpackLog(event, "Paused", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// EmissionsControllerSweptIterator is returned from FilterSwept and is used to iterate over the raw logs and unpacked data for Swept events raised by the EmissionsController contract.
+type EmissionsControllerSweptIterator struct {
+ Event *EmissionsControllerSwept // 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 *EmissionsControllerSweptIterator) 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(EmissionsControllerSwept)
+ 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(EmissionsControllerSwept)
+ 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 *EmissionsControllerSweptIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerSweptIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerSwept represents a Swept event raised by the EmissionsController contract.
+type EmissionsControllerSwept struct {
+ IncentiveCouncil common.Address
+ Amount *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterSwept is a free log retrieval operation binding the contract event 0xc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe35109696.
+//
+// Solidity: event Swept(address indexed incentiveCouncil, uint256 amount)
+func (_EmissionsController *EmissionsControllerFilterer) FilterSwept(opts *bind.FilterOpts, incentiveCouncil []common.Address) (*EmissionsControllerSweptIterator, error) {
+
+ var incentiveCouncilRule []interface{}
+ for _, incentiveCouncilItem := range incentiveCouncil {
+ incentiveCouncilRule = append(incentiveCouncilRule, incentiveCouncilItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.FilterLogs(opts, "Swept", incentiveCouncilRule)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerSweptIterator{contract: _EmissionsController.contract, event: "Swept", logs: logs, sub: sub}, nil
+}
+
+// WatchSwept is a free log subscription operation binding the contract event 0xc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe35109696.
+//
+// Solidity: event Swept(address indexed incentiveCouncil, uint256 amount)
+func (_EmissionsController *EmissionsControllerFilterer) WatchSwept(opts *bind.WatchOpts, sink chan<- *EmissionsControllerSwept, incentiveCouncil []common.Address) (event.Subscription, error) {
+
+ var incentiveCouncilRule []interface{}
+ for _, incentiveCouncilItem := range incentiveCouncil {
+ incentiveCouncilRule = append(incentiveCouncilRule, incentiveCouncilItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.WatchLogs(opts, "Swept", incentiveCouncilRule)
+ 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(EmissionsControllerSwept)
+ if err := _EmissionsController.contract.UnpackLog(event, "Swept", 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
+}
+
+// ParseSwept is a log parse operation binding the contract event 0xc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe35109696.
+//
+// Solidity: event Swept(address indexed incentiveCouncil, uint256 amount)
+func (_EmissionsController *EmissionsControllerFilterer) ParseSwept(log types.Log) (*EmissionsControllerSwept, error) {
+ event := new(EmissionsControllerSwept)
+ if err := _EmissionsController.contract.UnpackLog(event, "Swept", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// EmissionsControllerUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the EmissionsController contract.
+type EmissionsControllerUnpausedIterator struct {
+ Event *EmissionsControllerUnpaused // 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 *EmissionsControllerUnpausedIterator) 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(EmissionsControllerUnpaused)
+ 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(EmissionsControllerUnpaused)
+ 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 *EmissionsControllerUnpausedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerUnpausedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerUnpaused represents a Unpaused event raised by the EmissionsController contract.
+type EmissionsControllerUnpaused struct {
+ Account common.Address
+ NewPausedStatus *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterUnpaused is a free log retrieval operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
+//
+// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus)
+func (_EmissionsController *EmissionsControllerFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*EmissionsControllerUnpausedIterator, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.FilterLogs(opts, "Unpaused", accountRule)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerUnpausedIterator{contract: _EmissionsController.contract, event: "Unpaused", logs: logs, sub: sub}, nil
+}
+
+// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
+//
+// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus)
+func (_EmissionsController *EmissionsControllerFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *EmissionsControllerUnpaused, account []common.Address) (event.Subscription, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _EmissionsController.contract.WatchLogs(opts, "Unpaused", accountRule)
+ 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(EmissionsControllerUnpaused)
+ if err := _EmissionsController.contract.UnpackLog(event, "Unpaused", 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
+}
+
+// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
+//
+// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus)
+func (_EmissionsController *EmissionsControllerFilterer) ParseUnpaused(log types.Log) (*EmissionsControllerUnpaused, error) {
+ event := new(EmissionsControllerUnpaused)
+ if err := _EmissionsController.contract.UnpackLog(event, "Unpaused", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
diff --git a/pkg/bindings/EmissionsControllerStorage/binding.go b/pkg/bindings/EmissionsControllerStorage/binding.go
new file mode 100644
index 0000000000..f9b47cc406
--- /dev/null
+++ b/pkg/bindings/EmissionsControllerStorage/binding.go
@@ -0,0 +1,2054 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package EmissionsControllerStorage
+
+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
+)
+
+// IEmissionsControllerTypesDistribution is an auto generated low-level Go binding around an user-defined struct.
+type IEmissionsControllerTypesDistribution struct {
+ Weight uint64
+ StartEpoch uint64
+ TotalEpochs uint64
+ DistributionType uint8
+ OperatorSet OperatorSet
+ StrategiesAndMultipliers [][]IRewardsCoordinatorTypesStrategyAndMultiplier
+}
+
+// IRewardsCoordinatorTypesStrategyAndMultiplier is an auto generated low-level Go binding around an user-defined struct.
+type IRewardsCoordinatorTypesStrategyAndMultiplier struct {
+ Strategy common.Address
+ Multiplier *big.Int
+}
+
+// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
+type OperatorSet struct {
+ Avs common.Address
+ Id uint32
+}
+
+// EmissionsControllerStorageMetaData contains all meta data concerning the EmissionsControllerStorage contract.
+var EmissionsControllerStorageMetaData = &bind.MetaData{
+ ABI: "[{\"type\":\"function\",\"name\":\"ALLOCATION_MANAGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BACKING_EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBackingEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EMISSIONS_EPOCH_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EMISSIONS_INFLATION_RATE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EMISSIONS_START_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_TOTAL_WEIGHT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"REWARDS_COORDINATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRewardsCoordinator\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addDistribution\",\"inputs\":[{\"name\":\"distribution\",\"type\":\"tuple\",\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"outputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentEpoch\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistribution\",\"inputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributions\",\"inputs\":[{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIEmissionsControllerTypes.Distribution[]\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTotalProcessableDistributions\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"incentiveCouncil\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"incentiveCouncil\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isButtonPressable\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastTimeButtonPressable\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextTimeButtonPressable\",\"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\":\"pressButton\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setIncentiveCouncil\",\"inputs\":[{\"name\":\"incentiveCouncil\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sweep\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"totalWeight\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateDistribution\",\"inputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"distribution\",\"type\":\"tuple\",\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"DistributionAdded\",\"inputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"epoch\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"distribution\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionProcessed\",\"inputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"epoch\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"distribution\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]},{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionUpdated\",\"inputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"epoch\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"distribution\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"IncentiveCouncilUpdated\",\"inputs\":[{\"name\":\"incentiveCouncil\",\"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\":\"Swept\",\"inputs\":[{\"name\":\"incentiveCouncil\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"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\":\"AllDistributionsMustBeProcessed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AllDistributionsProcessed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotIncentiveCouncil\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotAddDisabledDistribution\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmissionsNotStarted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EpochLengthNotAlignedWithCalculationInterval\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDistributionType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaliciousCallDetected\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorSetNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsSubmissionsCannotBeEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartEpochMustBeInTheFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimeNotAlignedWithCalculationInterval\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalWeightExceedsMax\",\"inputs\":[]}]",
+}
+
+// EmissionsControllerStorageABI is the input ABI used to generate the binding from.
+// Deprecated: Use EmissionsControllerStorageMetaData.ABI instead.
+var EmissionsControllerStorageABI = EmissionsControllerStorageMetaData.ABI
+
+// EmissionsControllerStorage is an auto generated Go binding around an Ethereum contract.
+type EmissionsControllerStorage struct {
+ EmissionsControllerStorageCaller // Read-only binding to the contract
+ EmissionsControllerStorageTransactor // Write-only binding to the contract
+ EmissionsControllerStorageFilterer // Log filterer for contract events
+}
+
+// EmissionsControllerStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
+type EmissionsControllerStorageCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// EmissionsControllerStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type EmissionsControllerStorageTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// EmissionsControllerStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type EmissionsControllerStorageFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// EmissionsControllerStorageSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type EmissionsControllerStorageSession struct {
+ Contract *EmissionsControllerStorage // 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
+}
+
+// EmissionsControllerStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type EmissionsControllerStorageCallerSession struct {
+ Contract *EmissionsControllerStorageCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// EmissionsControllerStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type EmissionsControllerStorageTransactorSession struct {
+ Contract *EmissionsControllerStorageTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// EmissionsControllerStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
+type EmissionsControllerStorageRaw struct {
+ Contract *EmissionsControllerStorage // Generic contract binding to access the raw methods on
+}
+
+// EmissionsControllerStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type EmissionsControllerStorageCallerRaw struct {
+ Contract *EmissionsControllerStorageCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// EmissionsControllerStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type EmissionsControllerStorageTransactorRaw struct {
+ Contract *EmissionsControllerStorageTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewEmissionsControllerStorage creates a new instance of EmissionsControllerStorage, bound to a specific deployed contract.
+func NewEmissionsControllerStorage(address common.Address, backend bind.ContractBackend) (*EmissionsControllerStorage, error) {
+ contract, err := bindEmissionsControllerStorage(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerStorage{EmissionsControllerStorageCaller: EmissionsControllerStorageCaller{contract: contract}, EmissionsControllerStorageTransactor: EmissionsControllerStorageTransactor{contract: contract}, EmissionsControllerStorageFilterer: EmissionsControllerStorageFilterer{contract: contract}}, nil
+}
+
+// NewEmissionsControllerStorageCaller creates a new read-only instance of EmissionsControllerStorage, bound to a specific deployed contract.
+func NewEmissionsControllerStorageCaller(address common.Address, caller bind.ContractCaller) (*EmissionsControllerStorageCaller, error) {
+ contract, err := bindEmissionsControllerStorage(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerStorageCaller{contract: contract}, nil
+}
+
+// NewEmissionsControllerStorageTransactor creates a new write-only instance of EmissionsControllerStorage, bound to a specific deployed contract.
+func NewEmissionsControllerStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*EmissionsControllerStorageTransactor, error) {
+ contract, err := bindEmissionsControllerStorage(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerStorageTransactor{contract: contract}, nil
+}
+
+// NewEmissionsControllerStorageFilterer creates a new log filterer instance of EmissionsControllerStorage, bound to a specific deployed contract.
+func NewEmissionsControllerStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*EmissionsControllerStorageFilterer, error) {
+ contract, err := bindEmissionsControllerStorage(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerStorageFilterer{contract: contract}, nil
+}
+
+// bindEmissionsControllerStorage binds a generic wrapper to an already deployed contract.
+func bindEmissionsControllerStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := EmissionsControllerStorageMetaData.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 (_EmissionsControllerStorage *EmissionsControllerStorageRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _EmissionsControllerStorage.Contract.EmissionsControllerStorageCaller.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 (_EmissionsControllerStorage *EmissionsControllerStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.EmissionsControllerStorageTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_EmissionsControllerStorage *EmissionsControllerStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.EmissionsControllerStorageTransactor.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 (_EmissionsControllerStorage *EmissionsControllerStorageCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _EmissionsControllerStorage.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 (_EmissionsControllerStorage *EmissionsControllerStorageTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.contract.Transact(opts, method, params...)
+}
+
+// ALLOCATIONMANAGER is a free data retrieval call binding the contract method 0x31232bc9.
+//
+// Solidity: function ALLOCATION_MANAGER() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) ALLOCATIONMANAGER(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "ALLOCATION_MANAGER")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// ALLOCATIONMANAGER is a free data retrieval call binding the contract method 0x31232bc9.
+//
+// Solidity: function ALLOCATION_MANAGER() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) ALLOCATIONMANAGER() (common.Address, error) {
+ return _EmissionsControllerStorage.Contract.ALLOCATIONMANAGER(&_EmissionsControllerStorage.CallOpts)
+}
+
+// ALLOCATIONMANAGER is a free data retrieval call binding the contract method 0x31232bc9.
+//
+// Solidity: function ALLOCATION_MANAGER() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) ALLOCATIONMANAGER() (common.Address, error) {
+ return _EmissionsControllerStorage.Contract.ALLOCATIONMANAGER(&_EmissionsControllerStorage.CallOpts)
+}
+
+// BACKINGEIGEN is a free data retrieval call binding the contract method 0xd455724e.
+//
+// Solidity: function BACKING_EIGEN() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) BACKINGEIGEN(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "BACKING_EIGEN")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// BACKINGEIGEN is a free data retrieval call binding the contract method 0xd455724e.
+//
+// Solidity: function BACKING_EIGEN() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) BACKINGEIGEN() (common.Address, error) {
+ return _EmissionsControllerStorage.Contract.BACKINGEIGEN(&_EmissionsControllerStorage.CallOpts)
+}
+
+// BACKINGEIGEN is a free data retrieval call binding the contract method 0xd455724e.
+//
+// Solidity: function BACKING_EIGEN() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) BACKINGEIGEN() (common.Address, error) {
+ return _EmissionsControllerStorage.Contract.BACKINGEIGEN(&_EmissionsControllerStorage.CallOpts)
+}
+
+// EIGEN is a free data retrieval call binding the contract method 0xfdc371ce.
+//
+// Solidity: function EIGEN() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) EIGEN(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "EIGEN")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// EIGEN is a free data retrieval call binding the contract method 0xfdc371ce.
+//
+// Solidity: function EIGEN() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) EIGEN() (common.Address, error) {
+ return _EmissionsControllerStorage.Contract.EIGEN(&_EmissionsControllerStorage.CallOpts)
+}
+
+// EIGEN is a free data retrieval call binding the contract method 0xfdc371ce.
+//
+// Solidity: function EIGEN() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) EIGEN() (common.Address, error) {
+ return _EmissionsControllerStorage.Contract.EIGEN(&_EmissionsControllerStorage.CallOpts)
+}
+
+// EMISSIONSEPOCHLENGTH is a free data retrieval call binding the contract method 0xc2f208e4.
+//
+// Solidity: function EMISSIONS_EPOCH_LENGTH() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) EMISSIONSEPOCHLENGTH(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "EMISSIONS_EPOCH_LENGTH")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// EMISSIONSEPOCHLENGTH is a free data retrieval call binding the contract method 0xc2f208e4.
+//
+// Solidity: function EMISSIONS_EPOCH_LENGTH() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) EMISSIONSEPOCHLENGTH() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.EMISSIONSEPOCHLENGTH(&_EmissionsControllerStorage.CallOpts)
+}
+
+// EMISSIONSEPOCHLENGTH is a free data retrieval call binding the contract method 0xc2f208e4.
+//
+// Solidity: function EMISSIONS_EPOCH_LENGTH() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) EMISSIONSEPOCHLENGTH() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.EMISSIONSEPOCHLENGTH(&_EmissionsControllerStorage.CallOpts)
+}
+
+// EMISSIONSINFLATIONRATE is a free data retrieval call binding the contract method 0x47a28ea2.
+//
+// Solidity: function EMISSIONS_INFLATION_RATE() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) EMISSIONSINFLATIONRATE(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "EMISSIONS_INFLATION_RATE")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// EMISSIONSINFLATIONRATE is a free data retrieval call binding the contract method 0x47a28ea2.
+//
+// Solidity: function EMISSIONS_INFLATION_RATE() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) EMISSIONSINFLATIONRATE() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.EMISSIONSINFLATIONRATE(&_EmissionsControllerStorage.CallOpts)
+}
+
+// EMISSIONSINFLATIONRATE is a free data retrieval call binding the contract method 0x47a28ea2.
+//
+// Solidity: function EMISSIONS_INFLATION_RATE() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) EMISSIONSINFLATIONRATE() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.EMISSIONSINFLATIONRATE(&_EmissionsControllerStorage.CallOpts)
+}
+
+// EMISSIONSSTARTTIME is a free data retrieval call binding the contract method 0xc9d3eff9.
+//
+// Solidity: function EMISSIONS_START_TIME() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) EMISSIONSSTARTTIME(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "EMISSIONS_START_TIME")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// EMISSIONSSTARTTIME is a free data retrieval call binding the contract method 0xc9d3eff9.
+//
+// Solidity: function EMISSIONS_START_TIME() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) EMISSIONSSTARTTIME() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.EMISSIONSSTARTTIME(&_EmissionsControllerStorage.CallOpts)
+}
+
+// EMISSIONSSTARTTIME is a free data retrieval call binding the contract method 0xc9d3eff9.
+//
+// Solidity: function EMISSIONS_START_TIME() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) EMISSIONSSTARTTIME() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.EMISSIONSSTARTTIME(&_EmissionsControllerStorage.CallOpts)
+}
+
+// MAXTOTALWEIGHT is a free data retrieval call binding the contract method 0x09a3bbe4.
+//
+// Solidity: function MAX_TOTAL_WEIGHT() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) MAXTOTALWEIGHT(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "MAX_TOTAL_WEIGHT")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// MAXTOTALWEIGHT is a free data retrieval call binding the contract method 0x09a3bbe4.
+//
+// Solidity: function MAX_TOTAL_WEIGHT() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) MAXTOTALWEIGHT() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.MAXTOTALWEIGHT(&_EmissionsControllerStorage.CallOpts)
+}
+
+// MAXTOTALWEIGHT is a free data retrieval call binding the contract method 0x09a3bbe4.
+//
+// Solidity: function MAX_TOTAL_WEIGHT() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) MAXTOTALWEIGHT() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.MAXTOTALWEIGHT(&_EmissionsControllerStorage.CallOpts)
+}
+
+// REWARDSCOORDINATOR is a free data retrieval call binding the contract method 0x71e2c264.
+//
+// Solidity: function REWARDS_COORDINATOR() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) REWARDSCOORDINATOR(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "REWARDS_COORDINATOR")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// REWARDSCOORDINATOR is a free data retrieval call binding the contract method 0x71e2c264.
+//
+// Solidity: function REWARDS_COORDINATOR() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) REWARDSCOORDINATOR() (common.Address, error) {
+ return _EmissionsControllerStorage.Contract.REWARDSCOORDINATOR(&_EmissionsControllerStorage.CallOpts)
+}
+
+// REWARDSCOORDINATOR is a free data retrieval call binding the contract method 0x71e2c264.
+//
+// Solidity: function REWARDS_COORDINATOR() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) REWARDSCOORDINATOR() (common.Address, error) {
+ return _EmissionsControllerStorage.Contract.REWARDSCOORDINATOR(&_EmissionsControllerStorage.CallOpts)
+}
+
+// GetCurrentEpoch is a free data retrieval call binding the contract method 0xb97dd9e2.
+//
+// Solidity: function getCurrentEpoch() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) GetCurrentEpoch(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "getCurrentEpoch")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// GetCurrentEpoch is a free data retrieval call binding the contract method 0xb97dd9e2.
+//
+// Solidity: function getCurrentEpoch() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) GetCurrentEpoch() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.GetCurrentEpoch(&_EmissionsControllerStorage.CallOpts)
+}
+
+// GetCurrentEpoch is a free data retrieval call binding the contract method 0xb97dd9e2.
+//
+// Solidity: function getCurrentEpoch() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) GetCurrentEpoch() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.GetCurrentEpoch(&_EmissionsControllerStorage.CallOpts)
+}
+
+// GetDistribution is a free data retrieval call binding the contract method 0x3b345a87.
+//
+// Solidity: function getDistribution(uint256 distributionId) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]))
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) GetDistribution(opts *bind.CallOpts, distributionId *big.Int) (IEmissionsControllerTypesDistribution, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "getDistribution", distributionId)
+
+ if err != nil {
+ return *new(IEmissionsControllerTypesDistribution), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(IEmissionsControllerTypesDistribution)).(*IEmissionsControllerTypesDistribution)
+
+ return out0, err
+
+}
+
+// GetDistribution is a free data retrieval call binding the contract method 0x3b345a87.
+//
+// Solidity: function getDistribution(uint256 distributionId) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]))
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) GetDistribution(distributionId *big.Int) (IEmissionsControllerTypesDistribution, error) {
+ return _EmissionsControllerStorage.Contract.GetDistribution(&_EmissionsControllerStorage.CallOpts, distributionId)
+}
+
+// GetDistribution is a free data retrieval call binding the contract method 0x3b345a87.
+//
+// Solidity: function getDistribution(uint256 distributionId) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]))
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) GetDistribution(distributionId *big.Int) (IEmissionsControllerTypesDistribution, error) {
+ return _EmissionsControllerStorage.Contract.GetDistribution(&_EmissionsControllerStorage.CallOpts, distributionId)
+}
+
+// GetDistributions is a free data retrieval call binding the contract method 0x147a7a5b.
+//
+// Solidity: function getDistributions(uint256 start, uint256 length) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][])[])
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) GetDistributions(opts *bind.CallOpts, start *big.Int, length *big.Int) ([]IEmissionsControllerTypesDistribution, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "getDistributions", start, length)
+
+ if err != nil {
+ return *new([]IEmissionsControllerTypesDistribution), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]IEmissionsControllerTypesDistribution)).(*[]IEmissionsControllerTypesDistribution)
+
+ return out0, err
+
+}
+
+// GetDistributions is a free data retrieval call binding the contract method 0x147a7a5b.
+//
+// Solidity: function getDistributions(uint256 start, uint256 length) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][])[])
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) GetDistributions(start *big.Int, length *big.Int) ([]IEmissionsControllerTypesDistribution, error) {
+ return _EmissionsControllerStorage.Contract.GetDistributions(&_EmissionsControllerStorage.CallOpts, start, length)
+}
+
+// GetDistributions is a free data retrieval call binding the contract method 0x147a7a5b.
+//
+// Solidity: function getDistributions(uint256 start, uint256 length) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][])[])
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) GetDistributions(start *big.Int, length *big.Int) ([]IEmissionsControllerTypesDistribution, error) {
+ return _EmissionsControllerStorage.Contract.GetDistributions(&_EmissionsControllerStorage.CallOpts, start, length)
+}
+
+// GetTotalProcessableDistributions is a free data retrieval call binding the contract method 0xbe851337.
+//
+// Solidity: function getTotalProcessableDistributions() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) GetTotalProcessableDistributions(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "getTotalProcessableDistributions")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// GetTotalProcessableDistributions is a free data retrieval call binding the contract method 0xbe851337.
+//
+// Solidity: function getTotalProcessableDistributions() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) GetTotalProcessableDistributions() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.GetTotalProcessableDistributions(&_EmissionsControllerStorage.CallOpts)
+}
+
+// GetTotalProcessableDistributions is a free data retrieval call binding the contract method 0xbe851337.
+//
+// Solidity: function getTotalProcessableDistributions() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) GetTotalProcessableDistributions() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.GetTotalProcessableDistributions(&_EmissionsControllerStorage.CallOpts)
+}
+
+// IncentiveCouncil is a free data retrieval call binding the contract method 0xc44cb727.
+//
+// Solidity: function incentiveCouncil() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) IncentiveCouncil(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "incentiveCouncil")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// IncentiveCouncil is a free data retrieval call binding the contract method 0xc44cb727.
+//
+// Solidity: function incentiveCouncil() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) IncentiveCouncil() (common.Address, error) {
+ return _EmissionsControllerStorage.Contract.IncentiveCouncil(&_EmissionsControllerStorage.CallOpts)
+}
+
+// IncentiveCouncil is a free data retrieval call binding the contract method 0xc44cb727.
+//
+// Solidity: function incentiveCouncil() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) IncentiveCouncil() (common.Address, error) {
+ return _EmissionsControllerStorage.Contract.IncentiveCouncil(&_EmissionsControllerStorage.CallOpts)
+}
+
+// IsButtonPressable is a free data retrieval call binding the contract method 0xd8393150.
+//
+// Solidity: function isButtonPressable() view returns(bool)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) IsButtonPressable(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "isButtonPressable")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsButtonPressable is a free data retrieval call binding the contract method 0xd8393150.
+//
+// Solidity: function isButtonPressable() view returns(bool)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) IsButtonPressable() (bool, error) {
+ return _EmissionsControllerStorage.Contract.IsButtonPressable(&_EmissionsControllerStorage.CallOpts)
+}
+
+// IsButtonPressable is a free data retrieval call binding the contract method 0xd8393150.
+//
+// Solidity: function isButtonPressable() view returns(bool)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) IsButtonPressable() (bool, error) {
+ return _EmissionsControllerStorage.Contract.IsButtonPressable(&_EmissionsControllerStorage.CallOpts)
+}
+
+// LastTimeButtonPressable is a free data retrieval call binding the contract method 0xd44b1c9e.
+//
+// Solidity: function lastTimeButtonPressable() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) LastTimeButtonPressable(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "lastTimeButtonPressable")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// LastTimeButtonPressable is a free data retrieval call binding the contract method 0xd44b1c9e.
+//
+// Solidity: function lastTimeButtonPressable() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) LastTimeButtonPressable() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.LastTimeButtonPressable(&_EmissionsControllerStorage.CallOpts)
+}
+
+// LastTimeButtonPressable is a free data retrieval call binding the contract method 0xd44b1c9e.
+//
+// Solidity: function lastTimeButtonPressable() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) LastTimeButtonPressable() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.LastTimeButtonPressable(&_EmissionsControllerStorage.CallOpts)
+}
+
+// NextTimeButtonPressable is a free data retrieval call binding the contract method 0xf769479f.
+//
+// Solidity: function nextTimeButtonPressable() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) NextTimeButtonPressable(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "nextTimeButtonPressable")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// NextTimeButtonPressable is a free data retrieval call binding the contract method 0xf769479f.
+//
+// Solidity: function nextTimeButtonPressable() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) NextTimeButtonPressable() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.NextTimeButtonPressable(&_EmissionsControllerStorage.CallOpts)
+}
+
+// NextTimeButtonPressable is a free data retrieval call binding the contract method 0xf769479f.
+//
+// Solidity: function nextTimeButtonPressable() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) NextTimeButtonPressable() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.NextTimeButtonPressable(&_EmissionsControllerStorage.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
+//
+// Solidity: function paused(uint8 index) view returns(bool)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "paused", index)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
+//
+// Solidity: function paused(uint8 index) view returns(bool)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) Paused(index uint8) (bool, error) {
+ return _EmissionsControllerStorage.Contract.Paused(&_EmissionsControllerStorage.CallOpts, index)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
+//
+// Solidity: function paused(uint8 index) view returns(bool)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) Paused(index uint8) (bool, error) {
+ return _EmissionsControllerStorage.Contract.Paused(&_EmissionsControllerStorage.CallOpts, index)
+}
+
+// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) Paused0(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "paused0")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) Paused0() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.Paused0(&_EmissionsControllerStorage.CallOpts)
+}
+
+// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(uint256)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) Paused0() (*big.Int, error) {
+ return _EmissionsControllerStorage.Contract.Paused0(&_EmissionsControllerStorage.CallOpts)
+}
+
+// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
+//
+// Solidity: function pauserRegistry() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "pauserRegistry")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
+//
+// Solidity: function pauserRegistry() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) PauserRegistry() (common.Address, error) {
+ return _EmissionsControllerStorage.Contract.PauserRegistry(&_EmissionsControllerStorage.CallOpts)
+}
+
+// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
+//
+// Solidity: function pauserRegistry() view returns(address)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) PauserRegistry() (common.Address, error) {
+ return _EmissionsControllerStorage.Contract.PauserRegistry(&_EmissionsControllerStorage.CallOpts)
+}
+
+// TotalWeight is a free data retrieval call binding the contract method 0x96c82e57.
+//
+// Solidity: function totalWeight() view returns(uint16)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCaller) TotalWeight(opts *bind.CallOpts) (uint16, error) {
+ var out []interface{}
+ err := _EmissionsControllerStorage.contract.Call(opts, &out, "totalWeight")
+
+ if err != nil {
+ return *new(uint16), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16)
+
+ return out0, err
+
+}
+
+// TotalWeight is a free data retrieval call binding the contract method 0x96c82e57.
+//
+// Solidity: function totalWeight() view returns(uint16)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) TotalWeight() (uint16, error) {
+ return _EmissionsControllerStorage.Contract.TotalWeight(&_EmissionsControllerStorage.CallOpts)
+}
+
+// TotalWeight is a free data retrieval call binding the contract method 0x96c82e57.
+//
+// Solidity: function totalWeight() view returns(uint16)
+func (_EmissionsControllerStorage *EmissionsControllerStorageCallerSession) TotalWeight() (uint16, error) {
+ return _EmissionsControllerStorage.Contract.TotalWeight(&_EmissionsControllerStorage.CallOpts)
+}
+
+// AddDistribution is a paid mutator transaction binding the contract method 0xcd1e341b.
+//
+// Solidity: function addDistribution((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns(uint256 distributionId)
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactor) AddDistribution(opts *bind.TransactOpts, distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.contract.Transact(opts, "addDistribution", distribution)
+}
+
+// AddDistribution is a paid mutator transaction binding the contract method 0xcd1e341b.
+//
+// Solidity: function addDistribution((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns(uint256 distributionId)
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) AddDistribution(distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.AddDistribution(&_EmissionsControllerStorage.TransactOpts, distribution)
+}
+
+// AddDistribution is a paid mutator transaction binding the contract method 0xcd1e341b.
+//
+// Solidity: function addDistribution((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns(uint256 distributionId)
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactorSession) AddDistribution(distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.AddDistribution(&_EmissionsControllerStorage.TransactOpts, distribution)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c.
+//
+// Solidity: function initialize(address initialOwner, address incentiveCouncil, uint256 initialPausedStatus) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, incentiveCouncil common.Address, initialPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.contract.Transact(opts, "initialize", initialOwner, incentiveCouncil, initialPausedStatus)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c.
+//
+// Solidity: function initialize(address initialOwner, address incentiveCouncil, uint256 initialPausedStatus) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) Initialize(initialOwner common.Address, incentiveCouncil common.Address, initialPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.Initialize(&_EmissionsControllerStorage.TransactOpts, initialOwner, incentiveCouncil, initialPausedStatus)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c.
+//
+// Solidity: function initialize(address initialOwner, address incentiveCouncil, uint256 initialPausedStatus) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactorSession) Initialize(initialOwner common.Address, incentiveCouncil common.Address, initialPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.Initialize(&_EmissionsControllerStorage.TransactOpts, initialOwner, incentiveCouncil, initialPausedStatus)
+}
+
+// Pause is a paid mutator transaction binding the contract method 0x136439dd.
+//
+// Solidity: function pause(uint256 newPausedStatus) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.contract.Transact(opts, "pause", newPausedStatus)
+}
+
+// Pause is a paid mutator transaction binding the contract method 0x136439dd.
+//
+// Solidity: function pause(uint256 newPausedStatus) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.Pause(&_EmissionsControllerStorage.TransactOpts, newPausedStatus)
+}
+
+// Pause is a paid mutator transaction binding the contract method 0x136439dd.
+//
+// Solidity: function pause(uint256 newPausedStatus) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactorSession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.Pause(&_EmissionsControllerStorage.TransactOpts, newPausedStatus)
+}
+
+// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
+//
+// Solidity: function pauseAll() returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.contract.Transact(opts, "pauseAll")
+}
+
+// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
+//
+// Solidity: function pauseAll() returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) PauseAll() (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.PauseAll(&_EmissionsControllerStorage.TransactOpts)
+}
+
+// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
+//
+// Solidity: function pauseAll() returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactorSession) PauseAll() (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.PauseAll(&_EmissionsControllerStorage.TransactOpts)
+}
+
+// PressButton is a paid mutator transaction binding the contract method 0x400efa85.
+//
+// Solidity: function pressButton(uint256 length) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactor) PressButton(opts *bind.TransactOpts, length *big.Int) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.contract.Transact(opts, "pressButton", length)
+}
+
+// PressButton is a paid mutator transaction binding the contract method 0x400efa85.
+//
+// Solidity: function pressButton(uint256 length) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) PressButton(length *big.Int) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.PressButton(&_EmissionsControllerStorage.TransactOpts, length)
+}
+
+// PressButton is a paid mutator transaction binding the contract method 0x400efa85.
+//
+// Solidity: function pressButton(uint256 length) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactorSession) PressButton(length *big.Int) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.PressButton(&_EmissionsControllerStorage.TransactOpts, length)
+}
+
+// SetIncentiveCouncil is a paid mutator transaction binding the contract method 0xc695acdb.
+//
+// Solidity: function setIncentiveCouncil(address incentiveCouncil) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactor) SetIncentiveCouncil(opts *bind.TransactOpts, incentiveCouncil common.Address) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.contract.Transact(opts, "setIncentiveCouncil", incentiveCouncil)
+}
+
+// SetIncentiveCouncil is a paid mutator transaction binding the contract method 0xc695acdb.
+//
+// Solidity: function setIncentiveCouncil(address incentiveCouncil) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) SetIncentiveCouncil(incentiveCouncil common.Address) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.SetIncentiveCouncil(&_EmissionsControllerStorage.TransactOpts, incentiveCouncil)
+}
+
+// SetIncentiveCouncil is a paid mutator transaction binding the contract method 0xc695acdb.
+//
+// Solidity: function setIncentiveCouncil(address incentiveCouncil) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactorSession) SetIncentiveCouncil(incentiveCouncil common.Address) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.SetIncentiveCouncil(&_EmissionsControllerStorage.TransactOpts, incentiveCouncil)
+}
+
+// Sweep is a paid mutator transaction binding the contract method 0x35faa416.
+//
+// Solidity: function sweep() returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactor) Sweep(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.contract.Transact(opts, "sweep")
+}
+
+// Sweep is a paid mutator transaction binding the contract method 0x35faa416.
+//
+// Solidity: function sweep() returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) Sweep() (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.Sweep(&_EmissionsControllerStorage.TransactOpts)
+}
+
+// Sweep is a paid mutator transaction binding the contract method 0x35faa416.
+//
+// Solidity: function sweep() returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactorSession) Sweep() (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.Sweep(&_EmissionsControllerStorage.TransactOpts)
+}
+
+// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
+//
+// Solidity: function unpause(uint256 newPausedStatus) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.contract.Transact(opts, "unpause", newPausedStatus)
+}
+
+// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
+//
+// Solidity: function unpause(uint256 newPausedStatus) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.Unpause(&_EmissionsControllerStorage.TransactOpts, newPausedStatus)
+}
+
+// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
+//
+// Solidity: function unpause(uint256 newPausedStatus) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactorSession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.Unpause(&_EmissionsControllerStorage.TransactOpts, newPausedStatus)
+}
+
+// UpdateDistribution is a paid mutator transaction binding the contract method 0x44a32028.
+//
+// Solidity: function updateDistribution(uint256 distributionId, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactor) UpdateDistribution(opts *bind.TransactOpts, distributionId *big.Int, distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.contract.Transact(opts, "updateDistribution", distributionId, distribution)
+}
+
+// UpdateDistribution is a paid mutator transaction binding the contract method 0x44a32028.
+//
+// Solidity: function updateDistribution(uint256 distributionId, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageSession) UpdateDistribution(distributionId *big.Int, distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.UpdateDistribution(&_EmissionsControllerStorage.TransactOpts, distributionId, distribution)
+}
+
+// UpdateDistribution is a paid mutator transaction binding the contract method 0x44a32028.
+//
+// Solidity: function updateDistribution(uint256 distributionId, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns()
+func (_EmissionsControllerStorage *EmissionsControllerStorageTransactorSession) UpdateDistribution(distributionId *big.Int, distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _EmissionsControllerStorage.Contract.UpdateDistribution(&_EmissionsControllerStorage.TransactOpts, distributionId, distribution)
+}
+
+// EmissionsControllerStorageDistributionAddedIterator is returned from FilterDistributionAdded and is used to iterate over the raw logs and unpacked data for DistributionAdded events raised by the EmissionsControllerStorage contract.
+type EmissionsControllerStorageDistributionAddedIterator struct {
+ Event *EmissionsControllerStorageDistributionAdded // 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 *EmissionsControllerStorageDistributionAddedIterator) 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(EmissionsControllerStorageDistributionAdded)
+ 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(EmissionsControllerStorageDistributionAdded)
+ 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 *EmissionsControllerStorageDistributionAddedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerStorageDistributionAddedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerStorageDistributionAdded represents a DistributionAdded event raised by the EmissionsControllerStorage contract.
+type EmissionsControllerStorageDistributionAdded struct {
+ DistributionId *big.Int
+ Epoch *big.Int
+ Distribution IEmissionsControllerTypesDistribution
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDistributionAdded is a free log retrieval operation binding the contract event 0x006f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef.
+//
+// Solidity: event DistributionAdded(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) FilterDistributionAdded(opts *bind.FilterOpts, distributionId []*big.Int, epoch []*big.Int) (*EmissionsControllerStorageDistributionAddedIterator, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _EmissionsControllerStorage.contract.FilterLogs(opts, "DistributionAdded", distributionIdRule, epochRule)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerStorageDistributionAddedIterator{contract: _EmissionsControllerStorage.contract, event: "DistributionAdded", logs: logs, sub: sub}, nil
+}
+
+// WatchDistributionAdded is a free log subscription operation binding the contract event 0x006f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef.
+//
+// Solidity: event DistributionAdded(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) WatchDistributionAdded(opts *bind.WatchOpts, sink chan<- *EmissionsControllerStorageDistributionAdded, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _EmissionsControllerStorage.contract.WatchLogs(opts, "DistributionAdded", distributionIdRule, epochRule)
+ 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(EmissionsControllerStorageDistributionAdded)
+ if err := _EmissionsControllerStorage.contract.UnpackLog(event, "DistributionAdded", 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
+}
+
+// ParseDistributionAdded is a log parse operation binding the contract event 0x006f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef.
+//
+// Solidity: event DistributionAdded(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) ParseDistributionAdded(log types.Log) (*EmissionsControllerStorageDistributionAdded, error) {
+ event := new(EmissionsControllerStorageDistributionAdded)
+ if err := _EmissionsControllerStorage.contract.UnpackLog(event, "DistributionAdded", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// EmissionsControllerStorageDistributionProcessedIterator is returned from FilterDistributionProcessed and is used to iterate over the raw logs and unpacked data for DistributionProcessed events raised by the EmissionsControllerStorage contract.
+type EmissionsControllerStorageDistributionProcessedIterator struct {
+ Event *EmissionsControllerStorageDistributionProcessed // 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 *EmissionsControllerStorageDistributionProcessedIterator) 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(EmissionsControllerStorageDistributionProcessed)
+ 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(EmissionsControllerStorageDistributionProcessed)
+ 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 *EmissionsControllerStorageDistributionProcessedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerStorageDistributionProcessedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerStorageDistributionProcessed represents a DistributionProcessed event raised by the EmissionsControllerStorage contract.
+type EmissionsControllerStorageDistributionProcessed struct {
+ DistributionId *big.Int
+ Epoch *big.Int
+ Distribution IEmissionsControllerTypesDistribution
+ Success bool
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDistributionProcessed is a free log retrieval operation binding the contract event 0xba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b.
+//
+// Solidity: event DistributionProcessed(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution, bool success)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) FilterDistributionProcessed(opts *bind.FilterOpts, distributionId []*big.Int, epoch []*big.Int) (*EmissionsControllerStorageDistributionProcessedIterator, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _EmissionsControllerStorage.contract.FilterLogs(opts, "DistributionProcessed", distributionIdRule, epochRule)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerStorageDistributionProcessedIterator{contract: _EmissionsControllerStorage.contract, event: "DistributionProcessed", logs: logs, sub: sub}, nil
+}
+
+// WatchDistributionProcessed is a free log subscription operation binding the contract event 0xba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b.
+//
+// Solidity: event DistributionProcessed(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution, bool success)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) WatchDistributionProcessed(opts *bind.WatchOpts, sink chan<- *EmissionsControllerStorageDistributionProcessed, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _EmissionsControllerStorage.contract.WatchLogs(opts, "DistributionProcessed", distributionIdRule, epochRule)
+ 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(EmissionsControllerStorageDistributionProcessed)
+ if err := _EmissionsControllerStorage.contract.UnpackLog(event, "DistributionProcessed", 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
+}
+
+// ParseDistributionProcessed is a log parse operation binding the contract event 0xba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b.
+//
+// Solidity: event DistributionProcessed(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution, bool success)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) ParseDistributionProcessed(log types.Log) (*EmissionsControllerStorageDistributionProcessed, error) {
+ event := new(EmissionsControllerStorageDistributionProcessed)
+ if err := _EmissionsControllerStorage.contract.UnpackLog(event, "DistributionProcessed", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// EmissionsControllerStorageDistributionUpdatedIterator is returned from FilterDistributionUpdated and is used to iterate over the raw logs and unpacked data for DistributionUpdated events raised by the EmissionsControllerStorage contract.
+type EmissionsControllerStorageDistributionUpdatedIterator struct {
+ Event *EmissionsControllerStorageDistributionUpdated // 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 *EmissionsControllerStorageDistributionUpdatedIterator) 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(EmissionsControllerStorageDistributionUpdated)
+ 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(EmissionsControllerStorageDistributionUpdated)
+ 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 *EmissionsControllerStorageDistributionUpdatedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerStorageDistributionUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerStorageDistributionUpdated represents a DistributionUpdated event raised by the EmissionsControllerStorage contract.
+type EmissionsControllerStorageDistributionUpdated struct {
+ DistributionId *big.Int
+ Epoch *big.Int
+ Distribution IEmissionsControllerTypesDistribution
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDistributionUpdated is a free log retrieval operation binding the contract event 0x548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c.
+//
+// Solidity: event DistributionUpdated(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) FilterDistributionUpdated(opts *bind.FilterOpts, distributionId []*big.Int, epoch []*big.Int) (*EmissionsControllerStorageDistributionUpdatedIterator, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _EmissionsControllerStorage.contract.FilterLogs(opts, "DistributionUpdated", distributionIdRule, epochRule)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerStorageDistributionUpdatedIterator{contract: _EmissionsControllerStorage.contract, event: "DistributionUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchDistributionUpdated is a free log subscription operation binding the contract event 0x548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c.
+//
+// Solidity: event DistributionUpdated(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) WatchDistributionUpdated(opts *bind.WatchOpts, sink chan<- *EmissionsControllerStorageDistributionUpdated, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _EmissionsControllerStorage.contract.WatchLogs(opts, "DistributionUpdated", distributionIdRule, epochRule)
+ 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(EmissionsControllerStorageDistributionUpdated)
+ if err := _EmissionsControllerStorage.contract.UnpackLog(event, "DistributionUpdated", 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
+}
+
+// ParseDistributionUpdated is a log parse operation binding the contract event 0x548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c.
+//
+// Solidity: event DistributionUpdated(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) ParseDistributionUpdated(log types.Log) (*EmissionsControllerStorageDistributionUpdated, error) {
+ event := new(EmissionsControllerStorageDistributionUpdated)
+ if err := _EmissionsControllerStorage.contract.UnpackLog(event, "DistributionUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// EmissionsControllerStorageIncentiveCouncilUpdatedIterator is returned from FilterIncentiveCouncilUpdated and is used to iterate over the raw logs and unpacked data for IncentiveCouncilUpdated events raised by the EmissionsControllerStorage contract.
+type EmissionsControllerStorageIncentiveCouncilUpdatedIterator struct {
+ Event *EmissionsControllerStorageIncentiveCouncilUpdated // 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 *EmissionsControllerStorageIncentiveCouncilUpdatedIterator) 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(EmissionsControllerStorageIncentiveCouncilUpdated)
+ 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(EmissionsControllerStorageIncentiveCouncilUpdated)
+ 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 *EmissionsControllerStorageIncentiveCouncilUpdatedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerStorageIncentiveCouncilUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerStorageIncentiveCouncilUpdated represents a IncentiveCouncilUpdated event raised by the EmissionsControllerStorage contract.
+type EmissionsControllerStorageIncentiveCouncilUpdated struct {
+ IncentiveCouncil common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterIncentiveCouncilUpdated is a free log retrieval operation binding the contract event 0x8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216.
+//
+// Solidity: event IncentiveCouncilUpdated(address indexed incentiveCouncil)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) FilterIncentiveCouncilUpdated(opts *bind.FilterOpts, incentiveCouncil []common.Address) (*EmissionsControllerStorageIncentiveCouncilUpdatedIterator, error) {
+
+ var incentiveCouncilRule []interface{}
+ for _, incentiveCouncilItem := range incentiveCouncil {
+ incentiveCouncilRule = append(incentiveCouncilRule, incentiveCouncilItem)
+ }
+
+ logs, sub, err := _EmissionsControllerStorage.contract.FilterLogs(opts, "IncentiveCouncilUpdated", incentiveCouncilRule)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerStorageIncentiveCouncilUpdatedIterator{contract: _EmissionsControllerStorage.contract, event: "IncentiveCouncilUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchIncentiveCouncilUpdated is a free log subscription operation binding the contract event 0x8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216.
+//
+// Solidity: event IncentiveCouncilUpdated(address indexed incentiveCouncil)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) WatchIncentiveCouncilUpdated(opts *bind.WatchOpts, sink chan<- *EmissionsControllerStorageIncentiveCouncilUpdated, incentiveCouncil []common.Address) (event.Subscription, error) {
+
+ var incentiveCouncilRule []interface{}
+ for _, incentiveCouncilItem := range incentiveCouncil {
+ incentiveCouncilRule = append(incentiveCouncilRule, incentiveCouncilItem)
+ }
+
+ logs, sub, err := _EmissionsControllerStorage.contract.WatchLogs(opts, "IncentiveCouncilUpdated", incentiveCouncilRule)
+ 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(EmissionsControllerStorageIncentiveCouncilUpdated)
+ if err := _EmissionsControllerStorage.contract.UnpackLog(event, "IncentiveCouncilUpdated", 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
+}
+
+// ParseIncentiveCouncilUpdated is a log parse operation binding the contract event 0x8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216.
+//
+// Solidity: event IncentiveCouncilUpdated(address indexed incentiveCouncil)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) ParseIncentiveCouncilUpdated(log types.Log) (*EmissionsControllerStorageIncentiveCouncilUpdated, error) {
+ event := new(EmissionsControllerStorageIncentiveCouncilUpdated)
+ if err := _EmissionsControllerStorage.contract.UnpackLog(event, "IncentiveCouncilUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// EmissionsControllerStoragePausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the EmissionsControllerStorage contract.
+type EmissionsControllerStoragePausedIterator struct {
+ Event *EmissionsControllerStoragePaused // 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 *EmissionsControllerStoragePausedIterator) 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(EmissionsControllerStoragePaused)
+ 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(EmissionsControllerStoragePaused)
+ 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 *EmissionsControllerStoragePausedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerStoragePausedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerStoragePaused represents a Paused event raised by the EmissionsControllerStorage contract.
+type EmissionsControllerStoragePaused struct {
+ Account common.Address
+ NewPausedStatus *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterPaused is a free log retrieval operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
+//
+// Solidity: event Paused(address indexed account, uint256 newPausedStatus)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*EmissionsControllerStoragePausedIterator, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _EmissionsControllerStorage.contract.FilterLogs(opts, "Paused", accountRule)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerStoragePausedIterator{contract: _EmissionsControllerStorage.contract, event: "Paused", logs: logs, sub: sub}, nil
+}
+
+// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
+//
+// Solidity: event Paused(address indexed account, uint256 newPausedStatus)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *EmissionsControllerStoragePaused, account []common.Address) (event.Subscription, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _EmissionsControllerStorage.contract.WatchLogs(opts, "Paused", accountRule)
+ 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(EmissionsControllerStoragePaused)
+ if err := _EmissionsControllerStorage.contract.UnpackLog(event, "Paused", 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
+}
+
+// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
+//
+// Solidity: event Paused(address indexed account, uint256 newPausedStatus)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) ParsePaused(log types.Log) (*EmissionsControllerStoragePaused, error) {
+ event := new(EmissionsControllerStoragePaused)
+ if err := _EmissionsControllerStorage.contract.UnpackLog(event, "Paused", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// EmissionsControllerStorageSweptIterator is returned from FilterSwept and is used to iterate over the raw logs and unpacked data for Swept events raised by the EmissionsControllerStorage contract.
+type EmissionsControllerStorageSweptIterator struct {
+ Event *EmissionsControllerStorageSwept // 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 *EmissionsControllerStorageSweptIterator) 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(EmissionsControllerStorageSwept)
+ 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(EmissionsControllerStorageSwept)
+ 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 *EmissionsControllerStorageSweptIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerStorageSweptIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerStorageSwept represents a Swept event raised by the EmissionsControllerStorage contract.
+type EmissionsControllerStorageSwept struct {
+ IncentiveCouncil common.Address
+ Amount *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterSwept is a free log retrieval operation binding the contract event 0xc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe35109696.
+//
+// Solidity: event Swept(address indexed incentiveCouncil, uint256 amount)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) FilterSwept(opts *bind.FilterOpts, incentiveCouncil []common.Address) (*EmissionsControllerStorageSweptIterator, error) {
+
+ var incentiveCouncilRule []interface{}
+ for _, incentiveCouncilItem := range incentiveCouncil {
+ incentiveCouncilRule = append(incentiveCouncilRule, incentiveCouncilItem)
+ }
+
+ logs, sub, err := _EmissionsControllerStorage.contract.FilterLogs(opts, "Swept", incentiveCouncilRule)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerStorageSweptIterator{contract: _EmissionsControllerStorage.contract, event: "Swept", logs: logs, sub: sub}, nil
+}
+
+// WatchSwept is a free log subscription operation binding the contract event 0xc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe35109696.
+//
+// Solidity: event Swept(address indexed incentiveCouncil, uint256 amount)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) WatchSwept(opts *bind.WatchOpts, sink chan<- *EmissionsControllerStorageSwept, incentiveCouncil []common.Address) (event.Subscription, error) {
+
+ var incentiveCouncilRule []interface{}
+ for _, incentiveCouncilItem := range incentiveCouncil {
+ incentiveCouncilRule = append(incentiveCouncilRule, incentiveCouncilItem)
+ }
+
+ logs, sub, err := _EmissionsControllerStorage.contract.WatchLogs(opts, "Swept", incentiveCouncilRule)
+ 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(EmissionsControllerStorageSwept)
+ if err := _EmissionsControllerStorage.contract.UnpackLog(event, "Swept", 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
+}
+
+// ParseSwept is a log parse operation binding the contract event 0xc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe35109696.
+//
+// Solidity: event Swept(address indexed incentiveCouncil, uint256 amount)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) ParseSwept(log types.Log) (*EmissionsControllerStorageSwept, error) {
+ event := new(EmissionsControllerStorageSwept)
+ if err := _EmissionsControllerStorage.contract.UnpackLog(event, "Swept", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// EmissionsControllerStorageUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the EmissionsControllerStorage contract.
+type EmissionsControllerStorageUnpausedIterator struct {
+ Event *EmissionsControllerStorageUnpaused // 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 *EmissionsControllerStorageUnpausedIterator) 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(EmissionsControllerStorageUnpaused)
+ 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(EmissionsControllerStorageUnpaused)
+ 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 *EmissionsControllerStorageUnpausedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *EmissionsControllerStorageUnpausedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// EmissionsControllerStorageUnpaused represents a Unpaused event raised by the EmissionsControllerStorage contract.
+type EmissionsControllerStorageUnpaused struct {
+ Account common.Address
+ NewPausedStatus *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterUnpaused is a free log retrieval operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
+//
+// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*EmissionsControllerStorageUnpausedIterator, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _EmissionsControllerStorage.contract.FilterLogs(opts, "Unpaused", accountRule)
+ if err != nil {
+ return nil, err
+ }
+ return &EmissionsControllerStorageUnpausedIterator{contract: _EmissionsControllerStorage.contract, event: "Unpaused", logs: logs, sub: sub}, nil
+}
+
+// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
+//
+// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *EmissionsControllerStorageUnpaused, account []common.Address) (event.Subscription, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _EmissionsControllerStorage.contract.WatchLogs(opts, "Unpaused", accountRule)
+ 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(EmissionsControllerStorageUnpaused)
+ if err := _EmissionsControllerStorage.contract.UnpackLog(event, "Unpaused", 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
+}
+
+// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
+//
+// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus)
+func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) ParseUnpaused(log types.Log) (*EmissionsControllerStorageUnpaused, error) {
+ event := new(EmissionsControllerStorageUnpaused)
+ if err := _EmissionsControllerStorage.contract.UnpackLog(event, "Unpaused", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
diff --git a/pkg/bindings/IBackingEigen/binding.go b/pkg/bindings/IBackingEigen/binding.go
index bdca29fd8f..ad389d5b69 100644
--- a/pkg/bindings/IBackingEigen/binding.go
+++ b/pkg/bindings/IBackingEigen/binding.go
@@ -31,7 +31,7 @@ var (
// IBackingEigenMetaData contains all meta data concerning the IBackingEigen contract.
var IBackingEigenMetaData = &bind.MetaData{
- ABI: "[{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"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\":\"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\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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\":\"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\":\"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\":\"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}]",
+ ABI: "[{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"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\":\"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\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMinter\",\"inputs\":[{\"name\":\"who\",\"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\":\"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\":\"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\":\"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\":\"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}]",
}
// IBackingEigenABI is the input ABI used to generate the binding from.
@@ -335,6 +335,37 @@ func (_IBackingEigen *IBackingEigenCallerSession) Clock() (*big.Int, error) {
return _IBackingEigen.Contract.Clock(&_IBackingEigen.CallOpts)
}
+// IsMinter is a free data retrieval call binding the contract method 0xaa271e1a.
+//
+// Solidity: function isMinter(address who) view returns(bool)
+func (_IBackingEigen *IBackingEigenCaller) IsMinter(opts *bind.CallOpts, who common.Address) (bool, error) {
+ var out []interface{}
+ err := _IBackingEigen.contract.Call(opts, &out, "isMinter", who)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsMinter is a free data retrieval call binding the contract method 0xaa271e1a.
+//
+// Solidity: function isMinter(address who) view returns(bool)
+func (_IBackingEigen *IBackingEigenSession) IsMinter(who common.Address) (bool, error) {
+ return _IBackingEigen.Contract.IsMinter(&_IBackingEigen.CallOpts, who)
+}
+
+// IsMinter is a free data retrieval call binding the contract method 0xaa271e1a.
+//
+// Solidity: function isMinter(address who) view returns(bool)
+func (_IBackingEigen *IBackingEigenCallerSession) IsMinter(who common.Address) (bool, error) {
+ return _IBackingEigen.Contract.IsMinter(&_IBackingEigen.CallOpts, who)
+}
+
// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
//
// Solidity: function totalSupply() view returns(uint256)
diff --git a/pkg/bindings/IDurationVaultStrategy/binding.go b/pkg/bindings/IDurationVaultStrategy/binding.go
new file mode 100644
index 0000000000..8aa38c4798
--- /dev/null
+++ b/pkg/bindings/IDurationVaultStrategy/binding.go
@@ -0,0 +1,2899 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package IDurationVaultStrategy
+
+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
+)
+
+// IDurationVaultStrategyMetaData contains all meta data concerning the IDurationVaultStrategy contract.
+var IDurationVaultStrategyMetaData = &bind.MetaData{
+ ABI: "[{\"type\":\"function\",\"name\":\"advanceToWithdrawals\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationsActive\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"arbitrator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beforeAddShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beforeRemoveShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"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\":\"depositsOpen\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"duration\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isLocked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMatured\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lock\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lockedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"markMatured\",\"inputs\":[],\"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\":\"metadataURI\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorIntegrationConfigured\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSetInfo\",\"inputs\":[],\"outputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSetRegistered\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardsCoordinator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRewardsCoordinator\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setRewardsClaimer\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakeCap\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIDurationVaultStrategyTypes.VaultState\"}],\"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\":\"unlockTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateDelegationApprover\",\"inputs\":[{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateMetadataURI\",\"inputs\":[{\"name\":\"newMetadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"newOperatorMetadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newStakeCap\",\"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\":\"vaultAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalsOpen\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DeallocateAttempted\",\"inputs\":[{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DeregisterAttempted\",\"inputs\":[{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"MetadataURIUpdated\",\"inputs\":[{\"name\":\"newMetadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"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\":\"VaultAdvancedToWithdrawals\",\"inputs\":[{\"name\":\"arbitrator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"maturedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultInitialized\",\"inputs\":[{\"name\":\"vaultAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"arbitrator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"underlyingToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"contractIERC20\"},{\"name\":\"duration\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"maxPerDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"stakeCap\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultLocked\",\"inputs\":[{\"name\":\"lockedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"unlockAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultMatured\",\"inputs\":[{\"name\":\"maturedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositExceedsMaxPerDeposit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositsLocked\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationAlreadyElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidArbitrator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidVaultAdmin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeDelegatedToVaultOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyArbitrator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyVaultAdmin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorIntegrationInvalid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PendingAllocation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotSupportedByOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnderlyingTokenBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VaultAlreadyLocked\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VaultNotLocked\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalsLockedDuringAllocations\",\"inputs\":[]}]",
+}
+
+// IDurationVaultStrategyABI is the input ABI used to generate the binding from.
+// Deprecated: Use IDurationVaultStrategyMetaData.ABI instead.
+var IDurationVaultStrategyABI = IDurationVaultStrategyMetaData.ABI
+
+// IDurationVaultStrategy is an auto generated Go binding around an Ethereum contract.
+type IDurationVaultStrategy struct {
+ IDurationVaultStrategyCaller // Read-only binding to the contract
+ IDurationVaultStrategyTransactor // Write-only binding to the contract
+ IDurationVaultStrategyFilterer // Log filterer for contract events
+}
+
+// IDurationVaultStrategyCaller is an auto generated read-only Go binding around an Ethereum contract.
+type IDurationVaultStrategyCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// IDurationVaultStrategyTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type IDurationVaultStrategyTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// IDurationVaultStrategyFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type IDurationVaultStrategyFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// IDurationVaultStrategySession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type IDurationVaultStrategySession struct {
+ Contract *IDurationVaultStrategy // 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
+}
+
+// IDurationVaultStrategyCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type IDurationVaultStrategyCallerSession struct {
+ Contract *IDurationVaultStrategyCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// IDurationVaultStrategyTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type IDurationVaultStrategyTransactorSession struct {
+ Contract *IDurationVaultStrategyTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// IDurationVaultStrategyRaw is an auto generated low-level Go binding around an Ethereum contract.
+type IDurationVaultStrategyRaw struct {
+ Contract *IDurationVaultStrategy // Generic contract binding to access the raw methods on
+}
+
+// IDurationVaultStrategyCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type IDurationVaultStrategyCallerRaw struct {
+ Contract *IDurationVaultStrategyCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// IDurationVaultStrategyTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type IDurationVaultStrategyTransactorRaw struct {
+ Contract *IDurationVaultStrategyTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewIDurationVaultStrategy creates a new instance of IDurationVaultStrategy, bound to a specific deployed contract.
+func NewIDurationVaultStrategy(address common.Address, backend bind.ContractBackend) (*IDurationVaultStrategy, error) {
+ contract, err := bindIDurationVaultStrategy(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &IDurationVaultStrategy{IDurationVaultStrategyCaller: IDurationVaultStrategyCaller{contract: contract}, IDurationVaultStrategyTransactor: IDurationVaultStrategyTransactor{contract: contract}, IDurationVaultStrategyFilterer: IDurationVaultStrategyFilterer{contract: contract}}, nil
+}
+
+// NewIDurationVaultStrategyCaller creates a new read-only instance of IDurationVaultStrategy, bound to a specific deployed contract.
+func NewIDurationVaultStrategyCaller(address common.Address, caller bind.ContractCaller) (*IDurationVaultStrategyCaller, error) {
+ contract, err := bindIDurationVaultStrategy(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &IDurationVaultStrategyCaller{contract: contract}, nil
+}
+
+// NewIDurationVaultStrategyTransactor creates a new write-only instance of IDurationVaultStrategy, bound to a specific deployed contract.
+func NewIDurationVaultStrategyTransactor(address common.Address, transactor bind.ContractTransactor) (*IDurationVaultStrategyTransactor, error) {
+ contract, err := bindIDurationVaultStrategy(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &IDurationVaultStrategyTransactor{contract: contract}, nil
+}
+
+// NewIDurationVaultStrategyFilterer creates a new log filterer instance of IDurationVaultStrategy, bound to a specific deployed contract.
+func NewIDurationVaultStrategyFilterer(address common.Address, filterer bind.ContractFilterer) (*IDurationVaultStrategyFilterer, error) {
+ contract, err := bindIDurationVaultStrategy(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &IDurationVaultStrategyFilterer{contract: contract}, nil
+}
+
+// bindIDurationVaultStrategy binds a generic wrapper to an already deployed contract.
+func bindIDurationVaultStrategy(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := IDurationVaultStrategyMetaData.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 (_IDurationVaultStrategy *IDurationVaultStrategyRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _IDurationVaultStrategy.Contract.IDurationVaultStrategyCaller.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 (_IDurationVaultStrategy *IDurationVaultStrategyRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.IDurationVaultStrategyTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_IDurationVaultStrategy *IDurationVaultStrategyRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.IDurationVaultStrategyTransactor.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 (_IDurationVaultStrategy *IDurationVaultStrategyCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _IDurationVaultStrategy.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 (_IDurationVaultStrategy *IDurationVaultStrategyTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.contract.Transact(opts, method, params...)
+}
+
+// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
+//
+// Solidity: function allocationManager() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "allocationManager")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
+//
+// Solidity: function allocationManager() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) AllocationManager() (common.Address, error) {
+ return _IDurationVaultStrategy.Contract.AllocationManager(&_IDurationVaultStrategy.CallOpts)
+}
+
+// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
+//
+// Solidity: function allocationManager() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) AllocationManager() (common.Address, error) {
+ return _IDurationVaultStrategy.Contract.AllocationManager(&_IDurationVaultStrategy.CallOpts)
+}
+
+// AllocationsActive is a free data retrieval call binding the contract method 0xfb4d86b4.
+//
+// Solidity: function allocationsActive() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) AllocationsActive(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "allocationsActive")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// AllocationsActive is a free data retrieval call binding the contract method 0xfb4d86b4.
+//
+// Solidity: function allocationsActive() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) AllocationsActive() (bool, error) {
+ return _IDurationVaultStrategy.Contract.AllocationsActive(&_IDurationVaultStrategy.CallOpts)
+}
+
+// AllocationsActive is a free data retrieval call binding the contract method 0xfb4d86b4.
+//
+// Solidity: function allocationsActive() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) AllocationsActive() (bool, error) {
+ return _IDurationVaultStrategy.Contract.AllocationsActive(&_IDurationVaultStrategy.CallOpts)
+}
+
+// Arbitrator is a free data retrieval call binding the contract method 0x6cc6cde1.
+//
+// Solidity: function arbitrator() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) Arbitrator(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "arbitrator")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// Arbitrator is a free data retrieval call binding the contract method 0x6cc6cde1.
+//
+// Solidity: function arbitrator() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) Arbitrator() (common.Address, error) {
+ return _IDurationVaultStrategy.Contract.Arbitrator(&_IDurationVaultStrategy.CallOpts)
+}
+
+// Arbitrator is a free data retrieval call binding the contract method 0x6cc6cde1.
+//
+// Solidity: function arbitrator() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) Arbitrator() (common.Address, error) {
+ return _IDurationVaultStrategy.Contract.Arbitrator(&_IDurationVaultStrategy.CallOpts)
+}
+
+// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b.
+//
+// Solidity: function delegationManager() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) DelegationManager(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "delegationManager")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b.
+//
+// Solidity: function delegationManager() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) DelegationManager() (common.Address, error) {
+ return _IDurationVaultStrategy.Contract.DelegationManager(&_IDurationVaultStrategy.CallOpts)
+}
+
+// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b.
+//
+// Solidity: function delegationManager() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) DelegationManager() (common.Address, error) {
+ return _IDurationVaultStrategy.Contract.DelegationManager(&_IDurationVaultStrategy.CallOpts)
+}
+
+// DepositsOpen is a free data retrieval call binding the contract method 0x549c4627.
+//
+// Solidity: function depositsOpen() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) DepositsOpen(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "depositsOpen")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// DepositsOpen is a free data retrieval call binding the contract method 0x549c4627.
+//
+// Solidity: function depositsOpen() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) DepositsOpen() (bool, error) {
+ return _IDurationVaultStrategy.Contract.DepositsOpen(&_IDurationVaultStrategy.CallOpts)
+}
+
+// DepositsOpen is a free data retrieval call binding the contract method 0x549c4627.
+//
+// Solidity: function depositsOpen() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) DepositsOpen() (bool, error) {
+ return _IDurationVaultStrategy.Contract.DepositsOpen(&_IDurationVaultStrategy.CallOpts)
+}
+
+// Duration is a free data retrieval call binding the contract method 0x0fb5a6b4.
+//
+// Solidity: function duration() view returns(uint32)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) Duration(opts *bind.CallOpts) (uint32, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "duration")
+
+ if err != nil {
+ return *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+ return out0, err
+
+}
+
+// Duration is a free data retrieval call binding the contract method 0x0fb5a6b4.
+//
+// Solidity: function duration() view returns(uint32)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) Duration() (uint32, error) {
+ return _IDurationVaultStrategy.Contract.Duration(&_IDurationVaultStrategy.CallOpts)
+}
+
+// Duration is a free data retrieval call binding the contract method 0x0fb5a6b4.
+//
+// Solidity: function duration() view returns(uint32)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) Duration() (uint32, error) {
+ return _IDurationVaultStrategy.Contract.Duration(&_IDurationVaultStrategy.CallOpts)
+}
+
+// Explanation is a free data retrieval call binding the contract method 0xab5921e1.
+//
+// Solidity: function explanation() view returns(string)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) Explanation(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "explanation")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// Explanation is a free data retrieval call binding the contract method 0xab5921e1.
+//
+// Solidity: function explanation() view returns(string)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) Explanation() (string, error) {
+ return _IDurationVaultStrategy.Contract.Explanation(&_IDurationVaultStrategy.CallOpts)
+}
+
+// Explanation is a free data retrieval call binding the contract method 0xab5921e1.
+//
+// Solidity: function explanation() view returns(string)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) Explanation() (string, error) {
+ return _IDurationVaultStrategy.Contract.Explanation(&_IDurationVaultStrategy.CallOpts)
+}
+
+// IsLocked is a free data retrieval call binding the contract method 0xa4e2d634.
+//
+// Solidity: function isLocked() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) IsLocked(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "isLocked")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsLocked is a free data retrieval call binding the contract method 0xa4e2d634.
+//
+// Solidity: function isLocked() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) IsLocked() (bool, error) {
+ return _IDurationVaultStrategy.Contract.IsLocked(&_IDurationVaultStrategy.CallOpts)
+}
+
+// IsLocked is a free data retrieval call binding the contract method 0xa4e2d634.
+//
+// Solidity: function isLocked() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) IsLocked() (bool, error) {
+ return _IDurationVaultStrategy.Contract.IsLocked(&_IDurationVaultStrategy.CallOpts)
+}
+
+// IsMatured is a free data retrieval call binding the contract method 0x7f2b6a0d.
+//
+// Solidity: function isMatured() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) IsMatured(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "isMatured")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsMatured is a free data retrieval call binding the contract method 0x7f2b6a0d.
+//
+// Solidity: function isMatured() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) IsMatured() (bool, error) {
+ return _IDurationVaultStrategy.Contract.IsMatured(&_IDurationVaultStrategy.CallOpts)
+}
+
+// IsMatured is a free data retrieval call binding the contract method 0x7f2b6a0d.
+//
+// Solidity: function isMatured() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) IsMatured() (bool, error) {
+ return _IDurationVaultStrategy.Contract.IsMatured(&_IDurationVaultStrategy.CallOpts)
+}
+
+// LockedAt is a free data retrieval call binding the contract method 0xb2163482.
+//
+// Solidity: function lockedAt() view returns(uint32)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) LockedAt(opts *bind.CallOpts) (uint32, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "lockedAt")
+
+ if err != nil {
+ return *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+ return out0, err
+
+}
+
+// LockedAt is a free data retrieval call binding the contract method 0xb2163482.
+//
+// Solidity: function lockedAt() view returns(uint32)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) LockedAt() (uint32, error) {
+ return _IDurationVaultStrategy.Contract.LockedAt(&_IDurationVaultStrategy.CallOpts)
+}
+
+// LockedAt is a free data retrieval call binding the contract method 0xb2163482.
+//
+// Solidity: function lockedAt() view returns(uint32)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) LockedAt() (uint32, error) {
+ return _IDurationVaultStrategy.Contract.LockedAt(&_IDurationVaultStrategy.CallOpts)
+}
+
+// MaxPerDeposit is a free data retrieval call binding the contract method 0x43fe08b0.
+//
+// Solidity: function maxPerDeposit() view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) MaxPerDeposit(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "maxPerDeposit")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// MaxPerDeposit is a free data retrieval call binding the contract method 0x43fe08b0.
+//
+// Solidity: function maxPerDeposit() view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) MaxPerDeposit() (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.MaxPerDeposit(&_IDurationVaultStrategy.CallOpts)
+}
+
+// MaxPerDeposit is a free data retrieval call binding the contract method 0x43fe08b0.
+//
+// Solidity: function maxPerDeposit() view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) MaxPerDeposit() (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.MaxPerDeposit(&_IDurationVaultStrategy.CallOpts)
+}
+
+// MaxTotalDeposits is a free data retrieval call binding the contract method 0x61b01b5d.
+//
+// Solidity: function maxTotalDeposits() view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) MaxTotalDeposits(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "maxTotalDeposits")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// MaxTotalDeposits is a free data retrieval call binding the contract method 0x61b01b5d.
+//
+// Solidity: function maxTotalDeposits() view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) MaxTotalDeposits() (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.MaxTotalDeposits(&_IDurationVaultStrategy.CallOpts)
+}
+
+// MaxTotalDeposits is a free data retrieval call binding the contract method 0x61b01b5d.
+//
+// Solidity: function maxTotalDeposits() view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) MaxTotalDeposits() (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.MaxTotalDeposits(&_IDurationVaultStrategy.CallOpts)
+}
+
+// MetadataURI is a free data retrieval call binding the contract method 0x03ee438c.
+//
+// Solidity: function metadataURI() view returns(string)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) MetadataURI(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "metadataURI")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+// MetadataURI is a free data retrieval call binding the contract method 0x03ee438c.
+//
+// Solidity: function metadataURI() view returns(string)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) MetadataURI() (string, error) {
+ return _IDurationVaultStrategy.Contract.MetadataURI(&_IDurationVaultStrategy.CallOpts)
+}
+
+// MetadataURI is a free data retrieval call binding the contract method 0x03ee438c.
+//
+// Solidity: function metadataURI() view returns(string)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) MetadataURI() (string, error) {
+ return _IDurationVaultStrategy.Contract.MetadataURI(&_IDurationVaultStrategy.CallOpts)
+}
+
+// OperatorIntegrationConfigured is a free data retrieval call binding the contract method 0x5438a8c7.
+//
+// Solidity: function operatorIntegrationConfigured() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) OperatorIntegrationConfigured(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "operatorIntegrationConfigured")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// OperatorIntegrationConfigured is a free data retrieval call binding the contract method 0x5438a8c7.
+//
+// Solidity: function operatorIntegrationConfigured() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) OperatorIntegrationConfigured() (bool, error) {
+ return _IDurationVaultStrategy.Contract.OperatorIntegrationConfigured(&_IDurationVaultStrategy.CallOpts)
+}
+
+// OperatorIntegrationConfigured is a free data retrieval call binding the contract method 0x5438a8c7.
+//
+// Solidity: function operatorIntegrationConfigured() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) OperatorIntegrationConfigured() (bool, error) {
+ return _IDurationVaultStrategy.Contract.OperatorIntegrationConfigured(&_IDurationVaultStrategy.CallOpts)
+}
+
+// OperatorSetInfo is a free data retrieval call binding the contract method 0xd4deae81.
+//
+// Solidity: function operatorSetInfo() view returns(address avs, uint32 operatorSetId)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) OperatorSetInfo(opts *bind.CallOpts) (struct {
+ Avs common.Address
+ OperatorSetId uint32
+}, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "operatorSetInfo")
+
+ outstruct := new(struct {
+ Avs common.Address
+ OperatorSetId uint32
+ })
+ if err != nil {
+ return *outstruct, err
+ }
+
+ outstruct.Avs = *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+ outstruct.OperatorSetId = *abi.ConvertType(out[1], new(uint32)).(*uint32)
+
+ return *outstruct, err
+
+}
+
+// OperatorSetInfo is a free data retrieval call binding the contract method 0xd4deae81.
+//
+// Solidity: function operatorSetInfo() view returns(address avs, uint32 operatorSetId)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) OperatorSetInfo() (struct {
+ Avs common.Address
+ OperatorSetId uint32
+}, error) {
+ return _IDurationVaultStrategy.Contract.OperatorSetInfo(&_IDurationVaultStrategy.CallOpts)
+}
+
+// OperatorSetInfo is a free data retrieval call binding the contract method 0xd4deae81.
+//
+// Solidity: function operatorSetInfo() view returns(address avs, uint32 operatorSetId)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) OperatorSetInfo() (struct {
+ Avs common.Address
+ OperatorSetId uint32
+}, error) {
+ return _IDurationVaultStrategy.Contract.OperatorSetInfo(&_IDurationVaultStrategy.CallOpts)
+}
+
+// OperatorSetRegistered is a free data retrieval call binding the contract method 0x59d915ff.
+//
+// Solidity: function operatorSetRegistered() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) OperatorSetRegistered(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "operatorSetRegistered")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// OperatorSetRegistered is a free data retrieval call binding the contract method 0x59d915ff.
+//
+// Solidity: function operatorSetRegistered() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) OperatorSetRegistered() (bool, error) {
+ return _IDurationVaultStrategy.Contract.OperatorSetRegistered(&_IDurationVaultStrategy.CallOpts)
+}
+
+// OperatorSetRegistered is a free data retrieval call binding the contract method 0x59d915ff.
+//
+// Solidity: function operatorSetRegistered() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) OperatorSetRegistered() (bool, error) {
+ return _IDurationVaultStrategy.Contract.OperatorSetRegistered(&_IDurationVaultStrategy.CallOpts)
+}
+
+// RewardsCoordinator is a free data retrieval call binding the contract method 0x8a2fc4e3.
+//
+// Solidity: function rewardsCoordinator() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) RewardsCoordinator(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "rewardsCoordinator")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// RewardsCoordinator is a free data retrieval call binding the contract method 0x8a2fc4e3.
+//
+// Solidity: function rewardsCoordinator() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) RewardsCoordinator() (common.Address, error) {
+ return _IDurationVaultStrategy.Contract.RewardsCoordinator(&_IDurationVaultStrategy.CallOpts)
+}
+
+// RewardsCoordinator is a free data retrieval call binding the contract method 0x8a2fc4e3.
+//
+// Solidity: function rewardsCoordinator() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) RewardsCoordinator() (common.Address, error) {
+ return _IDurationVaultStrategy.Contract.RewardsCoordinator(&_IDurationVaultStrategy.CallOpts)
+}
+
+// Shares is a free data retrieval call binding the contract method 0xce7c2ac2.
+//
+// Solidity: function shares(address user) view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) Shares(opts *bind.CallOpts, user common.Address) (*big.Int, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "shares", user)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// Shares is a free data retrieval call binding the contract method 0xce7c2ac2.
+//
+// Solidity: function shares(address user) view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) Shares(user common.Address) (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.Shares(&_IDurationVaultStrategy.CallOpts, user)
+}
+
+// Shares is a free data retrieval call binding the contract method 0xce7c2ac2.
+//
+// Solidity: function shares(address user) view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) Shares(user common.Address) (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.Shares(&_IDurationVaultStrategy.CallOpts, user)
+}
+
+// SharesToUnderlyingView is a free data retrieval call binding the contract method 0x7a8b2637.
+//
+// Solidity: function sharesToUnderlyingView(uint256 amountShares) view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) SharesToUnderlyingView(opts *bind.CallOpts, amountShares *big.Int) (*big.Int, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "sharesToUnderlyingView", amountShares)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// SharesToUnderlyingView is a free data retrieval call binding the contract method 0x7a8b2637.
+//
+// Solidity: function sharesToUnderlyingView(uint256 amountShares) view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) SharesToUnderlyingView(amountShares *big.Int) (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.SharesToUnderlyingView(&_IDurationVaultStrategy.CallOpts, amountShares)
+}
+
+// SharesToUnderlyingView is a free data retrieval call binding the contract method 0x7a8b2637.
+//
+// Solidity: function sharesToUnderlyingView(uint256 amountShares) view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) SharesToUnderlyingView(amountShares *big.Int) (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.SharesToUnderlyingView(&_IDurationVaultStrategy.CallOpts, amountShares)
+}
+
+// StakeCap is a free data retrieval call binding the contract method 0xba28fd2e.
+//
+// Solidity: function stakeCap() view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) StakeCap(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "stakeCap")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// StakeCap is a free data retrieval call binding the contract method 0xba28fd2e.
+//
+// Solidity: function stakeCap() view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) StakeCap() (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.StakeCap(&_IDurationVaultStrategy.CallOpts)
+}
+
+// StakeCap is a free data retrieval call binding the contract method 0xba28fd2e.
+//
+// Solidity: function stakeCap() view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) StakeCap() (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.StakeCap(&_IDurationVaultStrategy.CallOpts)
+}
+
+// State is a free data retrieval call binding the contract method 0xc19d93fb.
+//
+// Solidity: function state() view returns(uint8)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) State(opts *bind.CallOpts) (uint8, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "state")
+
+ if err != nil {
+ return *new(uint8), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
+
+ return out0, err
+
+}
+
+// State is a free data retrieval call binding the contract method 0xc19d93fb.
+//
+// Solidity: function state() view returns(uint8)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) State() (uint8, error) {
+ return _IDurationVaultStrategy.Contract.State(&_IDurationVaultStrategy.CallOpts)
+}
+
+// State is a free data retrieval call binding the contract method 0xc19d93fb.
+//
+// Solidity: function state() view returns(uint8)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) State() (uint8, error) {
+ return _IDurationVaultStrategy.Contract.State(&_IDurationVaultStrategy.CallOpts)
+}
+
+// TotalShares is a free data retrieval call binding the contract method 0x3a98ef39.
+//
+// Solidity: function totalShares() view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) TotalShares(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "totalShares")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// TotalShares is a free data retrieval call binding the contract method 0x3a98ef39.
+//
+// Solidity: function totalShares() view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) TotalShares() (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.TotalShares(&_IDurationVaultStrategy.CallOpts)
+}
+
+// TotalShares is a free data retrieval call binding the contract method 0x3a98ef39.
+//
+// Solidity: function totalShares() view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) TotalShares() (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.TotalShares(&_IDurationVaultStrategy.CallOpts)
+}
+
+// UnderlyingToSharesView is a free data retrieval call binding the contract method 0xe3dae51c.
+//
+// Solidity: function underlyingToSharesView(uint256 amountUnderlying) view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) UnderlyingToSharesView(opts *bind.CallOpts, amountUnderlying *big.Int) (*big.Int, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "underlyingToSharesView", amountUnderlying)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// UnderlyingToSharesView is a free data retrieval call binding the contract method 0xe3dae51c.
+//
+// Solidity: function underlyingToSharesView(uint256 amountUnderlying) view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) UnderlyingToSharesView(amountUnderlying *big.Int) (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.UnderlyingToSharesView(&_IDurationVaultStrategy.CallOpts, amountUnderlying)
+}
+
+// UnderlyingToSharesView is a free data retrieval call binding the contract method 0xe3dae51c.
+//
+// Solidity: function underlyingToSharesView(uint256 amountUnderlying) view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) UnderlyingToSharesView(amountUnderlying *big.Int) (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.UnderlyingToSharesView(&_IDurationVaultStrategy.CallOpts, amountUnderlying)
+}
+
+// UnderlyingToken is a free data retrieval call binding the contract method 0x2495a599.
+//
+// Solidity: function underlyingToken() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) UnderlyingToken(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "underlyingToken")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// UnderlyingToken is a free data retrieval call binding the contract method 0x2495a599.
+//
+// Solidity: function underlyingToken() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) UnderlyingToken() (common.Address, error) {
+ return _IDurationVaultStrategy.Contract.UnderlyingToken(&_IDurationVaultStrategy.CallOpts)
+}
+
+// UnderlyingToken is a free data retrieval call binding the contract method 0x2495a599.
+//
+// Solidity: function underlyingToken() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) UnderlyingToken() (common.Address, error) {
+ return _IDurationVaultStrategy.Contract.UnderlyingToken(&_IDurationVaultStrategy.CallOpts)
+}
+
+// UnlockTimestamp is a free data retrieval call binding the contract method 0xaa082a9d.
+//
+// Solidity: function unlockTimestamp() view returns(uint32)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) UnlockTimestamp(opts *bind.CallOpts) (uint32, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "unlockTimestamp")
+
+ if err != nil {
+ return *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+ return out0, err
+
+}
+
+// UnlockTimestamp is a free data retrieval call binding the contract method 0xaa082a9d.
+//
+// Solidity: function unlockTimestamp() view returns(uint32)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) UnlockTimestamp() (uint32, error) {
+ return _IDurationVaultStrategy.Contract.UnlockTimestamp(&_IDurationVaultStrategy.CallOpts)
+}
+
+// UnlockTimestamp is a free data retrieval call binding the contract method 0xaa082a9d.
+//
+// Solidity: function unlockTimestamp() view returns(uint32)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) UnlockTimestamp() (uint32, error) {
+ return _IDurationVaultStrategy.Contract.UnlockTimestamp(&_IDurationVaultStrategy.CallOpts)
+}
+
+// UserUnderlyingView is a free data retrieval call binding the contract method 0x553ca5f8.
+//
+// Solidity: function userUnderlyingView(address user) view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) UserUnderlyingView(opts *bind.CallOpts, user common.Address) (*big.Int, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "userUnderlyingView", user)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// UserUnderlyingView is a free data retrieval call binding the contract method 0x553ca5f8.
+//
+// Solidity: function userUnderlyingView(address user) view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) UserUnderlyingView(user common.Address) (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.UserUnderlyingView(&_IDurationVaultStrategy.CallOpts, user)
+}
+
+// UserUnderlyingView is a free data retrieval call binding the contract method 0x553ca5f8.
+//
+// Solidity: function userUnderlyingView(address user) view returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) UserUnderlyingView(user common.Address) (*big.Int, error) {
+ return _IDurationVaultStrategy.Contract.UserUnderlyingView(&_IDurationVaultStrategy.CallOpts, user)
+}
+
+// VaultAdmin is a free data retrieval call binding the contract method 0xe7f6f225.
+//
+// Solidity: function vaultAdmin() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) VaultAdmin(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "vaultAdmin")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// VaultAdmin is a free data retrieval call binding the contract method 0xe7f6f225.
+//
+// Solidity: function vaultAdmin() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) VaultAdmin() (common.Address, error) {
+ return _IDurationVaultStrategy.Contract.VaultAdmin(&_IDurationVaultStrategy.CallOpts)
+}
+
+// VaultAdmin is a free data retrieval call binding the contract method 0xe7f6f225.
+//
+// Solidity: function vaultAdmin() view returns(address)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) VaultAdmin() (common.Address, error) {
+ return _IDurationVaultStrategy.Contract.VaultAdmin(&_IDurationVaultStrategy.CallOpts)
+}
+
+// WithdrawalsOpen is a free data retrieval call binding the contract method 0x94aad677.
+//
+// Solidity: function withdrawalsOpen() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCaller) WithdrawalsOpen(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _IDurationVaultStrategy.contract.Call(opts, &out, "withdrawalsOpen")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// WithdrawalsOpen is a free data retrieval call binding the contract method 0x94aad677.
+//
+// Solidity: function withdrawalsOpen() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) WithdrawalsOpen() (bool, error) {
+ return _IDurationVaultStrategy.Contract.WithdrawalsOpen(&_IDurationVaultStrategy.CallOpts)
+}
+
+// WithdrawalsOpen is a free data retrieval call binding the contract method 0x94aad677.
+//
+// Solidity: function withdrawalsOpen() view returns(bool)
+func (_IDurationVaultStrategy *IDurationVaultStrategyCallerSession) WithdrawalsOpen() (bool, error) {
+ return _IDurationVaultStrategy.Contract.WithdrawalsOpen(&_IDurationVaultStrategy.CallOpts)
+}
+
+// AdvanceToWithdrawals is a paid mutator transaction binding the contract method 0x6325f655.
+//
+// Solidity: function advanceToWithdrawals() returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactor) AdvanceToWithdrawals(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.contract.Transact(opts, "advanceToWithdrawals")
+}
+
+// AdvanceToWithdrawals is a paid mutator transaction binding the contract method 0x6325f655.
+//
+// Solidity: function advanceToWithdrawals() returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) AdvanceToWithdrawals() (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.AdvanceToWithdrawals(&_IDurationVaultStrategy.TransactOpts)
+}
+
+// AdvanceToWithdrawals is a paid mutator transaction binding the contract method 0x6325f655.
+//
+// Solidity: function advanceToWithdrawals() returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorSession) AdvanceToWithdrawals() (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.AdvanceToWithdrawals(&_IDurationVaultStrategy.TransactOpts)
+}
+
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address staker, uint256 shares) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactor) BeforeAddShares(opts *bind.TransactOpts, staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.contract.Transact(opts, "beforeAddShares", staker, shares)
+}
+
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address staker, uint256 shares) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) BeforeAddShares(staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.BeforeAddShares(&_IDurationVaultStrategy.TransactOpts, staker, shares)
+}
+
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address staker, uint256 shares) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorSession) BeforeAddShares(staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.BeforeAddShares(&_IDurationVaultStrategy.TransactOpts, staker, shares)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address staker, uint256 shares) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactor) BeforeRemoveShares(opts *bind.TransactOpts, staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.contract.Transact(opts, "beforeRemoveShares", staker, shares)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address staker, uint256 shares) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) BeforeRemoveShares(staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.BeforeRemoveShares(&_IDurationVaultStrategy.TransactOpts, staker, shares)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address staker, uint256 shares) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorSession) BeforeRemoveShares(staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.BeforeRemoveShares(&_IDurationVaultStrategy.TransactOpts, staker, shares)
+}
+
+// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
+//
+// Solidity: function deposit(address token, uint256 amount) returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactor) Deposit(opts *bind.TransactOpts, token common.Address, amount *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.contract.Transact(opts, "deposit", token, amount)
+}
+
+// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
+//
+// Solidity: function deposit(address token, uint256 amount) returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) Deposit(token common.Address, amount *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.Deposit(&_IDurationVaultStrategy.TransactOpts, token, amount)
+}
+
+// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
+//
+// Solidity: function deposit(address token, uint256 amount) returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorSession) Deposit(token common.Address, amount *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.Deposit(&_IDurationVaultStrategy.TransactOpts, token, amount)
+}
+
+// Lock is a paid mutator transaction binding the contract method 0xf83d08ba.
+//
+// Solidity: function lock() returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactor) Lock(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.contract.Transact(opts, "lock")
+}
+
+// Lock is a paid mutator transaction binding the contract method 0xf83d08ba.
+//
+// Solidity: function lock() returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) Lock() (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.Lock(&_IDurationVaultStrategy.TransactOpts)
+}
+
+// Lock is a paid mutator transaction binding the contract method 0xf83d08ba.
+//
+// Solidity: function lock() returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorSession) Lock() (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.Lock(&_IDurationVaultStrategy.TransactOpts)
+}
+
+// MarkMatured is a paid mutator transaction binding the contract method 0x6d8690a9.
+//
+// Solidity: function markMatured() returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactor) MarkMatured(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.contract.Transact(opts, "markMatured")
+}
+
+// MarkMatured is a paid mutator transaction binding the contract method 0x6d8690a9.
+//
+// Solidity: function markMatured() returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) MarkMatured() (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.MarkMatured(&_IDurationVaultStrategy.TransactOpts)
+}
+
+// MarkMatured is a paid mutator transaction binding the contract method 0x6d8690a9.
+//
+// Solidity: function markMatured() returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorSession) MarkMatured() (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.MarkMatured(&_IDurationVaultStrategy.TransactOpts)
+}
+
+// SetRewardsClaimer is a paid mutator transaction binding the contract method 0xb501d660.
+//
+// Solidity: function setRewardsClaimer(address claimer) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactor) SetRewardsClaimer(opts *bind.TransactOpts, claimer common.Address) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.contract.Transact(opts, "setRewardsClaimer", claimer)
+}
+
+// SetRewardsClaimer is a paid mutator transaction binding the contract method 0xb501d660.
+//
+// Solidity: function setRewardsClaimer(address claimer) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) SetRewardsClaimer(claimer common.Address) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.SetRewardsClaimer(&_IDurationVaultStrategy.TransactOpts, claimer)
+}
+
+// SetRewardsClaimer is a paid mutator transaction binding the contract method 0xb501d660.
+//
+// Solidity: function setRewardsClaimer(address claimer) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorSession) SetRewardsClaimer(claimer common.Address) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.SetRewardsClaimer(&_IDurationVaultStrategy.TransactOpts, claimer)
+}
+
+// SharesToUnderlying is a paid mutator transaction binding the contract method 0xf3e73875.
+//
+// Solidity: function sharesToUnderlying(uint256 amountShares) returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactor) SharesToUnderlying(opts *bind.TransactOpts, amountShares *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.contract.Transact(opts, "sharesToUnderlying", amountShares)
+}
+
+// SharesToUnderlying is a paid mutator transaction binding the contract method 0xf3e73875.
+//
+// Solidity: function sharesToUnderlying(uint256 amountShares) returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) SharesToUnderlying(amountShares *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.SharesToUnderlying(&_IDurationVaultStrategy.TransactOpts, amountShares)
+}
+
+// SharesToUnderlying is a paid mutator transaction binding the contract method 0xf3e73875.
+//
+// Solidity: function sharesToUnderlying(uint256 amountShares) returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorSession) SharesToUnderlying(amountShares *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.SharesToUnderlying(&_IDurationVaultStrategy.TransactOpts, amountShares)
+}
+
+// UnderlyingToShares is a paid mutator transaction binding the contract method 0x8c871019.
+//
+// Solidity: function underlyingToShares(uint256 amountUnderlying) returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactor) UnderlyingToShares(opts *bind.TransactOpts, amountUnderlying *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.contract.Transact(opts, "underlyingToShares", amountUnderlying)
+}
+
+// UnderlyingToShares is a paid mutator transaction binding the contract method 0x8c871019.
+//
+// Solidity: function underlyingToShares(uint256 amountUnderlying) returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) UnderlyingToShares(amountUnderlying *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.UnderlyingToShares(&_IDurationVaultStrategy.TransactOpts, amountUnderlying)
+}
+
+// UnderlyingToShares is a paid mutator transaction binding the contract method 0x8c871019.
+//
+// Solidity: function underlyingToShares(uint256 amountUnderlying) returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorSession) UnderlyingToShares(amountUnderlying *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.UnderlyingToShares(&_IDurationVaultStrategy.TransactOpts, amountUnderlying)
+}
+
+// UpdateDelegationApprover is a paid mutator transaction binding the contract method 0xb4e20f13.
+//
+// Solidity: function updateDelegationApprover(address newDelegationApprover) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactor) UpdateDelegationApprover(opts *bind.TransactOpts, newDelegationApprover common.Address) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.contract.Transact(opts, "updateDelegationApprover", newDelegationApprover)
+}
+
+// UpdateDelegationApprover is a paid mutator transaction binding the contract method 0xb4e20f13.
+//
+// Solidity: function updateDelegationApprover(address newDelegationApprover) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) UpdateDelegationApprover(newDelegationApprover common.Address) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.UpdateDelegationApprover(&_IDurationVaultStrategy.TransactOpts, newDelegationApprover)
+}
+
+// UpdateDelegationApprover is a paid mutator transaction binding the contract method 0xb4e20f13.
+//
+// Solidity: function updateDelegationApprover(address newDelegationApprover) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorSession) UpdateDelegationApprover(newDelegationApprover common.Address) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.UpdateDelegationApprover(&_IDurationVaultStrategy.TransactOpts, newDelegationApprover)
+}
+
+// UpdateMetadataURI is a paid mutator transaction binding the contract method 0x53fd3e81.
+//
+// Solidity: function updateMetadataURI(string newMetadataURI) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactor) UpdateMetadataURI(opts *bind.TransactOpts, newMetadataURI string) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.contract.Transact(opts, "updateMetadataURI", newMetadataURI)
+}
+
+// UpdateMetadataURI is a paid mutator transaction binding the contract method 0x53fd3e81.
+//
+// Solidity: function updateMetadataURI(string newMetadataURI) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) UpdateMetadataURI(newMetadataURI string) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.UpdateMetadataURI(&_IDurationVaultStrategy.TransactOpts, newMetadataURI)
+}
+
+// UpdateMetadataURI is a paid mutator transaction binding the contract method 0x53fd3e81.
+//
+// Solidity: function updateMetadataURI(string newMetadataURI) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorSession) UpdateMetadataURI(newMetadataURI string) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.UpdateMetadataURI(&_IDurationVaultStrategy.TransactOpts, newMetadataURI)
+}
+
+// UpdateOperatorMetadataURI is a paid mutator transaction binding the contract method 0x99be81c8.
+//
+// Solidity: function updateOperatorMetadataURI(string newOperatorMetadataURI) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactor) UpdateOperatorMetadataURI(opts *bind.TransactOpts, newOperatorMetadataURI string) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.contract.Transact(opts, "updateOperatorMetadataURI", newOperatorMetadataURI)
+}
+
+// UpdateOperatorMetadataURI is a paid mutator transaction binding the contract method 0x99be81c8.
+//
+// Solidity: function updateOperatorMetadataURI(string newOperatorMetadataURI) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) UpdateOperatorMetadataURI(newOperatorMetadataURI string) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.UpdateOperatorMetadataURI(&_IDurationVaultStrategy.TransactOpts, newOperatorMetadataURI)
+}
+
+// UpdateOperatorMetadataURI is a paid mutator transaction binding the contract method 0x99be81c8.
+//
+// Solidity: function updateOperatorMetadataURI(string newOperatorMetadataURI) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorSession) UpdateOperatorMetadataURI(newOperatorMetadataURI string) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.UpdateOperatorMetadataURI(&_IDurationVaultStrategy.TransactOpts, newOperatorMetadataURI)
+}
+
+// UpdateTVLLimits is a paid mutator transaction binding the contract method 0xaf6eb2be.
+//
+// Solidity: function updateTVLLimits(uint256 newMaxPerDeposit, uint256 newStakeCap) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactor) UpdateTVLLimits(opts *bind.TransactOpts, newMaxPerDeposit *big.Int, newStakeCap *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.contract.Transact(opts, "updateTVLLimits", newMaxPerDeposit, newStakeCap)
+}
+
+// UpdateTVLLimits is a paid mutator transaction binding the contract method 0xaf6eb2be.
+//
+// Solidity: function updateTVLLimits(uint256 newMaxPerDeposit, uint256 newStakeCap) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) UpdateTVLLimits(newMaxPerDeposit *big.Int, newStakeCap *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.UpdateTVLLimits(&_IDurationVaultStrategy.TransactOpts, newMaxPerDeposit, newStakeCap)
+}
+
+// UpdateTVLLimits is a paid mutator transaction binding the contract method 0xaf6eb2be.
+//
+// Solidity: function updateTVLLimits(uint256 newMaxPerDeposit, uint256 newStakeCap) returns()
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorSession) UpdateTVLLimits(newMaxPerDeposit *big.Int, newStakeCap *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.UpdateTVLLimits(&_IDurationVaultStrategy.TransactOpts, newMaxPerDeposit, newStakeCap)
+}
+
+// UserUnderlying is a paid mutator transaction binding the contract method 0x8f6a6240.
+//
+// Solidity: function userUnderlying(address user) returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactor) UserUnderlying(opts *bind.TransactOpts, user common.Address) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.contract.Transact(opts, "userUnderlying", user)
+}
+
+// UserUnderlying is a paid mutator transaction binding the contract method 0x8f6a6240.
+//
+// Solidity: function userUnderlying(address user) returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) UserUnderlying(user common.Address) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.UserUnderlying(&_IDurationVaultStrategy.TransactOpts, user)
+}
+
+// UserUnderlying is a paid mutator transaction binding the contract method 0x8f6a6240.
+//
+// Solidity: function userUnderlying(address user) returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorSession) UserUnderlying(user common.Address) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.UserUnderlying(&_IDurationVaultStrategy.TransactOpts, user)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0xd9caed12.
+//
+// Solidity: function withdraw(address recipient, address token, uint256 amountShares) returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactor) Withdraw(opts *bind.TransactOpts, recipient common.Address, token common.Address, amountShares *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.contract.Transact(opts, "withdraw", recipient, token, amountShares)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0xd9caed12.
+//
+// Solidity: function withdraw(address recipient, address token, uint256 amountShares) returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategySession) Withdraw(recipient common.Address, token common.Address, amountShares *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.Withdraw(&_IDurationVaultStrategy.TransactOpts, recipient, token, amountShares)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0xd9caed12.
+//
+// Solidity: function withdraw(address recipient, address token, uint256 amountShares) returns(uint256)
+func (_IDurationVaultStrategy *IDurationVaultStrategyTransactorSession) Withdraw(recipient common.Address, token common.Address, amountShares *big.Int) (*types.Transaction, error) {
+ return _IDurationVaultStrategy.Contract.Withdraw(&_IDurationVaultStrategy.TransactOpts, recipient, token, amountShares)
+}
+
+// IDurationVaultStrategyDeallocateAttemptedIterator is returned from FilterDeallocateAttempted and is used to iterate over the raw logs and unpacked data for DeallocateAttempted events raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyDeallocateAttemptedIterator struct {
+ Event *IDurationVaultStrategyDeallocateAttempted // 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 *IDurationVaultStrategyDeallocateAttemptedIterator) 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(IDurationVaultStrategyDeallocateAttempted)
+ 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(IDurationVaultStrategyDeallocateAttempted)
+ 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 *IDurationVaultStrategyDeallocateAttemptedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IDurationVaultStrategyDeallocateAttemptedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IDurationVaultStrategyDeallocateAttempted represents a DeallocateAttempted event raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyDeallocateAttempted struct {
+ Success bool
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDeallocateAttempted is a free log retrieval operation binding the contract event 0x72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b.
+//
+// Solidity: event DeallocateAttempted(bool success)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) FilterDeallocateAttempted(opts *bind.FilterOpts) (*IDurationVaultStrategyDeallocateAttemptedIterator, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.FilterLogs(opts, "DeallocateAttempted")
+ if err != nil {
+ return nil, err
+ }
+ return &IDurationVaultStrategyDeallocateAttemptedIterator{contract: _IDurationVaultStrategy.contract, event: "DeallocateAttempted", logs: logs, sub: sub}, nil
+}
+
+// WatchDeallocateAttempted is a free log subscription operation binding the contract event 0x72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b.
+//
+// Solidity: event DeallocateAttempted(bool success)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchDeallocateAttempted(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyDeallocateAttempted) (event.Subscription, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.WatchLogs(opts, "DeallocateAttempted")
+ 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(IDurationVaultStrategyDeallocateAttempted)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "DeallocateAttempted", 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
+}
+
+// ParseDeallocateAttempted is a log parse operation binding the contract event 0x72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b.
+//
+// Solidity: event DeallocateAttempted(bool success)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseDeallocateAttempted(log types.Log) (*IDurationVaultStrategyDeallocateAttempted, error) {
+ event := new(IDurationVaultStrategyDeallocateAttempted)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "DeallocateAttempted", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IDurationVaultStrategyDeregisterAttemptedIterator is returned from FilterDeregisterAttempted and is used to iterate over the raw logs and unpacked data for DeregisterAttempted events raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyDeregisterAttemptedIterator struct {
+ Event *IDurationVaultStrategyDeregisterAttempted // 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 *IDurationVaultStrategyDeregisterAttemptedIterator) 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(IDurationVaultStrategyDeregisterAttempted)
+ 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(IDurationVaultStrategyDeregisterAttempted)
+ 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 *IDurationVaultStrategyDeregisterAttemptedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IDurationVaultStrategyDeregisterAttemptedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IDurationVaultStrategyDeregisterAttempted represents a DeregisterAttempted event raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyDeregisterAttempted struct {
+ Success bool
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDeregisterAttempted is a free log retrieval operation binding the contract event 0xd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d168.
+//
+// Solidity: event DeregisterAttempted(bool success)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) FilterDeregisterAttempted(opts *bind.FilterOpts) (*IDurationVaultStrategyDeregisterAttemptedIterator, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.FilterLogs(opts, "DeregisterAttempted")
+ if err != nil {
+ return nil, err
+ }
+ return &IDurationVaultStrategyDeregisterAttemptedIterator{contract: _IDurationVaultStrategy.contract, event: "DeregisterAttempted", logs: logs, sub: sub}, nil
+}
+
+// WatchDeregisterAttempted is a free log subscription operation binding the contract event 0xd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d168.
+//
+// Solidity: event DeregisterAttempted(bool success)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchDeregisterAttempted(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyDeregisterAttempted) (event.Subscription, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.WatchLogs(opts, "DeregisterAttempted")
+ 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(IDurationVaultStrategyDeregisterAttempted)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "DeregisterAttempted", 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
+}
+
+// ParseDeregisterAttempted is a log parse operation binding the contract event 0xd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d168.
+//
+// Solidity: event DeregisterAttempted(bool success)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseDeregisterAttempted(log types.Log) (*IDurationVaultStrategyDeregisterAttempted, error) {
+ event := new(IDurationVaultStrategyDeregisterAttempted)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "DeregisterAttempted", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IDurationVaultStrategyExchangeRateEmittedIterator is returned from FilterExchangeRateEmitted and is used to iterate over the raw logs and unpacked data for ExchangeRateEmitted events raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyExchangeRateEmittedIterator struct {
+ Event *IDurationVaultStrategyExchangeRateEmitted // 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 *IDurationVaultStrategyExchangeRateEmittedIterator) 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(IDurationVaultStrategyExchangeRateEmitted)
+ 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(IDurationVaultStrategyExchangeRateEmitted)
+ 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 *IDurationVaultStrategyExchangeRateEmittedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IDurationVaultStrategyExchangeRateEmittedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IDurationVaultStrategyExchangeRateEmitted represents a ExchangeRateEmitted event raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyExchangeRateEmitted struct {
+ Rate *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterExchangeRateEmitted is a free log retrieval operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
+//
+// Solidity: event ExchangeRateEmitted(uint256 rate)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) FilterExchangeRateEmitted(opts *bind.FilterOpts) (*IDurationVaultStrategyExchangeRateEmittedIterator, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.FilterLogs(opts, "ExchangeRateEmitted")
+ if err != nil {
+ return nil, err
+ }
+ return &IDurationVaultStrategyExchangeRateEmittedIterator{contract: _IDurationVaultStrategy.contract, event: "ExchangeRateEmitted", logs: logs, sub: sub}, nil
+}
+
+// WatchExchangeRateEmitted is a free log subscription operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
+//
+// Solidity: event ExchangeRateEmitted(uint256 rate)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchExchangeRateEmitted(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyExchangeRateEmitted) (event.Subscription, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.WatchLogs(opts, "ExchangeRateEmitted")
+ 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(IDurationVaultStrategyExchangeRateEmitted)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "ExchangeRateEmitted", 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
+}
+
+// ParseExchangeRateEmitted is a log parse operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
+//
+// Solidity: event ExchangeRateEmitted(uint256 rate)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseExchangeRateEmitted(log types.Log) (*IDurationVaultStrategyExchangeRateEmitted, error) {
+ event := new(IDurationVaultStrategyExchangeRateEmitted)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "ExchangeRateEmitted", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IDurationVaultStrategyMaxPerDepositUpdatedIterator is returned from FilterMaxPerDepositUpdated and is used to iterate over the raw logs and unpacked data for MaxPerDepositUpdated events raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyMaxPerDepositUpdatedIterator struct {
+ Event *IDurationVaultStrategyMaxPerDepositUpdated // 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 *IDurationVaultStrategyMaxPerDepositUpdatedIterator) 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(IDurationVaultStrategyMaxPerDepositUpdated)
+ 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(IDurationVaultStrategyMaxPerDepositUpdated)
+ 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 *IDurationVaultStrategyMaxPerDepositUpdatedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IDurationVaultStrategyMaxPerDepositUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IDurationVaultStrategyMaxPerDepositUpdated represents a MaxPerDepositUpdated event raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyMaxPerDepositUpdated struct {
+ PreviousValue *big.Int
+ NewValue *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterMaxPerDepositUpdated is a free log retrieval operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
+//
+// Solidity: event MaxPerDepositUpdated(uint256 previousValue, uint256 newValue)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) FilterMaxPerDepositUpdated(opts *bind.FilterOpts) (*IDurationVaultStrategyMaxPerDepositUpdatedIterator, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.FilterLogs(opts, "MaxPerDepositUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return &IDurationVaultStrategyMaxPerDepositUpdatedIterator{contract: _IDurationVaultStrategy.contract, event: "MaxPerDepositUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchMaxPerDepositUpdated is a free log subscription operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
+//
+// Solidity: event MaxPerDepositUpdated(uint256 previousValue, uint256 newValue)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchMaxPerDepositUpdated(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyMaxPerDepositUpdated) (event.Subscription, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.WatchLogs(opts, "MaxPerDepositUpdated")
+ 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(IDurationVaultStrategyMaxPerDepositUpdated)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "MaxPerDepositUpdated", 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
+}
+
+// ParseMaxPerDepositUpdated is a log parse operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
+//
+// Solidity: event MaxPerDepositUpdated(uint256 previousValue, uint256 newValue)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseMaxPerDepositUpdated(log types.Log) (*IDurationVaultStrategyMaxPerDepositUpdated, error) {
+ event := new(IDurationVaultStrategyMaxPerDepositUpdated)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "MaxPerDepositUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IDurationVaultStrategyMaxTotalDepositsUpdatedIterator is returned from FilterMaxTotalDepositsUpdated and is used to iterate over the raw logs and unpacked data for MaxTotalDepositsUpdated events raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyMaxTotalDepositsUpdatedIterator struct {
+ Event *IDurationVaultStrategyMaxTotalDepositsUpdated // 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 *IDurationVaultStrategyMaxTotalDepositsUpdatedIterator) 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(IDurationVaultStrategyMaxTotalDepositsUpdated)
+ 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(IDurationVaultStrategyMaxTotalDepositsUpdated)
+ 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 *IDurationVaultStrategyMaxTotalDepositsUpdatedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IDurationVaultStrategyMaxTotalDepositsUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IDurationVaultStrategyMaxTotalDepositsUpdated represents a MaxTotalDepositsUpdated event raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyMaxTotalDepositsUpdated struct {
+ PreviousValue *big.Int
+ NewValue *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterMaxTotalDepositsUpdated is a free log retrieval operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
+//
+// Solidity: event MaxTotalDepositsUpdated(uint256 previousValue, uint256 newValue)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) FilterMaxTotalDepositsUpdated(opts *bind.FilterOpts) (*IDurationVaultStrategyMaxTotalDepositsUpdatedIterator, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.FilterLogs(opts, "MaxTotalDepositsUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return &IDurationVaultStrategyMaxTotalDepositsUpdatedIterator{contract: _IDurationVaultStrategy.contract, event: "MaxTotalDepositsUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchMaxTotalDepositsUpdated is a free log subscription operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
+//
+// Solidity: event MaxTotalDepositsUpdated(uint256 previousValue, uint256 newValue)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchMaxTotalDepositsUpdated(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyMaxTotalDepositsUpdated) (event.Subscription, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.WatchLogs(opts, "MaxTotalDepositsUpdated")
+ 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(IDurationVaultStrategyMaxTotalDepositsUpdated)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "MaxTotalDepositsUpdated", 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
+}
+
+// ParseMaxTotalDepositsUpdated is a log parse operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
+//
+// Solidity: event MaxTotalDepositsUpdated(uint256 previousValue, uint256 newValue)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseMaxTotalDepositsUpdated(log types.Log) (*IDurationVaultStrategyMaxTotalDepositsUpdated, error) {
+ event := new(IDurationVaultStrategyMaxTotalDepositsUpdated)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "MaxTotalDepositsUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IDurationVaultStrategyMetadataURIUpdatedIterator is returned from FilterMetadataURIUpdated and is used to iterate over the raw logs and unpacked data for MetadataURIUpdated events raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyMetadataURIUpdatedIterator struct {
+ Event *IDurationVaultStrategyMetadataURIUpdated // 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 *IDurationVaultStrategyMetadataURIUpdatedIterator) 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(IDurationVaultStrategyMetadataURIUpdated)
+ 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(IDurationVaultStrategyMetadataURIUpdated)
+ 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 *IDurationVaultStrategyMetadataURIUpdatedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IDurationVaultStrategyMetadataURIUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IDurationVaultStrategyMetadataURIUpdated represents a MetadataURIUpdated event raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyMetadataURIUpdated struct {
+ NewMetadataURI string
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterMetadataURIUpdated is a free log retrieval operation binding the contract event 0xefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba39.
+//
+// Solidity: event MetadataURIUpdated(string newMetadataURI)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) FilterMetadataURIUpdated(opts *bind.FilterOpts) (*IDurationVaultStrategyMetadataURIUpdatedIterator, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.FilterLogs(opts, "MetadataURIUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return &IDurationVaultStrategyMetadataURIUpdatedIterator{contract: _IDurationVaultStrategy.contract, event: "MetadataURIUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchMetadataURIUpdated is a free log subscription operation binding the contract event 0xefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba39.
+//
+// Solidity: event MetadataURIUpdated(string newMetadataURI)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyMetadataURIUpdated) (event.Subscription, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.WatchLogs(opts, "MetadataURIUpdated")
+ 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(IDurationVaultStrategyMetadataURIUpdated)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "MetadataURIUpdated", 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
+}
+
+// ParseMetadataURIUpdated is a log parse operation binding the contract event 0xefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba39.
+//
+// Solidity: event MetadataURIUpdated(string newMetadataURI)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseMetadataURIUpdated(log types.Log) (*IDurationVaultStrategyMetadataURIUpdated, error) {
+ event := new(IDurationVaultStrategyMetadataURIUpdated)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "MetadataURIUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IDurationVaultStrategyStrategyTokenSetIterator is returned from FilterStrategyTokenSet and is used to iterate over the raw logs and unpacked data for StrategyTokenSet events raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyStrategyTokenSetIterator struct {
+ Event *IDurationVaultStrategyStrategyTokenSet // 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 *IDurationVaultStrategyStrategyTokenSetIterator) 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(IDurationVaultStrategyStrategyTokenSet)
+ 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(IDurationVaultStrategyStrategyTokenSet)
+ 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 *IDurationVaultStrategyStrategyTokenSetIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IDurationVaultStrategyStrategyTokenSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IDurationVaultStrategyStrategyTokenSet represents a StrategyTokenSet event raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyStrategyTokenSet struct {
+ Token common.Address
+ Decimals uint8
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterStrategyTokenSet is a free log retrieval operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
+//
+// Solidity: event StrategyTokenSet(address token, uint8 decimals)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) FilterStrategyTokenSet(opts *bind.FilterOpts) (*IDurationVaultStrategyStrategyTokenSetIterator, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.FilterLogs(opts, "StrategyTokenSet")
+ if err != nil {
+ return nil, err
+ }
+ return &IDurationVaultStrategyStrategyTokenSetIterator{contract: _IDurationVaultStrategy.contract, event: "StrategyTokenSet", logs: logs, sub: sub}, nil
+}
+
+// WatchStrategyTokenSet is a free log subscription operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
+//
+// Solidity: event StrategyTokenSet(address token, uint8 decimals)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchStrategyTokenSet(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyStrategyTokenSet) (event.Subscription, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.WatchLogs(opts, "StrategyTokenSet")
+ 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(IDurationVaultStrategyStrategyTokenSet)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "StrategyTokenSet", 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
+}
+
+// ParseStrategyTokenSet is a log parse operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
+//
+// Solidity: event StrategyTokenSet(address token, uint8 decimals)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseStrategyTokenSet(log types.Log) (*IDurationVaultStrategyStrategyTokenSet, error) {
+ event := new(IDurationVaultStrategyStrategyTokenSet)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "StrategyTokenSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IDurationVaultStrategyVaultAdvancedToWithdrawalsIterator is returned from FilterVaultAdvancedToWithdrawals and is used to iterate over the raw logs and unpacked data for VaultAdvancedToWithdrawals events raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyVaultAdvancedToWithdrawalsIterator struct {
+ Event *IDurationVaultStrategyVaultAdvancedToWithdrawals // 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 *IDurationVaultStrategyVaultAdvancedToWithdrawalsIterator) 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(IDurationVaultStrategyVaultAdvancedToWithdrawals)
+ 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(IDurationVaultStrategyVaultAdvancedToWithdrawals)
+ 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 *IDurationVaultStrategyVaultAdvancedToWithdrawalsIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IDurationVaultStrategyVaultAdvancedToWithdrawalsIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IDurationVaultStrategyVaultAdvancedToWithdrawals represents a VaultAdvancedToWithdrawals event raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyVaultAdvancedToWithdrawals struct {
+ Arbitrator common.Address
+ MaturedAt uint32
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterVaultAdvancedToWithdrawals is a free log retrieval operation binding the contract event 0x96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb97.
+//
+// Solidity: event VaultAdvancedToWithdrawals(address indexed arbitrator, uint32 maturedAt)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) FilterVaultAdvancedToWithdrawals(opts *bind.FilterOpts, arbitrator []common.Address) (*IDurationVaultStrategyVaultAdvancedToWithdrawalsIterator, error) {
+
+ var arbitratorRule []interface{}
+ for _, arbitratorItem := range arbitrator {
+ arbitratorRule = append(arbitratorRule, arbitratorItem)
+ }
+
+ logs, sub, err := _IDurationVaultStrategy.contract.FilterLogs(opts, "VaultAdvancedToWithdrawals", arbitratorRule)
+ if err != nil {
+ return nil, err
+ }
+ return &IDurationVaultStrategyVaultAdvancedToWithdrawalsIterator{contract: _IDurationVaultStrategy.contract, event: "VaultAdvancedToWithdrawals", logs: logs, sub: sub}, nil
+}
+
+// WatchVaultAdvancedToWithdrawals is a free log subscription operation binding the contract event 0x96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb97.
+//
+// Solidity: event VaultAdvancedToWithdrawals(address indexed arbitrator, uint32 maturedAt)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchVaultAdvancedToWithdrawals(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyVaultAdvancedToWithdrawals, arbitrator []common.Address) (event.Subscription, error) {
+
+ var arbitratorRule []interface{}
+ for _, arbitratorItem := range arbitrator {
+ arbitratorRule = append(arbitratorRule, arbitratorItem)
+ }
+
+ logs, sub, err := _IDurationVaultStrategy.contract.WatchLogs(opts, "VaultAdvancedToWithdrawals", arbitratorRule)
+ 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(IDurationVaultStrategyVaultAdvancedToWithdrawals)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "VaultAdvancedToWithdrawals", 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
+}
+
+// ParseVaultAdvancedToWithdrawals is a log parse operation binding the contract event 0x96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb97.
+//
+// Solidity: event VaultAdvancedToWithdrawals(address indexed arbitrator, uint32 maturedAt)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseVaultAdvancedToWithdrawals(log types.Log) (*IDurationVaultStrategyVaultAdvancedToWithdrawals, error) {
+ event := new(IDurationVaultStrategyVaultAdvancedToWithdrawals)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "VaultAdvancedToWithdrawals", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IDurationVaultStrategyVaultInitializedIterator is returned from FilterVaultInitialized and is used to iterate over the raw logs and unpacked data for VaultInitialized events raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyVaultInitializedIterator struct {
+ Event *IDurationVaultStrategyVaultInitialized // 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 *IDurationVaultStrategyVaultInitializedIterator) 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(IDurationVaultStrategyVaultInitialized)
+ 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(IDurationVaultStrategyVaultInitialized)
+ 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 *IDurationVaultStrategyVaultInitializedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IDurationVaultStrategyVaultInitializedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IDurationVaultStrategyVaultInitialized represents a VaultInitialized event raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyVaultInitialized struct {
+ VaultAdmin common.Address
+ Arbitrator common.Address
+ UnderlyingToken common.Address
+ Duration uint32
+ MaxPerDeposit *big.Int
+ StakeCap *big.Int
+ MetadataURI string
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterVaultInitialized is a free log retrieval operation binding the contract event 0xbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e.
+//
+// Solidity: event VaultInitialized(address indexed vaultAdmin, address indexed arbitrator, address indexed underlyingToken, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) FilterVaultInitialized(opts *bind.FilterOpts, vaultAdmin []common.Address, arbitrator []common.Address, underlyingToken []common.Address) (*IDurationVaultStrategyVaultInitializedIterator, error) {
+
+ var vaultAdminRule []interface{}
+ for _, vaultAdminItem := range vaultAdmin {
+ vaultAdminRule = append(vaultAdminRule, vaultAdminItem)
+ }
+ var arbitratorRule []interface{}
+ for _, arbitratorItem := range arbitrator {
+ arbitratorRule = append(arbitratorRule, arbitratorItem)
+ }
+ var underlyingTokenRule []interface{}
+ for _, underlyingTokenItem := range underlyingToken {
+ underlyingTokenRule = append(underlyingTokenRule, underlyingTokenItem)
+ }
+
+ logs, sub, err := _IDurationVaultStrategy.contract.FilterLogs(opts, "VaultInitialized", vaultAdminRule, arbitratorRule, underlyingTokenRule)
+ if err != nil {
+ return nil, err
+ }
+ return &IDurationVaultStrategyVaultInitializedIterator{contract: _IDurationVaultStrategy.contract, event: "VaultInitialized", logs: logs, sub: sub}, nil
+}
+
+// WatchVaultInitialized is a free log subscription operation binding the contract event 0xbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e.
+//
+// Solidity: event VaultInitialized(address indexed vaultAdmin, address indexed arbitrator, address indexed underlyingToken, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchVaultInitialized(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyVaultInitialized, vaultAdmin []common.Address, arbitrator []common.Address, underlyingToken []common.Address) (event.Subscription, error) {
+
+ var vaultAdminRule []interface{}
+ for _, vaultAdminItem := range vaultAdmin {
+ vaultAdminRule = append(vaultAdminRule, vaultAdminItem)
+ }
+ var arbitratorRule []interface{}
+ for _, arbitratorItem := range arbitrator {
+ arbitratorRule = append(arbitratorRule, arbitratorItem)
+ }
+ var underlyingTokenRule []interface{}
+ for _, underlyingTokenItem := range underlyingToken {
+ underlyingTokenRule = append(underlyingTokenRule, underlyingTokenItem)
+ }
+
+ logs, sub, err := _IDurationVaultStrategy.contract.WatchLogs(opts, "VaultInitialized", vaultAdminRule, arbitratorRule, underlyingTokenRule)
+ 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(IDurationVaultStrategyVaultInitialized)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "VaultInitialized", 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
+}
+
+// ParseVaultInitialized is a log parse operation binding the contract event 0xbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e.
+//
+// Solidity: event VaultInitialized(address indexed vaultAdmin, address indexed arbitrator, address indexed underlyingToken, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseVaultInitialized(log types.Log) (*IDurationVaultStrategyVaultInitialized, error) {
+ event := new(IDurationVaultStrategyVaultInitialized)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "VaultInitialized", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IDurationVaultStrategyVaultLockedIterator is returned from FilterVaultLocked and is used to iterate over the raw logs and unpacked data for VaultLocked events raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyVaultLockedIterator struct {
+ Event *IDurationVaultStrategyVaultLocked // 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 *IDurationVaultStrategyVaultLockedIterator) 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(IDurationVaultStrategyVaultLocked)
+ 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(IDurationVaultStrategyVaultLocked)
+ 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 *IDurationVaultStrategyVaultLockedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IDurationVaultStrategyVaultLockedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IDurationVaultStrategyVaultLocked represents a VaultLocked event raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyVaultLocked struct {
+ LockedAt uint32
+ UnlockAt uint32
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterVaultLocked is a free log retrieval operation binding the contract event 0x42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4.
+//
+// Solidity: event VaultLocked(uint32 lockedAt, uint32 unlockAt)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) FilterVaultLocked(opts *bind.FilterOpts) (*IDurationVaultStrategyVaultLockedIterator, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.FilterLogs(opts, "VaultLocked")
+ if err != nil {
+ return nil, err
+ }
+ return &IDurationVaultStrategyVaultLockedIterator{contract: _IDurationVaultStrategy.contract, event: "VaultLocked", logs: logs, sub: sub}, nil
+}
+
+// WatchVaultLocked is a free log subscription operation binding the contract event 0x42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4.
+//
+// Solidity: event VaultLocked(uint32 lockedAt, uint32 unlockAt)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchVaultLocked(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyVaultLocked) (event.Subscription, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.WatchLogs(opts, "VaultLocked")
+ 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(IDurationVaultStrategyVaultLocked)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "VaultLocked", 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
+}
+
+// ParseVaultLocked is a log parse operation binding the contract event 0x42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4.
+//
+// Solidity: event VaultLocked(uint32 lockedAt, uint32 unlockAt)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseVaultLocked(log types.Log) (*IDurationVaultStrategyVaultLocked, error) {
+ event := new(IDurationVaultStrategyVaultLocked)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "VaultLocked", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IDurationVaultStrategyVaultMaturedIterator is returned from FilterVaultMatured and is used to iterate over the raw logs and unpacked data for VaultMatured events raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyVaultMaturedIterator struct {
+ Event *IDurationVaultStrategyVaultMatured // 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 *IDurationVaultStrategyVaultMaturedIterator) 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(IDurationVaultStrategyVaultMatured)
+ 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(IDurationVaultStrategyVaultMatured)
+ 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 *IDurationVaultStrategyVaultMaturedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IDurationVaultStrategyVaultMaturedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IDurationVaultStrategyVaultMatured represents a VaultMatured event raised by the IDurationVaultStrategy contract.
+type IDurationVaultStrategyVaultMatured struct {
+ MaturedAt uint32
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterVaultMatured is a free log retrieval operation binding the contract event 0xff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f2.
+//
+// Solidity: event VaultMatured(uint32 maturedAt)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) FilterVaultMatured(opts *bind.FilterOpts) (*IDurationVaultStrategyVaultMaturedIterator, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.FilterLogs(opts, "VaultMatured")
+ if err != nil {
+ return nil, err
+ }
+ return &IDurationVaultStrategyVaultMaturedIterator{contract: _IDurationVaultStrategy.contract, event: "VaultMatured", logs: logs, sub: sub}, nil
+}
+
+// WatchVaultMatured is a free log subscription operation binding the contract event 0xff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f2.
+//
+// Solidity: event VaultMatured(uint32 maturedAt)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchVaultMatured(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyVaultMatured) (event.Subscription, error) {
+
+ logs, sub, err := _IDurationVaultStrategy.contract.WatchLogs(opts, "VaultMatured")
+ 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(IDurationVaultStrategyVaultMatured)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "VaultMatured", 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
+}
+
+// ParseVaultMatured is a log parse operation binding the contract event 0xff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f2.
+//
+// Solidity: event VaultMatured(uint32 maturedAt)
+func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseVaultMatured(log types.Log) (*IDurationVaultStrategyVaultMatured, error) {
+ event := new(IDurationVaultStrategyVaultMatured)
+ if err := _IDurationVaultStrategy.contract.UnpackLog(event, "VaultMatured", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
diff --git a/pkg/bindings/IEmissionsController/binding.go b/pkg/bindings/IEmissionsController/binding.go
new file mode 100644
index 0000000000..4d580ced23
--- /dev/null
+++ b/pkg/bindings/IEmissionsController/binding.go
@@ -0,0 +1,2054 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package IEmissionsController
+
+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
+)
+
+// IEmissionsControllerTypesDistribution is an auto generated low-level Go binding around an user-defined struct.
+type IEmissionsControllerTypesDistribution struct {
+ Weight uint64
+ StartEpoch uint64
+ TotalEpochs uint64
+ DistributionType uint8
+ OperatorSet OperatorSet
+ StrategiesAndMultipliers [][]IRewardsCoordinatorTypesStrategyAndMultiplier
+}
+
+// IRewardsCoordinatorTypesStrategyAndMultiplier is an auto generated low-level Go binding around an user-defined struct.
+type IRewardsCoordinatorTypesStrategyAndMultiplier struct {
+ Strategy common.Address
+ Multiplier *big.Int
+}
+
+// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
+type OperatorSet struct {
+ Avs common.Address
+ Id uint32
+}
+
+// IEmissionsControllerMetaData contains all meta data concerning the IEmissionsController contract.
+var IEmissionsControllerMetaData = &bind.MetaData{
+ ABI: "[{\"type\":\"function\",\"name\":\"ALLOCATION_MANAGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BACKING_EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBackingEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EMISSIONS_EPOCH_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EMISSIONS_INFLATION_RATE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EMISSIONS_START_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_TOTAL_WEIGHT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"REWARDS_COORDINATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRewardsCoordinator\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addDistribution\",\"inputs\":[{\"name\":\"distribution\",\"type\":\"tuple\",\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"outputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentEpoch\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistribution\",\"inputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributions\",\"inputs\":[{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIEmissionsControllerTypes.Distribution[]\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTotalProcessableDistributions\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"incentiveCouncil\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"incentiveCouncil\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isButtonPressable\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastTimeButtonPressable\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextTimeButtonPressable\",\"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\":\"pressButton\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setIncentiveCouncil\",\"inputs\":[{\"name\":\"incentiveCouncil\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sweep\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"totalWeight\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateDistribution\",\"inputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"distribution\",\"type\":\"tuple\",\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"DistributionAdded\",\"inputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"epoch\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"distribution\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionProcessed\",\"inputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"epoch\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"distribution\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]},{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionUpdated\",\"inputs\":[{\"name\":\"distributionId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"epoch\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"distribution\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIEmissionsControllerTypes.Distribution\",\"components\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startEpoch\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"totalEpochs\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"distributionType\",\"type\":\"uint8\",\"internalType\":\"enumIEmissionsControllerTypes.DistributionType\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[][]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[][]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"IncentiveCouncilUpdated\",\"inputs\":[{\"name\":\"incentiveCouncil\",\"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\":\"Swept\",\"inputs\":[{\"name\":\"incentiveCouncil\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"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\":\"AllDistributionsMustBeProcessed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AllDistributionsProcessed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotIncentiveCouncil\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotAddDisabledDistribution\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmissionsNotStarted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EpochLengthNotAlignedWithCalculationInterval\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDistributionType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaliciousCallDetected\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorSetNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsSubmissionsCannotBeEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartEpochMustBeInTheFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimeNotAlignedWithCalculationInterval\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalWeightExceedsMax\",\"inputs\":[]}]",
+}
+
+// IEmissionsControllerABI is the input ABI used to generate the binding from.
+// Deprecated: Use IEmissionsControllerMetaData.ABI instead.
+var IEmissionsControllerABI = IEmissionsControllerMetaData.ABI
+
+// IEmissionsController is an auto generated Go binding around an Ethereum contract.
+type IEmissionsController struct {
+ IEmissionsControllerCaller // Read-only binding to the contract
+ IEmissionsControllerTransactor // Write-only binding to the contract
+ IEmissionsControllerFilterer // Log filterer for contract events
+}
+
+// IEmissionsControllerCaller is an auto generated read-only Go binding around an Ethereum contract.
+type IEmissionsControllerCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// IEmissionsControllerTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type IEmissionsControllerTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// IEmissionsControllerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type IEmissionsControllerFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// IEmissionsControllerSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type IEmissionsControllerSession struct {
+ Contract *IEmissionsController // 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
+}
+
+// IEmissionsControllerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type IEmissionsControllerCallerSession struct {
+ Contract *IEmissionsControllerCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// IEmissionsControllerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type IEmissionsControllerTransactorSession struct {
+ Contract *IEmissionsControllerTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// IEmissionsControllerRaw is an auto generated low-level Go binding around an Ethereum contract.
+type IEmissionsControllerRaw struct {
+ Contract *IEmissionsController // Generic contract binding to access the raw methods on
+}
+
+// IEmissionsControllerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type IEmissionsControllerCallerRaw struct {
+ Contract *IEmissionsControllerCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// IEmissionsControllerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type IEmissionsControllerTransactorRaw struct {
+ Contract *IEmissionsControllerTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewIEmissionsController creates a new instance of IEmissionsController, bound to a specific deployed contract.
+func NewIEmissionsController(address common.Address, backend bind.ContractBackend) (*IEmissionsController, error) {
+ contract, err := bindIEmissionsController(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &IEmissionsController{IEmissionsControllerCaller: IEmissionsControllerCaller{contract: contract}, IEmissionsControllerTransactor: IEmissionsControllerTransactor{contract: contract}, IEmissionsControllerFilterer: IEmissionsControllerFilterer{contract: contract}}, nil
+}
+
+// NewIEmissionsControllerCaller creates a new read-only instance of IEmissionsController, bound to a specific deployed contract.
+func NewIEmissionsControllerCaller(address common.Address, caller bind.ContractCaller) (*IEmissionsControllerCaller, error) {
+ contract, err := bindIEmissionsController(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &IEmissionsControllerCaller{contract: contract}, nil
+}
+
+// NewIEmissionsControllerTransactor creates a new write-only instance of IEmissionsController, bound to a specific deployed contract.
+func NewIEmissionsControllerTransactor(address common.Address, transactor bind.ContractTransactor) (*IEmissionsControllerTransactor, error) {
+ contract, err := bindIEmissionsController(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &IEmissionsControllerTransactor{contract: contract}, nil
+}
+
+// NewIEmissionsControllerFilterer creates a new log filterer instance of IEmissionsController, bound to a specific deployed contract.
+func NewIEmissionsControllerFilterer(address common.Address, filterer bind.ContractFilterer) (*IEmissionsControllerFilterer, error) {
+ contract, err := bindIEmissionsController(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &IEmissionsControllerFilterer{contract: contract}, nil
+}
+
+// bindIEmissionsController binds a generic wrapper to an already deployed contract.
+func bindIEmissionsController(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := IEmissionsControllerMetaData.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 (_IEmissionsController *IEmissionsControllerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _IEmissionsController.Contract.IEmissionsControllerCaller.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 (_IEmissionsController *IEmissionsControllerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.IEmissionsControllerTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_IEmissionsController *IEmissionsControllerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.IEmissionsControllerTransactor.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 (_IEmissionsController *IEmissionsControllerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _IEmissionsController.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 (_IEmissionsController *IEmissionsControllerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_IEmissionsController *IEmissionsControllerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.contract.Transact(opts, method, params...)
+}
+
+// ALLOCATIONMANAGER is a free data retrieval call binding the contract method 0x31232bc9.
+//
+// Solidity: function ALLOCATION_MANAGER() view returns(address)
+func (_IEmissionsController *IEmissionsControllerCaller) ALLOCATIONMANAGER(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "ALLOCATION_MANAGER")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// ALLOCATIONMANAGER is a free data retrieval call binding the contract method 0x31232bc9.
+//
+// Solidity: function ALLOCATION_MANAGER() view returns(address)
+func (_IEmissionsController *IEmissionsControllerSession) ALLOCATIONMANAGER() (common.Address, error) {
+ return _IEmissionsController.Contract.ALLOCATIONMANAGER(&_IEmissionsController.CallOpts)
+}
+
+// ALLOCATIONMANAGER is a free data retrieval call binding the contract method 0x31232bc9.
+//
+// Solidity: function ALLOCATION_MANAGER() view returns(address)
+func (_IEmissionsController *IEmissionsControllerCallerSession) ALLOCATIONMANAGER() (common.Address, error) {
+ return _IEmissionsController.Contract.ALLOCATIONMANAGER(&_IEmissionsController.CallOpts)
+}
+
+// BACKINGEIGEN is a free data retrieval call binding the contract method 0xd455724e.
+//
+// Solidity: function BACKING_EIGEN() view returns(address)
+func (_IEmissionsController *IEmissionsControllerCaller) BACKINGEIGEN(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "BACKING_EIGEN")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// BACKINGEIGEN is a free data retrieval call binding the contract method 0xd455724e.
+//
+// Solidity: function BACKING_EIGEN() view returns(address)
+func (_IEmissionsController *IEmissionsControllerSession) BACKINGEIGEN() (common.Address, error) {
+ return _IEmissionsController.Contract.BACKINGEIGEN(&_IEmissionsController.CallOpts)
+}
+
+// BACKINGEIGEN is a free data retrieval call binding the contract method 0xd455724e.
+//
+// Solidity: function BACKING_EIGEN() view returns(address)
+func (_IEmissionsController *IEmissionsControllerCallerSession) BACKINGEIGEN() (common.Address, error) {
+ return _IEmissionsController.Contract.BACKINGEIGEN(&_IEmissionsController.CallOpts)
+}
+
+// EIGEN is a free data retrieval call binding the contract method 0xfdc371ce.
+//
+// Solidity: function EIGEN() view returns(address)
+func (_IEmissionsController *IEmissionsControllerCaller) EIGEN(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "EIGEN")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// EIGEN is a free data retrieval call binding the contract method 0xfdc371ce.
+//
+// Solidity: function EIGEN() view returns(address)
+func (_IEmissionsController *IEmissionsControllerSession) EIGEN() (common.Address, error) {
+ return _IEmissionsController.Contract.EIGEN(&_IEmissionsController.CallOpts)
+}
+
+// EIGEN is a free data retrieval call binding the contract method 0xfdc371ce.
+//
+// Solidity: function EIGEN() view returns(address)
+func (_IEmissionsController *IEmissionsControllerCallerSession) EIGEN() (common.Address, error) {
+ return _IEmissionsController.Contract.EIGEN(&_IEmissionsController.CallOpts)
+}
+
+// EMISSIONSEPOCHLENGTH is a free data retrieval call binding the contract method 0xc2f208e4.
+//
+// Solidity: function EMISSIONS_EPOCH_LENGTH() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCaller) EMISSIONSEPOCHLENGTH(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "EMISSIONS_EPOCH_LENGTH")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// EMISSIONSEPOCHLENGTH is a free data retrieval call binding the contract method 0xc2f208e4.
+//
+// Solidity: function EMISSIONS_EPOCH_LENGTH() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerSession) EMISSIONSEPOCHLENGTH() (*big.Int, error) {
+ return _IEmissionsController.Contract.EMISSIONSEPOCHLENGTH(&_IEmissionsController.CallOpts)
+}
+
+// EMISSIONSEPOCHLENGTH is a free data retrieval call binding the contract method 0xc2f208e4.
+//
+// Solidity: function EMISSIONS_EPOCH_LENGTH() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCallerSession) EMISSIONSEPOCHLENGTH() (*big.Int, error) {
+ return _IEmissionsController.Contract.EMISSIONSEPOCHLENGTH(&_IEmissionsController.CallOpts)
+}
+
+// EMISSIONSINFLATIONRATE is a free data retrieval call binding the contract method 0x47a28ea2.
+//
+// Solidity: function EMISSIONS_INFLATION_RATE() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCaller) EMISSIONSINFLATIONRATE(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "EMISSIONS_INFLATION_RATE")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// EMISSIONSINFLATIONRATE is a free data retrieval call binding the contract method 0x47a28ea2.
+//
+// Solidity: function EMISSIONS_INFLATION_RATE() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerSession) EMISSIONSINFLATIONRATE() (*big.Int, error) {
+ return _IEmissionsController.Contract.EMISSIONSINFLATIONRATE(&_IEmissionsController.CallOpts)
+}
+
+// EMISSIONSINFLATIONRATE is a free data retrieval call binding the contract method 0x47a28ea2.
+//
+// Solidity: function EMISSIONS_INFLATION_RATE() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCallerSession) EMISSIONSINFLATIONRATE() (*big.Int, error) {
+ return _IEmissionsController.Contract.EMISSIONSINFLATIONRATE(&_IEmissionsController.CallOpts)
+}
+
+// EMISSIONSSTARTTIME is a free data retrieval call binding the contract method 0xc9d3eff9.
+//
+// Solidity: function EMISSIONS_START_TIME() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCaller) EMISSIONSSTARTTIME(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "EMISSIONS_START_TIME")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// EMISSIONSSTARTTIME is a free data retrieval call binding the contract method 0xc9d3eff9.
+//
+// Solidity: function EMISSIONS_START_TIME() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerSession) EMISSIONSSTARTTIME() (*big.Int, error) {
+ return _IEmissionsController.Contract.EMISSIONSSTARTTIME(&_IEmissionsController.CallOpts)
+}
+
+// EMISSIONSSTARTTIME is a free data retrieval call binding the contract method 0xc9d3eff9.
+//
+// Solidity: function EMISSIONS_START_TIME() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCallerSession) EMISSIONSSTARTTIME() (*big.Int, error) {
+ return _IEmissionsController.Contract.EMISSIONSSTARTTIME(&_IEmissionsController.CallOpts)
+}
+
+// MAXTOTALWEIGHT is a free data retrieval call binding the contract method 0x09a3bbe4.
+//
+// Solidity: function MAX_TOTAL_WEIGHT() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCaller) MAXTOTALWEIGHT(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "MAX_TOTAL_WEIGHT")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// MAXTOTALWEIGHT is a free data retrieval call binding the contract method 0x09a3bbe4.
+//
+// Solidity: function MAX_TOTAL_WEIGHT() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerSession) MAXTOTALWEIGHT() (*big.Int, error) {
+ return _IEmissionsController.Contract.MAXTOTALWEIGHT(&_IEmissionsController.CallOpts)
+}
+
+// MAXTOTALWEIGHT is a free data retrieval call binding the contract method 0x09a3bbe4.
+//
+// Solidity: function MAX_TOTAL_WEIGHT() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCallerSession) MAXTOTALWEIGHT() (*big.Int, error) {
+ return _IEmissionsController.Contract.MAXTOTALWEIGHT(&_IEmissionsController.CallOpts)
+}
+
+// REWARDSCOORDINATOR is a free data retrieval call binding the contract method 0x71e2c264.
+//
+// Solidity: function REWARDS_COORDINATOR() view returns(address)
+func (_IEmissionsController *IEmissionsControllerCaller) REWARDSCOORDINATOR(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "REWARDS_COORDINATOR")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// REWARDSCOORDINATOR is a free data retrieval call binding the contract method 0x71e2c264.
+//
+// Solidity: function REWARDS_COORDINATOR() view returns(address)
+func (_IEmissionsController *IEmissionsControllerSession) REWARDSCOORDINATOR() (common.Address, error) {
+ return _IEmissionsController.Contract.REWARDSCOORDINATOR(&_IEmissionsController.CallOpts)
+}
+
+// REWARDSCOORDINATOR is a free data retrieval call binding the contract method 0x71e2c264.
+//
+// Solidity: function REWARDS_COORDINATOR() view returns(address)
+func (_IEmissionsController *IEmissionsControllerCallerSession) REWARDSCOORDINATOR() (common.Address, error) {
+ return _IEmissionsController.Contract.REWARDSCOORDINATOR(&_IEmissionsController.CallOpts)
+}
+
+// GetCurrentEpoch is a free data retrieval call binding the contract method 0xb97dd9e2.
+//
+// Solidity: function getCurrentEpoch() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCaller) GetCurrentEpoch(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "getCurrentEpoch")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// GetCurrentEpoch is a free data retrieval call binding the contract method 0xb97dd9e2.
+//
+// Solidity: function getCurrentEpoch() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerSession) GetCurrentEpoch() (*big.Int, error) {
+ return _IEmissionsController.Contract.GetCurrentEpoch(&_IEmissionsController.CallOpts)
+}
+
+// GetCurrentEpoch is a free data retrieval call binding the contract method 0xb97dd9e2.
+//
+// Solidity: function getCurrentEpoch() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCallerSession) GetCurrentEpoch() (*big.Int, error) {
+ return _IEmissionsController.Contract.GetCurrentEpoch(&_IEmissionsController.CallOpts)
+}
+
+// GetDistribution is a free data retrieval call binding the contract method 0x3b345a87.
+//
+// Solidity: function getDistribution(uint256 distributionId) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]))
+func (_IEmissionsController *IEmissionsControllerCaller) GetDistribution(opts *bind.CallOpts, distributionId *big.Int) (IEmissionsControllerTypesDistribution, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "getDistribution", distributionId)
+
+ if err != nil {
+ return *new(IEmissionsControllerTypesDistribution), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(IEmissionsControllerTypesDistribution)).(*IEmissionsControllerTypesDistribution)
+
+ return out0, err
+
+}
+
+// GetDistribution is a free data retrieval call binding the contract method 0x3b345a87.
+//
+// Solidity: function getDistribution(uint256 distributionId) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]))
+func (_IEmissionsController *IEmissionsControllerSession) GetDistribution(distributionId *big.Int) (IEmissionsControllerTypesDistribution, error) {
+ return _IEmissionsController.Contract.GetDistribution(&_IEmissionsController.CallOpts, distributionId)
+}
+
+// GetDistribution is a free data retrieval call binding the contract method 0x3b345a87.
+//
+// Solidity: function getDistribution(uint256 distributionId) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]))
+func (_IEmissionsController *IEmissionsControllerCallerSession) GetDistribution(distributionId *big.Int) (IEmissionsControllerTypesDistribution, error) {
+ return _IEmissionsController.Contract.GetDistribution(&_IEmissionsController.CallOpts, distributionId)
+}
+
+// GetDistributions is a free data retrieval call binding the contract method 0x147a7a5b.
+//
+// Solidity: function getDistributions(uint256 start, uint256 length) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][])[])
+func (_IEmissionsController *IEmissionsControllerCaller) GetDistributions(opts *bind.CallOpts, start *big.Int, length *big.Int) ([]IEmissionsControllerTypesDistribution, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "getDistributions", start, length)
+
+ if err != nil {
+ return *new([]IEmissionsControllerTypesDistribution), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]IEmissionsControllerTypesDistribution)).(*[]IEmissionsControllerTypesDistribution)
+
+ return out0, err
+
+}
+
+// GetDistributions is a free data retrieval call binding the contract method 0x147a7a5b.
+//
+// Solidity: function getDistributions(uint256 start, uint256 length) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][])[])
+func (_IEmissionsController *IEmissionsControllerSession) GetDistributions(start *big.Int, length *big.Int) ([]IEmissionsControllerTypesDistribution, error) {
+ return _IEmissionsController.Contract.GetDistributions(&_IEmissionsController.CallOpts, start, length)
+}
+
+// GetDistributions is a free data retrieval call binding the contract method 0x147a7a5b.
+//
+// Solidity: function getDistributions(uint256 start, uint256 length) view returns((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][])[])
+func (_IEmissionsController *IEmissionsControllerCallerSession) GetDistributions(start *big.Int, length *big.Int) ([]IEmissionsControllerTypesDistribution, error) {
+ return _IEmissionsController.Contract.GetDistributions(&_IEmissionsController.CallOpts, start, length)
+}
+
+// GetTotalProcessableDistributions is a free data retrieval call binding the contract method 0xbe851337.
+//
+// Solidity: function getTotalProcessableDistributions() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCaller) GetTotalProcessableDistributions(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "getTotalProcessableDistributions")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// GetTotalProcessableDistributions is a free data retrieval call binding the contract method 0xbe851337.
+//
+// Solidity: function getTotalProcessableDistributions() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerSession) GetTotalProcessableDistributions() (*big.Int, error) {
+ return _IEmissionsController.Contract.GetTotalProcessableDistributions(&_IEmissionsController.CallOpts)
+}
+
+// GetTotalProcessableDistributions is a free data retrieval call binding the contract method 0xbe851337.
+//
+// Solidity: function getTotalProcessableDistributions() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCallerSession) GetTotalProcessableDistributions() (*big.Int, error) {
+ return _IEmissionsController.Contract.GetTotalProcessableDistributions(&_IEmissionsController.CallOpts)
+}
+
+// IncentiveCouncil is a free data retrieval call binding the contract method 0xc44cb727.
+//
+// Solidity: function incentiveCouncil() view returns(address)
+func (_IEmissionsController *IEmissionsControllerCaller) IncentiveCouncil(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "incentiveCouncil")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// IncentiveCouncil is a free data retrieval call binding the contract method 0xc44cb727.
+//
+// Solidity: function incentiveCouncil() view returns(address)
+func (_IEmissionsController *IEmissionsControllerSession) IncentiveCouncil() (common.Address, error) {
+ return _IEmissionsController.Contract.IncentiveCouncil(&_IEmissionsController.CallOpts)
+}
+
+// IncentiveCouncil is a free data retrieval call binding the contract method 0xc44cb727.
+//
+// Solidity: function incentiveCouncil() view returns(address)
+func (_IEmissionsController *IEmissionsControllerCallerSession) IncentiveCouncil() (common.Address, error) {
+ return _IEmissionsController.Contract.IncentiveCouncil(&_IEmissionsController.CallOpts)
+}
+
+// IsButtonPressable is a free data retrieval call binding the contract method 0xd8393150.
+//
+// Solidity: function isButtonPressable() view returns(bool)
+func (_IEmissionsController *IEmissionsControllerCaller) IsButtonPressable(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "isButtonPressable")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsButtonPressable is a free data retrieval call binding the contract method 0xd8393150.
+//
+// Solidity: function isButtonPressable() view returns(bool)
+func (_IEmissionsController *IEmissionsControllerSession) IsButtonPressable() (bool, error) {
+ return _IEmissionsController.Contract.IsButtonPressable(&_IEmissionsController.CallOpts)
+}
+
+// IsButtonPressable is a free data retrieval call binding the contract method 0xd8393150.
+//
+// Solidity: function isButtonPressable() view returns(bool)
+func (_IEmissionsController *IEmissionsControllerCallerSession) IsButtonPressable() (bool, error) {
+ return _IEmissionsController.Contract.IsButtonPressable(&_IEmissionsController.CallOpts)
+}
+
+// LastTimeButtonPressable is a free data retrieval call binding the contract method 0xd44b1c9e.
+//
+// Solidity: function lastTimeButtonPressable() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCaller) LastTimeButtonPressable(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "lastTimeButtonPressable")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// LastTimeButtonPressable is a free data retrieval call binding the contract method 0xd44b1c9e.
+//
+// Solidity: function lastTimeButtonPressable() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerSession) LastTimeButtonPressable() (*big.Int, error) {
+ return _IEmissionsController.Contract.LastTimeButtonPressable(&_IEmissionsController.CallOpts)
+}
+
+// LastTimeButtonPressable is a free data retrieval call binding the contract method 0xd44b1c9e.
+//
+// Solidity: function lastTimeButtonPressable() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCallerSession) LastTimeButtonPressable() (*big.Int, error) {
+ return _IEmissionsController.Contract.LastTimeButtonPressable(&_IEmissionsController.CallOpts)
+}
+
+// NextTimeButtonPressable is a free data retrieval call binding the contract method 0xf769479f.
+//
+// Solidity: function nextTimeButtonPressable() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCaller) NextTimeButtonPressable(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "nextTimeButtonPressable")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// NextTimeButtonPressable is a free data retrieval call binding the contract method 0xf769479f.
+//
+// Solidity: function nextTimeButtonPressable() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerSession) NextTimeButtonPressable() (*big.Int, error) {
+ return _IEmissionsController.Contract.NextTimeButtonPressable(&_IEmissionsController.CallOpts)
+}
+
+// NextTimeButtonPressable is a free data retrieval call binding the contract method 0xf769479f.
+//
+// Solidity: function nextTimeButtonPressable() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCallerSession) NextTimeButtonPressable() (*big.Int, error) {
+ return _IEmissionsController.Contract.NextTimeButtonPressable(&_IEmissionsController.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
+//
+// Solidity: function paused(uint8 index) view returns(bool)
+func (_IEmissionsController *IEmissionsControllerCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "paused", index)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
+//
+// Solidity: function paused(uint8 index) view returns(bool)
+func (_IEmissionsController *IEmissionsControllerSession) Paused(index uint8) (bool, error) {
+ return _IEmissionsController.Contract.Paused(&_IEmissionsController.CallOpts, index)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
+//
+// Solidity: function paused(uint8 index) view returns(bool)
+func (_IEmissionsController *IEmissionsControllerCallerSession) Paused(index uint8) (bool, error) {
+ return _IEmissionsController.Contract.Paused(&_IEmissionsController.CallOpts, index)
+}
+
+// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCaller) Paused0(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "paused0")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerSession) Paused0() (*big.Int, error) {
+ return _IEmissionsController.Contract.Paused0(&_IEmissionsController.CallOpts)
+}
+
+// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(uint256)
+func (_IEmissionsController *IEmissionsControllerCallerSession) Paused0() (*big.Int, error) {
+ return _IEmissionsController.Contract.Paused0(&_IEmissionsController.CallOpts)
+}
+
+// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
+//
+// Solidity: function pauserRegistry() view returns(address)
+func (_IEmissionsController *IEmissionsControllerCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "pauserRegistry")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
+//
+// Solidity: function pauserRegistry() view returns(address)
+func (_IEmissionsController *IEmissionsControllerSession) PauserRegistry() (common.Address, error) {
+ return _IEmissionsController.Contract.PauserRegistry(&_IEmissionsController.CallOpts)
+}
+
+// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
+//
+// Solidity: function pauserRegistry() view returns(address)
+func (_IEmissionsController *IEmissionsControllerCallerSession) PauserRegistry() (common.Address, error) {
+ return _IEmissionsController.Contract.PauserRegistry(&_IEmissionsController.CallOpts)
+}
+
+// TotalWeight is a free data retrieval call binding the contract method 0x96c82e57.
+//
+// Solidity: function totalWeight() view returns(uint16)
+func (_IEmissionsController *IEmissionsControllerCaller) TotalWeight(opts *bind.CallOpts) (uint16, error) {
+ var out []interface{}
+ err := _IEmissionsController.contract.Call(opts, &out, "totalWeight")
+
+ if err != nil {
+ return *new(uint16), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16)
+
+ return out0, err
+
+}
+
+// TotalWeight is a free data retrieval call binding the contract method 0x96c82e57.
+//
+// Solidity: function totalWeight() view returns(uint16)
+func (_IEmissionsController *IEmissionsControllerSession) TotalWeight() (uint16, error) {
+ return _IEmissionsController.Contract.TotalWeight(&_IEmissionsController.CallOpts)
+}
+
+// TotalWeight is a free data retrieval call binding the contract method 0x96c82e57.
+//
+// Solidity: function totalWeight() view returns(uint16)
+func (_IEmissionsController *IEmissionsControllerCallerSession) TotalWeight() (uint16, error) {
+ return _IEmissionsController.Contract.TotalWeight(&_IEmissionsController.CallOpts)
+}
+
+// AddDistribution is a paid mutator transaction binding the contract method 0xcd1e341b.
+//
+// Solidity: function addDistribution((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns(uint256 distributionId)
+func (_IEmissionsController *IEmissionsControllerTransactor) AddDistribution(opts *bind.TransactOpts, distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _IEmissionsController.contract.Transact(opts, "addDistribution", distribution)
+}
+
+// AddDistribution is a paid mutator transaction binding the contract method 0xcd1e341b.
+//
+// Solidity: function addDistribution((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns(uint256 distributionId)
+func (_IEmissionsController *IEmissionsControllerSession) AddDistribution(distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.AddDistribution(&_IEmissionsController.TransactOpts, distribution)
+}
+
+// AddDistribution is a paid mutator transaction binding the contract method 0xcd1e341b.
+//
+// Solidity: function addDistribution((uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns(uint256 distributionId)
+func (_IEmissionsController *IEmissionsControllerTransactorSession) AddDistribution(distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.AddDistribution(&_IEmissionsController.TransactOpts, distribution)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c.
+//
+// Solidity: function initialize(address initialOwner, address incentiveCouncil, uint256 initialPausedStatus) returns()
+func (_IEmissionsController *IEmissionsControllerTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, incentiveCouncil common.Address, initialPausedStatus *big.Int) (*types.Transaction, error) {
+ return _IEmissionsController.contract.Transact(opts, "initialize", initialOwner, incentiveCouncil, initialPausedStatus)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c.
+//
+// Solidity: function initialize(address initialOwner, address incentiveCouncil, uint256 initialPausedStatus) returns()
+func (_IEmissionsController *IEmissionsControllerSession) Initialize(initialOwner common.Address, incentiveCouncil common.Address, initialPausedStatus *big.Int) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.Initialize(&_IEmissionsController.TransactOpts, initialOwner, incentiveCouncil, initialPausedStatus)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c.
+//
+// Solidity: function initialize(address initialOwner, address incentiveCouncil, uint256 initialPausedStatus) returns()
+func (_IEmissionsController *IEmissionsControllerTransactorSession) Initialize(initialOwner common.Address, incentiveCouncil common.Address, initialPausedStatus *big.Int) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.Initialize(&_IEmissionsController.TransactOpts, initialOwner, incentiveCouncil, initialPausedStatus)
+}
+
+// Pause is a paid mutator transaction binding the contract method 0x136439dd.
+//
+// Solidity: function pause(uint256 newPausedStatus) returns()
+func (_IEmissionsController *IEmissionsControllerTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _IEmissionsController.contract.Transact(opts, "pause", newPausedStatus)
+}
+
+// Pause is a paid mutator transaction binding the contract method 0x136439dd.
+//
+// Solidity: function pause(uint256 newPausedStatus) returns()
+func (_IEmissionsController *IEmissionsControllerSession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.Pause(&_IEmissionsController.TransactOpts, newPausedStatus)
+}
+
+// Pause is a paid mutator transaction binding the contract method 0x136439dd.
+//
+// Solidity: function pause(uint256 newPausedStatus) returns()
+func (_IEmissionsController *IEmissionsControllerTransactorSession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.Pause(&_IEmissionsController.TransactOpts, newPausedStatus)
+}
+
+// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
+//
+// Solidity: function pauseAll() returns()
+func (_IEmissionsController *IEmissionsControllerTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _IEmissionsController.contract.Transact(opts, "pauseAll")
+}
+
+// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
+//
+// Solidity: function pauseAll() returns()
+func (_IEmissionsController *IEmissionsControllerSession) PauseAll() (*types.Transaction, error) {
+ return _IEmissionsController.Contract.PauseAll(&_IEmissionsController.TransactOpts)
+}
+
+// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
+//
+// Solidity: function pauseAll() returns()
+func (_IEmissionsController *IEmissionsControllerTransactorSession) PauseAll() (*types.Transaction, error) {
+ return _IEmissionsController.Contract.PauseAll(&_IEmissionsController.TransactOpts)
+}
+
+// PressButton is a paid mutator transaction binding the contract method 0x400efa85.
+//
+// Solidity: function pressButton(uint256 length) returns()
+func (_IEmissionsController *IEmissionsControllerTransactor) PressButton(opts *bind.TransactOpts, length *big.Int) (*types.Transaction, error) {
+ return _IEmissionsController.contract.Transact(opts, "pressButton", length)
+}
+
+// PressButton is a paid mutator transaction binding the contract method 0x400efa85.
+//
+// Solidity: function pressButton(uint256 length) returns()
+func (_IEmissionsController *IEmissionsControllerSession) PressButton(length *big.Int) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.PressButton(&_IEmissionsController.TransactOpts, length)
+}
+
+// PressButton is a paid mutator transaction binding the contract method 0x400efa85.
+//
+// Solidity: function pressButton(uint256 length) returns()
+func (_IEmissionsController *IEmissionsControllerTransactorSession) PressButton(length *big.Int) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.PressButton(&_IEmissionsController.TransactOpts, length)
+}
+
+// SetIncentiveCouncil is a paid mutator transaction binding the contract method 0xc695acdb.
+//
+// Solidity: function setIncentiveCouncil(address incentiveCouncil) returns()
+func (_IEmissionsController *IEmissionsControllerTransactor) SetIncentiveCouncil(opts *bind.TransactOpts, incentiveCouncil common.Address) (*types.Transaction, error) {
+ return _IEmissionsController.contract.Transact(opts, "setIncentiveCouncil", incentiveCouncil)
+}
+
+// SetIncentiveCouncil is a paid mutator transaction binding the contract method 0xc695acdb.
+//
+// Solidity: function setIncentiveCouncil(address incentiveCouncil) returns()
+func (_IEmissionsController *IEmissionsControllerSession) SetIncentiveCouncil(incentiveCouncil common.Address) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.SetIncentiveCouncil(&_IEmissionsController.TransactOpts, incentiveCouncil)
+}
+
+// SetIncentiveCouncil is a paid mutator transaction binding the contract method 0xc695acdb.
+//
+// Solidity: function setIncentiveCouncil(address incentiveCouncil) returns()
+func (_IEmissionsController *IEmissionsControllerTransactorSession) SetIncentiveCouncil(incentiveCouncil common.Address) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.SetIncentiveCouncil(&_IEmissionsController.TransactOpts, incentiveCouncil)
+}
+
+// Sweep is a paid mutator transaction binding the contract method 0x35faa416.
+//
+// Solidity: function sweep() returns()
+func (_IEmissionsController *IEmissionsControllerTransactor) Sweep(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _IEmissionsController.contract.Transact(opts, "sweep")
+}
+
+// Sweep is a paid mutator transaction binding the contract method 0x35faa416.
+//
+// Solidity: function sweep() returns()
+func (_IEmissionsController *IEmissionsControllerSession) Sweep() (*types.Transaction, error) {
+ return _IEmissionsController.Contract.Sweep(&_IEmissionsController.TransactOpts)
+}
+
+// Sweep is a paid mutator transaction binding the contract method 0x35faa416.
+//
+// Solidity: function sweep() returns()
+func (_IEmissionsController *IEmissionsControllerTransactorSession) Sweep() (*types.Transaction, error) {
+ return _IEmissionsController.Contract.Sweep(&_IEmissionsController.TransactOpts)
+}
+
+// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
+//
+// Solidity: function unpause(uint256 newPausedStatus) returns()
+func (_IEmissionsController *IEmissionsControllerTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _IEmissionsController.contract.Transact(opts, "unpause", newPausedStatus)
+}
+
+// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
+//
+// Solidity: function unpause(uint256 newPausedStatus) returns()
+func (_IEmissionsController *IEmissionsControllerSession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.Unpause(&_IEmissionsController.TransactOpts, newPausedStatus)
+}
+
+// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
+//
+// Solidity: function unpause(uint256 newPausedStatus) returns()
+func (_IEmissionsController *IEmissionsControllerTransactorSession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.Unpause(&_IEmissionsController.TransactOpts, newPausedStatus)
+}
+
+// UpdateDistribution is a paid mutator transaction binding the contract method 0x44a32028.
+//
+// Solidity: function updateDistribution(uint256 distributionId, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns()
+func (_IEmissionsController *IEmissionsControllerTransactor) UpdateDistribution(opts *bind.TransactOpts, distributionId *big.Int, distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _IEmissionsController.contract.Transact(opts, "updateDistribution", distributionId, distribution)
+}
+
+// UpdateDistribution is a paid mutator transaction binding the contract method 0x44a32028.
+//
+// Solidity: function updateDistribution(uint256 distributionId, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns()
+func (_IEmissionsController *IEmissionsControllerSession) UpdateDistribution(distributionId *big.Int, distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.UpdateDistribution(&_IEmissionsController.TransactOpts, distributionId, distribution)
+}
+
+// UpdateDistribution is a paid mutator transaction binding the contract method 0x44a32028.
+//
+// Solidity: function updateDistribution(uint256 distributionId, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution) returns()
+func (_IEmissionsController *IEmissionsControllerTransactorSession) UpdateDistribution(distributionId *big.Int, distribution IEmissionsControllerTypesDistribution) (*types.Transaction, error) {
+ return _IEmissionsController.Contract.UpdateDistribution(&_IEmissionsController.TransactOpts, distributionId, distribution)
+}
+
+// IEmissionsControllerDistributionAddedIterator is returned from FilterDistributionAdded and is used to iterate over the raw logs and unpacked data for DistributionAdded events raised by the IEmissionsController contract.
+type IEmissionsControllerDistributionAddedIterator struct {
+ Event *IEmissionsControllerDistributionAdded // 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 *IEmissionsControllerDistributionAddedIterator) 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(IEmissionsControllerDistributionAdded)
+ 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(IEmissionsControllerDistributionAdded)
+ 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 *IEmissionsControllerDistributionAddedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IEmissionsControllerDistributionAddedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IEmissionsControllerDistributionAdded represents a DistributionAdded event raised by the IEmissionsController contract.
+type IEmissionsControllerDistributionAdded struct {
+ DistributionId *big.Int
+ Epoch *big.Int
+ Distribution IEmissionsControllerTypesDistribution
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDistributionAdded is a free log retrieval operation binding the contract event 0x006f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef.
+//
+// Solidity: event DistributionAdded(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_IEmissionsController *IEmissionsControllerFilterer) FilterDistributionAdded(opts *bind.FilterOpts, distributionId []*big.Int, epoch []*big.Int) (*IEmissionsControllerDistributionAddedIterator, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _IEmissionsController.contract.FilterLogs(opts, "DistributionAdded", distributionIdRule, epochRule)
+ if err != nil {
+ return nil, err
+ }
+ return &IEmissionsControllerDistributionAddedIterator{contract: _IEmissionsController.contract, event: "DistributionAdded", logs: logs, sub: sub}, nil
+}
+
+// WatchDistributionAdded is a free log subscription operation binding the contract event 0x006f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef.
+//
+// Solidity: event DistributionAdded(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_IEmissionsController *IEmissionsControllerFilterer) WatchDistributionAdded(opts *bind.WatchOpts, sink chan<- *IEmissionsControllerDistributionAdded, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _IEmissionsController.contract.WatchLogs(opts, "DistributionAdded", distributionIdRule, epochRule)
+ 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(IEmissionsControllerDistributionAdded)
+ if err := _IEmissionsController.contract.UnpackLog(event, "DistributionAdded", 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
+}
+
+// ParseDistributionAdded is a log parse operation binding the contract event 0x006f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef.
+//
+// Solidity: event DistributionAdded(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_IEmissionsController *IEmissionsControllerFilterer) ParseDistributionAdded(log types.Log) (*IEmissionsControllerDistributionAdded, error) {
+ event := new(IEmissionsControllerDistributionAdded)
+ if err := _IEmissionsController.contract.UnpackLog(event, "DistributionAdded", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IEmissionsControllerDistributionProcessedIterator is returned from FilterDistributionProcessed and is used to iterate over the raw logs and unpacked data for DistributionProcessed events raised by the IEmissionsController contract.
+type IEmissionsControllerDistributionProcessedIterator struct {
+ Event *IEmissionsControllerDistributionProcessed // 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 *IEmissionsControllerDistributionProcessedIterator) 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(IEmissionsControllerDistributionProcessed)
+ 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(IEmissionsControllerDistributionProcessed)
+ 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 *IEmissionsControllerDistributionProcessedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IEmissionsControllerDistributionProcessedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IEmissionsControllerDistributionProcessed represents a DistributionProcessed event raised by the IEmissionsController contract.
+type IEmissionsControllerDistributionProcessed struct {
+ DistributionId *big.Int
+ Epoch *big.Int
+ Distribution IEmissionsControllerTypesDistribution
+ Success bool
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDistributionProcessed is a free log retrieval operation binding the contract event 0xba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b.
+//
+// Solidity: event DistributionProcessed(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution, bool success)
+func (_IEmissionsController *IEmissionsControllerFilterer) FilterDistributionProcessed(opts *bind.FilterOpts, distributionId []*big.Int, epoch []*big.Int) (*IEmissionsControllerDistributionProcessedIterator, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _IEmissionsController.contract.FilterLogs(opts, "DistributionProcessed", distributionIdRule, epochRule)
+ if err != nil {
+ return nil, err
+ }
+ return &IEmissionsControllerDistributionProcessedIterator{contract: _IEmissionsController.contract, event: "DistributionProcessed", logs: logs, sub: sub}, nil
+}
+
+// WatchDistributionProcessed is a free log subscription operation binding the contract event 0xba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b.
+//
+// Solidity: event DistributionProcessed(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution, bool success)
+func (_IEmissionsController *IEmissionsControllerFilterer) WatchDistributionProcessed(opts *bind.WatchOpts, sink chan<- *IEmissionsControllerDistributionProcessed, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _IEmissionsController.contract.WatchLogs(opts, "DistributionProcessed", distributionIdRule, epochRule)
+ 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(IEmissionsControllerDistributionProcessed)
+ if err := _IEmissionsController.contract.UnpackLog(event, "DistributionProcessed", 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
+}
+
+// ParseDistributionProcessed is a log parse operation binding the contract event 0xba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b.
+//
+// Solidity: event DistributionProcessed(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution, bool success)
+func (_IEmissionsController *IEmissionsControllerFilterer) ParseDistributionProcessed(log types.Log) (*IEmissionsControllerDistributionProcessed, error) {
+ event := new(IEmissionsControllerDistributionProcessed)
+ if err := _IEmissionsController.contract.UnpackLog(event, "DistributionProcessed", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IEmissionsControllerDistributionUpdatedIterator is returned from FilterDistributionUpdated and is used to iterate over the raw logs and unpacked data for DistributionUpdated events raised by the IEmissionsController contract.
+type IEmissionsControllerDistributionUpdatedIterator struct {
+ Event *IEmissionsControllerDistributionUpdated // 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 *IEmissionsControllerDistributionUpdatedIterator) 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(IEmissionsControllerDistributionUpdated)
+ 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(IEmissionsControllerDistributionUpdated)
+ 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 *IEmissionsControllerDistributionUpdatedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IEmissionsControllerDistributionUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IEmissionsControllerDistributionUpdated represents a DistributionUpdated event raised by the IEmissionsController contract.
+type IEmissionsControllerDistributionUpdated struct {
+ DistributionId *big.Int
+ Epoch *big.Int
+ Distribution IEmissionsControllerTypesDistribution
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDistributionUpdated is a free log retrieval operation binding the contract event 0x548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c.
+//
+// Solidity: event DistributionUpdated(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_IEmissionsController *IEmissionsControllerFilterer) FilterDistributionUpdated(opts *bind.FilterOpts, distributionId []*big.Int, epoch []*big.Int) (*IEmissionsControllerDistributionUpdatedIterator, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _IEmissionsController.contract.FilterLogs(opts, "DistributionUpdated", distributionIdRule, epochRule)
+ if err != nil {
+ return nil, err
+ }
+ return &IEmissionsControllerDistributionUpdatedIterator{contract: _IEmissionsController.contract, event: "DistributionUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchDistributionUpdated is a free log subscription operation binding the contract event 0x548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c.
+//
+// Solidity: event DistributionUpdated(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_IEmissionsController *IEmissionsControllerFilterer) WatchDistributionUpdated(opts *bind.WatchOpts, sink chan<- *IEmissionsControllerDistributionUpdated, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error) {
+
+ var distributionIdRule []interface{}
+ for _, distributionIdItem := range distributionId {
+ distributionIdRule = append(distributionIdRule, distributionIdItem)
+ }
+ var epochRule []interface{}
+ for _, epochItem := range epoch {
+ epochRule = append(epochRule, epochItem)
+ }
+
+ logs, sub, err := _IEmissionsController.contract.WatchLogs(opts, "DistributionUpdated", distributionIdRule, epochRule)
+ 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(IEmissionsControllerDistributionUpdated)
+ if err := _IEmissionsController.contract.UnpackLog(event, "DistributionUpdated", 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
+}
+
+// ParseDistributionUpdated is a log parse operation binding the contract event 0x548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c.
+//
+// Solidity: event DistributionUpdated(uint256 indexed distributionId, uint256 indexed epoch, (uint64,uint64,uint64,uint8,(address,uint32),(address,uint96)[][]) distribution)
+func (_IEmissionsController *IEmissionsControllerFilterer) ParseDistributionUpdated(log types.Log) (*IEmissionsControllerDistributionUpdated, error) {
+ event := new(IEmissionsControllerDistributionUpdated)
+ if err := _IEmissionsController.contract.UnpackLog(event, "DistributionUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IEmissionsControllerIncentiveCouncilUpdatedIterator is returned from FilterIncentiveCouncilUpdated and is used to iterate over the raw logs and unpacked data for IncentiveCouncilUpdated events raised by the IEmissionsController contract.
+type IEmissionsControllerIncentiveCouncilUpdatedIterator struct {
+ Event *IEmissionsControllerIncentiveCouncilUpdated // 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 *IEmissionsControllerIncentiveCouncilUpdatedIterator) 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(IEmissionsControllerIncentiveCouncilUpdated)
+ 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(IEmissionsControllerIncentiveCouncilUpdated)
+ 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 *IEmissionsControllerIncentiveCouncilUpdatedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IEmissionsControllerIncentiveCouncilUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IEmissionsControllerIncentiveCouncilUpdated represents a IncentiveCouncilUpdated event raised by the IEmissionsController contract.
+type IEmissionsControllerIncentiveCouncilUpdated struct {
+ IncentiveCouncil common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterIncentiveCouncilUpdated is a free log retrieval operation binding the contract event 0x8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216.
+//
+// Solidity: event IncentiveCouncilUpdated(address indexed incentiveCouncil)
+func (_IEmissionsController *IEmissionsControllerFilterer) FilterIncentiveCouncilUpdated(opts *bind.FilterOpts, incentiveCouncil []common.Address) (*IEmissionsControllerIncentiveCouncilUpdatedIterator, error) {
+
+ var incentiveCouncilRule []interface{}
+ for _, incentiveCouncilItem := range incentiveCouncil {
+ incentiveCouncilRule = append(incentiveCouncilRule, incentiveCouncilItem)
+ }
+
+ logs, sub, err := _IEmissionsController.contract.FilterLogs(opts, "IncentiveCouncilUpdated", incentiveCouncilRule)
+ if err != nil {
+ return nil, err
+ }
+ return &IEmissionsControllerIncentiveCouncilUpdatedIterator{contract: _IEmissionsController.contract, event: "IncentiveCouncilUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchIncentiveCouncilUpdated is a free log subscription operation binding the contract event 0x8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216.
+//
+// Solidity: event IncentiveCouncilUpdated(address indexed incentiveCouncil)
+func (_IEmissionsController *IEmissionsControllerFilterer) WatchIncentiveCouncilUpdated(opts *bind.WatchOpts, sink chan<- *IEmissionsControllerIncentiveCouncilUpdated, incentiveCouncil []common.Address) (event.Subscription, error) {
+
+ var incentiveCouncilRule []interface{}
+ for _, incentiveCouncilItem := range incentiveCouncil {
+ incentiveCouncilRule = append(incentiveCouncilRule, incentiveCouncilItem)
+ }
+
+ logs, sub, err := _IEmissionsController.contract.WatchLogs(opts, "IncentiveCouncilUpdated", incentiveCouncilRule)
+ 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(IEmissionsControllerIncentiveCouncilUpdated)
+ if err := _IEmissionsController.contract.UnpackLog(event, "IncentiveCouncilUpdated", 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
+}
+
+// ParseIncentiveCouncilUpdated is a log parse operation binding the contract event 0x8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216.
+//
+// Solidity: event IncentiveCouncilUpdated(address indexed incentiveCouncil)
+func (_IEmissionsController *IEmissionsControllerFilterer) ParseIncentiveCouncilUpdated(log types.Log) (*IEmissionsControllerIncentiveCouncilUpdated, error) {
+ event := new(IEmissionsControllerIncentiveCouncilUpdated)
+ if err := _IEmissionsController.contract.UnpackLog(event, "IncentiveCouncilUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IEmissionsControllerPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the IEmissionsController contract.
+type IEmissionsControllerPausedIterator struct {
+ Event *IEmissionsControllerPaused // 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 *IEmissionsControllerPausedIterator) 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(IEmissionsControllerPaused)
+ 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(IEmissionsControllerPaused)
+ 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 *IEmissionsControllerPausedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IEmissionsControllerPausedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IEmissionsControllerPaused represents a Paused event raised by the IEmissionsController contract.
+type IEmissionsControllerPaused struct {
+ Account common.Address
+ NewPausedStatus *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterPaused is a free log retrieval operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
+//
+// Solidity: event Paused(address indexed account, uint256 newPausedStatus)
+func (_IEmissionsController *IEmissionsControllerFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*IEmissionsControllerPausedIterator, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _IEmissionsController.contract.FilterLogs(opts, "Paused", accountRule)
+ if err != nil {
+ return nil, err
+ }
+ return &IEmissionsControllerPausedIterator{contract: _IEmissionsController.contract, event: "Paused", logs: logs, sub: sub}, nil
+}
+
+// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
+//
+// Solidity: event Paused(address indexed account, uint256 newPausedStatus)
+func (_IEmissionsController *IEmissionsControllerFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *IEmissionsControllerPaused, account []common.Address) (event.Subscription, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _IEmissionsController.contract.WatchLogs(opts, "Paused", accountRule)
+ 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(IEmissionsControllerPaused)
+ if err := _IEmissionsController.contract.UnpackLog(event, "Paused", 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
+}
+
+// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
+//
+// Solidity: event Paused(address indexed account, uint256 newPausedStatus)
+func (_IEmissionsController *IEmissionsControllerFilterer) ParsePaused(log types.Log) (*IEmissionsControllerPaused, error) {
+ event := new(IEmissionsControllerPaused)
+ if err := _IEmissionsController.contract.UnpackLog(event, "Paused", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IEmissionsControllerSweptIterator is returned from FilterSwept and is used to iterate over the raw logs and unpacked data for Swept events raised by the IEmissionsController contract.
+type IEmissionsControllerSweptIterator struct {
+ Event *IEmissionsControllerSwept // 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 *IEmissionsControllerSweptIterator) 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(IEmissionsControllerSwept)
+ 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(IEmissionsControllerSwept)
+ 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 *IEmissionsControllerSweptIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IEmissionsControllerSweptIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IEmissionsControllerSwept represents a Swept event raised by the IEmissionsController contract.
+type IEmissionsControllerSwept struct {
+ IncentiveCouncil common.Address
+ Amount *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterSwept is a free log retrieval operation binding the contract event 0xc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe35109696.
+//
+// Solidity: event Swept(address indexed incentiveCouncil, uint256 amount)
+func (_IEmissionsController *IEmissionsControllerFilterer) FilterSwept(opts *bind.FilterOpts, incentiveCouncil []common.Address) (*IEmissionsControllerSweptIterator, error) {
+
+ var incentiveCouncilRule []interface{}
+ for _, incentiveCouncilItem := range incentiveCouncil {
+ incentiveCouncilRule = append(incentiveCouncilRule, incentiveCouncilItem)
+ }
+
+ logs, sub, err := _IEmissionsController.contract.FilterLogs(opts, "Swept", incentiveCouncilRule)
+ if err != nil {
+ return nil, err
+ }
+ return &IEmissionsControllerSweptIterator{contract: _IEmissionsController.contract, event: "Swept", logs: logs, sub: sub}, nil
+}
+
+// WatchSwept is a free log subscription operation binding the contract event 0xc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe35109696.
+//
+// Solidity: event Swept(address indexed incentiveCouncil, uint256 amount)
+func (_IEmissionsController *IEmissionsControllerFilterer) WatchSwept(opts *bind.WatchOpts, sink chan<- *IEmissionsControllerSwept, incentiveCouncil []common.Address) (event.Subscription, error) {
+
+ var incentiveCouncilRule []interface{}
+ for _, incentiveCouncilItem := range incentiveCouncil {
+ incentiveCouncilRule = append(incentiveCouncilRule, incentiveCouncilItem)
+ }
+
+ logs, sub, err := _IEmissionsController.contract.WatchLogs(opts, "Swept", incentiveCouncilRule)
+ 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(IEmissionsControllerSwept)
+ if err := _IEmissionsController.contract.UnpackLog(event, "Swept", 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
+}
+
+// ParseSwept is a log parse operation binding the contract event 0xc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe35109696.
+//
+// Solidity: event Swept(address indexed incentiveCouncil, uint256 amount)
+func (_IEmissionsController *IEmissionsControllerFilterer) ParseSwept(log types.Log) (*IEmissionsControllerSwept, error) {
+ event := new(IEmissionsControllerSwept)
+ if err := _IEmissionsController.contract.UnpackLog(event, "Swept", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+// IEmissionsControllerUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the IEmissionsController contract.
+type IEmissionsControllerUnpausedIterator struct {
+ Event *IEmissionsControllerUnpaused // 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 *IEmissionsControllerUnpausedIterator) 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(IEmissionsControllerUnpaused)
+ 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(IEmissionsControllerUnpaused)
+ 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 *IEmissionsControllerUnpausedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IEmissionsControllerUnpausedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IEmissionsControllerUnpaused represents a Unpaused event raised by the IEmissionsController contract.
+type IEmissionsControllerUnpaused struct {
+ Account common.Address
+ NewPausedStatus *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterUnpaused is a free log retrieval operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
+//
+// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus)
+func (_IEmissionsController *IEmissionsControllerFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*IEmissionsControllerUnpausedIterator, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _IEmissionsController.contract.FilterLogs(opts, "Unpaused", accountRule)
+ if err != nil {
+ return nil, err
+ }
+ return &IEmissionsControllerUnpausedIterator{contract: _IEmissionsController.contract, event: "Unpaused", logs: logs, sub: sub}, nil
+}
+
+// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
+//
+// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus)
+func (_IEmissionsController *IEmissionsControllerFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *IEmissionsControllerUnpaused, account []common.Address) (event.Subscription, error) {
+
+ var accountRule []interface{}
+ for _, accountItem := range account {
+ accountRule = append(accountRule, accountItem)
+ }
+
+ logs, sub, err := _IEmissionsController.contract.WatchLogs(opts, "Unpaused", accountRule)
+ 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(IEmissionsControllerUnpaused)
+ if err := _IEmissionsController.contract.UnpackLog(event, "Unpaused", 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
+}
+
+// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
+//
+// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus)
+func (_IEmissionsController *IEmissionsControllerFilterer) ParseUnpaused(log types.Log) (*IEmissionsControllerUnpaused, error) {
+ event := new(IEmissionsControllerUnpaused)
+ if err := _IEmissionsController.contract.UnpackLog(event, "Unpaused", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
diff --git a/pkg/bindings/IRewardsCoordinator/binding.go b/pkg/bindings/IRewardsCoordinator/binding.go
index 6eddf037b6..679a1d88ca 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\":\"createTotalStakeRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"createUniqueStakeRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"event\",\"name\":\"TotalStakeRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rewardsSubmissionHash\",\"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\":\"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\":\"UniqueStakeRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rewardsSubmissionHash\",\"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\":\"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\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationIsZero\",\"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\":\"createEigenDARewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"createTotalStakeRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"createUniqueStakeRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\"},{\"name\":\"_feeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"setFeeRecipient\",\"inputs\":[{\"name\":\"_feeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"setOptInForProtocolFee\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"optInForProtocolFee\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"FeeRecipientSet\",\"inputs\":[{\"name\":\"oldFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"OptInForProtocolFeeSet\",\"inputs\":[{\"name\":\"submitter\",\"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\":\"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\":\"TotalStakeRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rewardsSubmissionHash\",\"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\":\"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\":\"UniqueStakeRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rewardsSubmissionHash\",\"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\":\"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\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationIsZero\",\"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.
@@ -951,6 +951,27 @@ func (_IRewardsCoordinator *IRewardsCoordinatorTransactorSession) CreateAVSRewar
return _IRewardsCoordinator.Contract.CreateAVSRewardsSubmission(&_IRewardsCoordinator.TransactOpts, rewardsSubmissions)
}
+// CreateEigenDARewardsSubmission is a paid mutator transaction binding the contract method 0x7282a352.
+//
+// Solidity: function createEigenDARewardsSubmission(address avs, ((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
+func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) CreateEigenDARewardsSubmission(opts *bind.TransactOpts, avs common.Address, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error) {
+ return _IRewardsCoordinator.contract.Transact(opts, "createEigenDARewardsSubmission", avs, rewardsSubmissions)
+}
+
+// CreateEigenDARewardsSubmission is a paid mutator transaction binding the contract method 0x7282a352.
+//
+// Solidity: function createEigenDARewardsSubmission(address avs, ((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
+func (_IRewardsCoordinator *IRewardsCoordinatorSession) CreateEigenDARewardsSubmission(avs common.Address, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error) {
+ return _IRewardsCoordinator.Contract.CreateEigenDARewardsSubmission(&_IRewardsCoordinator.TransactOpts, avs, rewardsSubmissions)
+}
+
+// CreateEigenDARewardsSubmission is a paid mutator transaction binding the contract method 0x7282a352.
+//
+// Solidity: function createEigenDARewardsSubmission(address avs, ((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
+func (_IRewardsCoordinator *IRewardsCoordinatorTransactorSession) CreateEigenDARewardsSubmission(avs common.Address, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error) {
+ return _IRewardsCoordinator.Contract.CreateEigenDARewardsSubmission(&_IRewardsCoordinator.TransactOpts, avs, rewardsSubmissions)
+}
+
// CreateOperatorDirectedAVSRewardsSubmission is a paid mutator transaction binding the contract method 0x9cb9a5fa.
//
// Solidity: function createOperatorDirectedAVSRewardsSubmission(address avs, ((address,uint96)[],address,(address,uint256)[],uint32,uint32,string)[] operatorDirectedRewardsSubmissions) returns()
@@ -1098,25 +1119,25 @@ func (_IRewardsCoordinator *IRewardsCoordinatorTransactorSession) DisableRoot(ro
return _IRewardsCoordinator.Contract.DisableRoot(&_IRewardsCoordinator.TransactOpts, rootIndex)
}
-// Initialize is a paid mutator transaction binding the contract method 0xf6efbb59.
+// Initialize is a paid mutator transaction binding the contract method 0xacad7299.
//
-// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips) returns()
-func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16) (*types.Transaction, error) {
- return _IRewardsCoordinator.contract.Transact(opts, "initialize", initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips)
+// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips, address _feeRecipient) returns()
+func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16, _feeRecipient common.Address) (*types.Transaction, error) {
+ return _IRewardsCoordinator.contract.Transact(opts, "initialize", initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips, _feeRecipient)
}
-// Initialize is a paid mutator transaction binding the contract method 0xf6efbb59.
+// Initialize is a paid mutator transaction binding the contract method 0xacad7299.
//
-// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips) returns()
-func (_IRewardsCoordinator *IRewardsCoordinatorSession) Initialize(initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16) (*types.Transaction, error) {
- return _IRewardsCoordinator.Contract.Initialize(&_IRewardsCoordinator.TransactOpts, initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips)
+// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips, address _feeRecipient) returns()
+func (_IRewardsCoordinator *IRewardsCoordinatorSession) Initialize(initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16, _feeRecipient common.Address) (*types.Transaction, error) {
+ return _IRewardsCoordinator.Contract.Initialize(&_IRewardsCoordinator.TransactOpts, initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips, _feeRecipient)
}
-// Initialize is a paid mutator transaction binding the contract method 0xf6efbb59.
+// Initialize is a paid mutator transaction binding the contract method 0xacad7299.
//
-// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips) returns()
-func (_IRewardsCoordinator *IRewardsCoordinatorTransactorSession) Initialize(initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16) (*types.Transaction, error) {
- return _IRewardsCoordinator.Contract.Initialize(&_IRewardsCoordinator.TransactOpts, initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips)
+// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips, address _feeRecipient) returns()
+func (_IRewardsCoordinator *IRewardsCoordinatorTransactorSession) Initialize(initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16, _feeRecipient common.Address) (*types.Transaction, error) {
+ return _IRewardsCoordinator.Contract.Initialize(&_IRewardsCoordinator.TransactOpts, initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips, _feeRecipient)
}
// ProcessClaim is a paid mutator transaction binding the contract method 0x3ccc861d.
@@ -1245,6 +1266,27 @@ func (_IRewardsCoordinator *IRewardsCoordinatorTransactorSession) SetDefaultOper
return _IRewardsCoordinator.Contract.SetDefaultOperatorSplit(&_IRewardsCoordinator.TransactOpts, split)
}
+// SetFeeRecipient is a paid mutator transaction binding the contract method 0xe74b981b.
+//
+// Solidity: function setFeeRecipient(address _feeRecipient) returns()
+func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) SetFeeRecipient(opts *bind.TransactOpts, _feeRecipient common.Address) (*types.Transaction, error) {
+ return _IRewardsCoordinator.contract.Transact(opts, "setFeeRecipient", _feeRecipient)
+}
+
+// SetFeeRecipient is a paid mutator transaction binding the contract method 0xe74b981b.
+//
+// Solidity: function setFeeRecipient(address _feeRecipient) returns()
+func (_IRewardsCoordinator *IRewardsCoordinatorSession) SetFeeRecipient(_feeRecipient common.Address) (*types.Transaction, error) {
+ return _IRewardsCoordinator.Contract.SetFeeRecipient(&_IRewardsCoordinator.TransactOpts, _feeRecipient)
+}
+
+// SetFeeRecipient is a paid mutator transaction binding the contract method 0xe74b981b.
+//
+// Solidity: function setFeeRecipient(address _feeRecipient) returns()
+func (_IRewardsCoordinator *IRewardsCoordinatorTransactorSession) SetFeeRecipient(_feeRecipient common.Address) (*types.Transaction, error) {
+ return _IRewardsCoordinator.Contract.SetFeeRecipient(&_IRewardsCoordinator.TransactOpts, _feeRecipient)
+}
+
// SetOperatorAVSSplit is a paid mutator transaction binding the contract method 0xdcbb03b3.
//
// Solidity: function setOperatorAVSSplit(address operator, address avs, uint16 split) returns()
@@ -1308,6 +1350,27 @@ func (_IRewardsCoordinator *IRewardsCoordinatorTransactorSession) SetOperatorSet
return _IRewardsCoordinator.Contract.SetOperatorSetSplit(&_IRewardsCoordinator.TransactOpts, operator, operatorSet, split)
}
+// SetOptInForProtocolFee is a paid mutator transaction binding the contract method 0x8d424f49.
+//
+// Solidity: function setOptInForProtocolFee(address submitter, bool optInForProtocolFee) returns()
+func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) SetOptInForProtocolFee(opts *bind.TransactOpts, submitter common.Address, optInForProtocolFee bool) (*types.Transaction, error) {
+ return _IRewardsCoordinator.contract.Transact(opts, "setOptInForProtocolFee", submitter, optInForProtocolFee)
+}
+
+// SetOptInForProtocolFee is a paid mutator transaction binding the contract method 0x8d424f49.
+//
+// Solidity: function setOptInForProtocolFee(address submitter, bool optInForProtocolFee) returns()
+func (_IRewardsCoordinator *IRewardsCoordinatorSession) SetOptInForProtocolFee(submitter common.Address, optInForProtocolFee bool) (*types.Transaction, error) {
+ return _IRewardsCoordinator.Contract.SetOptInForProtocolFee(&_IRewardsCoordinator.TransactOpts, submitter, optInForProtocolFee)
+}
+
+// SetOptInForProtocolFee is a paid mutator transaction binding the contract method 0x8d424f49.
+//
+// Solidity: function setOptInForProtocolFee(address submitter, bool optInForProtocolFee) returns()
+func (_IRewardsCoordinator *IRewardsCoordinatorTransactorSession) SetOptInForProtocolFee(submitter common.Address, optInForProtocolFee bool) (*types.Transaction, error) {
+ return _IRewardsCoordinator.Contract.SetOptInForProtocolFee(&_IRewardsCoordinator.TransactOpts, submitter, optInForProtocolFee)
+}
+
// SetRewardsForAllSubmitter is a paid mutator transaction binding the contract method 0x0eb38345.
//
// Solidity: function setRewardsForAllSubmitter(address _submitter, bool _newValue) returns()
@@ -2273,6 +2336,159 @@ func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseDistributionRootSu
return event, nil
}
+// IRewardsCoordinatorFeeRecipientSetIterator is returned from FilterFeeRecipientSet and is used to iterate over the raw logs and unpacked data for FeeRecipientSet events raised by the IRewardsCoordinator contract.
+type IRewardsCoordinatorFeeRecipientSetIterator struct {
+ Event *IRewardsCoordinatorFeeRecipientSet // 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 *IRewardsCoordinatorFeeRecipientSetIterator) 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(IRewardsCoordinatorFeeRecipientSet)
+ 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(IRewardsCoordinatorFeeRecipientSet)
+ 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 *IRewardsCoordinatorFeeRecipientSetIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IRewardsCoordinatorFeeRecipientSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IRewardsCoordinatorFeeRecipientSet represents a FeeRecipientSet event raised by the IRewardsCoordinator contract.
+type IRewardsCoordinatorFeeRecipientSet struct {
+ OldFeeRecipient common.Address
+ NewFeeRecipient common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterFeeRecipientSet is a free log retrieval operation binding the contract event 0x15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721.
+//
+// Solidity: event FeeRecipientSet(address indexed oldFeeRecipient, address indexed newFeeRecipient)
+func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterFeeRecipientSet(opts *bind.FilterOpts, oldFeeRecipient []common.Address, newFeeRecipient []common.Address) (*IRewardsCoordinatorFeeRecipientSetIterator, error) {
+
+ var oldFeeRecipientRule []interface{}
+ for _, oldFeeRecipientItem := range oldFeeRecipient {
+ oldFeeRecipientRule = append(oldFeeRecipientRule, oldFeeRecipientItem)
+ }
+ var newFeeRecipientRule []interface{}
+ for _, newFeeRecipientItem := range newFeeRecipient {
+ newFeeRecipientRule = append(newFeeRecipientRule, newFeeRecipientItem)
+ }
+
+ logs, sub, err := _IRewardsCoordinator.contract.FilterLogs(opts, "FeeRecipientSet", oldFeeRecipientRule, newFeeRecipientRule)
+ if err != nil {
+ return nil, err
+ }
+ return &IRewardsCoordinatorFeeRecipientSetIterator{contract: _IRewardsCoordinator.contract, event: "FeeRecipientSet", logs: logs, sub: sub}, nil
+}
+
+// WatchFeeRecipientSet is a free log subscription operation binding the contract event 0x15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721.
+//
+// Solidity: event FeeRecipientSet(address indexed oldFeeRecipient, address indexed newFeeRecipient)
+func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchFeeRecipientSet(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorFeeRecipientSet, oldFeeRecipient []common.Address, newFeeRecipient []common.Address) (event.Subscription, error) {
+
+ var oldFeeRecipientRule []interface{}
+ for _, oldFeeRecipientItem := range oldFeeRecipient {
+ oldFeeRecipientRule = append(oldFeeRecipientRule, oldFeeRecipientItem)
+ }
+ var newFeeRecipientRule []interface{}
+ for _, newFeeRecipientItem := range newFeeRecipient {
+ newFeeRecipientRule = append(newFeeRecipientRule, newFeeRecipientItem)
+ }
+
+ logs, sub, err := _IRewardsCoordinator.contract.WatchLogs(opts, "FeeRecipientSet", oldFeeRecipientRule, newFeeRecipientRule)
+ 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(IRewardsCoordinatorFeeRecipientSet)
+ if err := _IRewardsCoordinator.contract.UnpackLog(event, "FeeRecipientSet", 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
+}
+
+// ParseFeeRecipientSet is a log parse operation binding the contract event 0x15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721.
+//
+// Solidity: event FeeRecipientSet(address indexed oldFeeRecipient, address indexed newFeeRecipient)
+func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseFeeRecipientSet(log types.Log) (*IRewardsCoordinatorFeeRecipientSet, error) {
+ event := new(IRewardsCoordinatorFeeRecipientSet)
+ if err := _IRewardsCoordinator.contract.UnpackLog(event, "FeeRecipientSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
// IRewardsCoordinatorOperatorAVSSplitBipsSetIterator is returned from FilterOperatorAVSSplitBipsSet and is used to iterate over the raw logs and unpacked data for OperatorAVSSplitBipsSet events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorOperatorAVSSplitBipsSetIterator struct {
Event *IRewardsCoordinatorOperatorAVSSplitBipsSet // Event containing the contract specifics and raw log
@@ -3071,6 +3287,168 @@ func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseOperatorSetSplitBi
return event, nil
}
+// IRewardsCoordinatorOptInForProtocolFeeSetIterator is returned from FilterOptInForProtocolFeeSet and is used to iterate over the raw logs and unpacked data for OptInForProtocolFeeSet events raised by the IRewardsCoordinator contract.
+type IRewardsCoordinatorOptInForProtocolFeeSetIterator struct {
+ Event *IRewardsCoordinatorOptInForProtocolFeeSet // 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 *IRewardsCoordinatorOptInForProtocolFeeSetIterator) 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(IRewardsCoordinatorOptInForProtocolFeeSet)
+ 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(IRewardsCoordinatorOptInForProtocolFeeSet)
+ 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 *IRewardsCoordinatorOptInForProtocolFeeSetIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *IRewardsCoordinatorOptInForProtocolFeeSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// IRewardsCoordinatorOptInForProtocolFeeSet represents a OptInForProtocolFeeSet event raised by the IRewardsCoordinator contract.
+type IRewardsCoordinatorOptInForProtocolFeeSet struct {
+ Submitter common.Address
+ OldValue bool
+ NewValue bool
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterOptInForProtocolFeeSet is a free log retrieval operation binding the contract event 0xbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd2.
+//
+// Solidity: event OptInForProtocolFeeSet(address indexed submitter, bool indexed oldValue, bool indexed newValue)
+func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterOptInForProtocolFeeSet(opts *bind.FilterOpts, submitter []common.Address, oldValue []bool, newValue []bool) (*IRewardsCoordinatorOptInForProtocolFeeSetIterator, error) {
+
+ var submitterRule []interface{}
+ for _, submitterItem := range submitter {
+ submitterRule = append(submitterRule, submitterItem)
+ }
+ var oldValueRule []interface{}
+ for _, oldValueItem := range oldValue {
+ oldValueRule = append(oldValueRule, oldValueItem)
+ }
+ var newValueRule []interface{}
+ for _, newValueItem := range newValue {
+ newValueRule = append(newValueRule, newValueItem)
+ }
+
+ logs, sub, err := _IRewardsCoordinator.contract.FilterLogs(opts, "OptInForProtocolFeeSet", submitterRule, oldValueRule, newValueRule)
+ if err != nil {
+ return nil, err
+ }
+ return &IRewardsCoordinatorOptInForProtocolFeeSetIterator{contract: _IRewardsCoordinator.contract, event: "OptInForProtocolFeeSet", logs: logs, sub: sub}, nil
+}
+
+// WatchOptInForProtocolFeeSet is a free log subscription operation binding the contract event 0xbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd2.
+//
+// Solidity: event OptInForProtocolFeeSet(address indexed submitter, bool indexed oldValue, bool indexed newValue)
+func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchOptInForProtocolFeeSet(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorOptInForProtocolFeeSet, submitter []common.Address, oldValue []bool, newValue []bool) (event.Subscription, error) {
+
+ var submitterRule []interface{}
+ for _, submitterItem := range submitter {
+ submitterRule = append(submitterRule, submitterItem)
+ }
+ var oldValueRule []interface{}
+ for _, oldValueItem := range oldValue {
+ oldValueRule = append(oldValueRule, oldValueItem)
+ }
+ var newValueRule []interface{}
+ for _, newValueItem := range newValue {
+ newValueRule = append(newValueRule, newValueItem)
+ }
+
+ logs, sub, err := _IRewardsCoordinator.contract.WatchLogs(opts, "OptInForProtocolFeeSet", submitterRule, oldValueRule, newValueRule)
+ 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(IRewardsCoordinatorOptInForProtocolFeeSet)
+ if err := _IRewardsCoordinator.contract.UnpackLog(event, "OptInForProtocolFeeSet", 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
+}
+
+// ParseOptInForProtocolFeeSet is a log parse operation binding the contract event 0xbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd2.
+//
+// Solidity: event OptInForProtocolFeeSet(address indexed submitter, bool indexed oldValue, bool indexed newValue)
+func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseOptInForProtocolFeeSet(log types.Log) (*IRewardsCoordinatorOptInForProtocolFeeSet, error) {
+ event := new(IRewardsCoordinatorOptInForProtocolFeeSet)
+ if err := _IRewardsCoordinator.contract.UnpackLog(event, "OptInForProtocolFeeSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
// IRewardsCoordinatorRewardsClaimedIterator is returned from FilterRewardsClaimed and is used to iterate over the raw logs and unpacked data for RewardsClaimed events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorRewardsClaimedIterator struct {
Event *IRewardsCoordinatorRewardsClaimed // Event containing the contract specifics and raw log
diff --git a/pkg/bindings/IStrategy/binding.go b/pkg/bindings/IStrategy/binding.go
index a4c7ac4cb1..b9e9e9727a 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\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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\":\"beforeAddShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beforeRemoveShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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,48 @@ func (_IStrategy *IStrategyCallerSession) UserUnderlyingView(user common.Address
return _IStrategy.Contract.UserUnderlyingView(&_IStrategy.CallOpts, user)
}
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address staker, uint256 shares) returns()
+func (_IStrategy *IStrategyTransactor) BeforeAddShares(opts *bind.TransactOpts, staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IStrategy.contract.Transact(opts, "beforeAddShares", staker, shares)
+}
+
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address staker, uint256 shares) returns()
+func (_IStrategy *IStrategySession) BeforeAddShares(staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IStrategy.Contract.BeforeAddShares(&_IStrategy.TransactOpts, staker, shares)
+}
+
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address staker, uint256 shares) returns()
+func (_IStrategy *IStrategyTransactorSession) BeforeAddShares(staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IStrategy.Contract.BeforeAddShares(&_IStrategy.TransactOpts, staker, shares)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address staker, uint256 shares) returns()
+func (_IStrategy *IStrategyTransactor) BeforeRemoveShares(opts *bind.TransactOpts, staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IStrategy.contract.Transact(opts, "beforeRemoveShares", staker, shares)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address staker, uint256 shares) returns()
+func (_IStrategy *IStrategySession) BeforeRemoveShares(staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IStrategy.Contract.BeforeRemoveShares(&_IStrategy.TransactOpts, staker, shares)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address staker, uint256 shares) returns()
+func (_IStrategy *IStrategyTransactorSession) BeforeRemoveShares(staker common.Address, shares *big.Int) (*types.Transaction, error) {
+ return _IStrategy.Contract.BeforeRemoveShares(&_IStrategy.TransactOpts, staker, shares)
+}
+
// 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..6bae4f1834 100644
--- a/pkg/bindings/IStrategyFactory/binding.go
+++ b/pkg/bindings/IStrategyFactory/binding.go
@@ -29,9 +29,30 @@ var (
_ = abi.ConvertType
)
+// IDurationVaultStrategyTypesVaultConfig is an auto generated low-level Go binding around an user-defined struct.
+type IDurationVaultStrategyTypesVaultConfig struct {
+ UnderlyingToken common.Address
+ VaultAdmin common.Address
+ Arbitrator common.Address
+ Duration uint32
+ MaxPerDeposit *big.Int
+ StakeCap *big.Int
+ MetadataURI string
+ OperatorSet OperatorSet
+ OperatorSetRegistrationData []byte
+ DelegationApprover common.Address
+ OperatorMetadataURI string
+}
+
+// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
+type OperatorSet struct {
+ Avs common.Address
+ Id uint32
+}
+
// 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\":\"deployDurationVaultStrategy\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structIDurationVaultStrategyTypes.VaultConfig\",\"components\":[{\"name\":\"underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"vaultAdmin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"arbitrator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stakeCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorSetRegistrationData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorMetadataURI\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"newVault\",\"type\":\"address\",\"internalType\":\"contractIDurationVaultStrategy\"}],\"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\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"durationVaultBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDurationVaults\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIDurationVaultStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isBlacklisted\",\"inputs\":[{\"name\":\"token\",\"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\":\"DurationVaultDeployed\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"contractIDurationVaultStrategy\"},{\"name\":\"underlyingToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"contractIERC20\"},{\"name\":\"vaultAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"duration\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"maxPerDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"stakeCap\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"operatorSetAVS\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"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.
@@ -211,6 +232,99 @@ func (_IStrategyFactory *IStrategyFactoryCallerSession) DeployedStrategies(token
return _IStrategyFactory.Contract.DeployedStrategies(&_IStrategyFactory.CallOpts, token)
}
+// DurationVaultBeacon is a free data retrieval call binding the contract method 0x9e4f2dcd.
+//
+// Solidity: function durationVaultBeacon() view returns(address)
+func (_IStrategyFactory *IStrategyFactoryCaller) DurationVaultBeacon(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _IStrategyFactory.contract.Call(opts, &out, "durationVaultBeacon")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// DurationVaultBeacon is a free data retrieval call binding the contract method 0x9e4f2dcd.
+//
+// Solidity: function durationVaultBeacon() view returns(address)
+func (_IStrategyFactory *IStrategyFactorySession) DurationVaultBeacon() (common.Address, error) {
+ return _IStrategyFactory.Contract.DurationVaultBeacon(&_IStrategyFactory.CallOpts)
+}
+
+// DurationVaultBeacon is a free data retrieval call binding the contract method 0x9e4f2dcd.
+//
+// Solidity: function durationVaultBeacon() view returns(address)
+func (_IStrategyFactory *IStrategyFactoryCallerSession) DurationVaultBeacon() (common.Address, error) {
+ return _IStrategyFactory.Contract.DurationVaultBeacon(&_IStrategyFactory.CallOpts)
+}
+
+// GetDurationVaults is a free data retrieval call binding the contract method 0xa5dae840.
+//
+// Solidity: function getDurationVaults(address token) view returns(address[])
+func (_IStrategyFactory *IStrategyFactoryCaller) GetDurationVaults(opts *bind.CallOpts, token common.Address) ([]common.Address, error) {
+ var out []interface{}
+ err := _IStrategyFactory.contract.Call(opts, &out, "getDurationVaults", token)
+
+ if err != nil {
+ return *new([]common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)
+
+ return out0, err
+
+}
+
+// GetDurationVaults is a free data retrieval call binding the contract method 0xa5dae840.
+//
+// Solidity: function getDurationVaults(address token) view returns(address[])
+func (_IStrategyFactory *IStrategyFactorySession) GetDurationVaults(token common.Address) ([]common.Address, error) {
+ return _IStrategyFactory.Contract.GetDurationVaults(&_IStrategyFactory.CallOpts, token)
+}
+
+// GetDurationVaults is a free data retrieval call binding the contract method 0xa5dae840.
+//
+// Solidity: function getDurationVaults(address token) view returns(address[])
+func (_IStrategyFactory *IStrategyFactoryCallerSession) GetDurationVaults(token common.Address) ([]common.Address, error) {
+ return _IStrategyFactory.Contract.GetDurationVaults(&_IStrategyFactory.CallOpts, token)
+}
+
+// IsBlacklisted is a free data retrieval call binding the contract method 0xfe575a87.
+//
+// Solidity: function isBlacklisted(address token) view returns(bool)
+func (_IStrategyFactory *IStrategyFactoryCaller) IsBlacklisted(opts *bind.CallOpts, token common.Address) (bool, error) {
+ var out []interface{}
+ err := _IStrategyFactory.contract.Call(opts, &out, "isBlacklisted", token)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsBlacklisted is a free data retrieval call binding the contract method 0xfe575a87.
+//
+// Solidity: function isBlacklisted(address token) view returns(bool)
+func (_IStrategyFactory *IStrategyFactorySession) IsBlacklisted(token common.Address) (bool, error) {
+ return _IStrategyFactory.Contract.IsBlacklisted(&_IStrategyFactory.CallOpts, token)
+}
+
+// IsBlacklisted is a free data retrieval call binding the contract method 0xfe575a87.
+//
+// Solidity: function isBlacklisted(address token) view returns(bool)
+func (_IStrategyFactory *IStrategyFactoryCallerSession) IsBlacklisted(token common.Address) (bool, error) {
+ return _IStrategyFactory.Contract.IsBlacklisted(&_IStrategyFactory.CallOpts, token)
+}
+
// StrategyBeacon is a free data retrieval call binding the contract method 0xf0062d9a.
//
// Solidity: function strategyBeacon() view returns(address)
@@ -242,6 +356,27 @@ func (_IStrategyFactory *IStrategyFactoryCallerSession) StrategyBeacon() (common
return _IStrategyFactory.Contract.StrategyBeacon(&_IStrategyFactory.CallOpts)
}
+// DeployDurationVaultStrategy is a paid mutator transaction binding the contract method 0xfb515303.
+//
+// Solidity: function deployDurationVaultStrategy((address,address,address,uint32,uint256,uint256,string,(address,uint32),bytes,address,string) config) returns(address newVault)
+func (_IStrategyFactory *IStrategyFactoryTransactor) DeployDurationVaultStrategy(opts *bind.TransactOpts, config IDurationVaultStrategyTypesVaultConfig) (*types.Transaction, error) {
+ return _IStrategyFactory.contract.Transact(opts, "deployDurationVaultStrategy", config)
+}
+
+// DeployDurationVaultStrategy is a paid mutator transaction binding the contract method 0xfb515303.
+//
+// Solidity: function deployDurationVaultStrategy((address,address,address,uint32,uint256,uint256,string,(address,uint32),bytes,address,string) config) returns(address newVault)
+func (_IStrategyFactory *IStrategyFactorySession) DeployDurationVaultStrategy(config IDurationVaultStrategyTypesVaultConfig) (*types.Transaction, error) {
+ return _IStrategyFactory.Contract.DeployDurationVaultStrategy(&_IStrategyFactory.TransactOpts, config)
+}
+
+// DeployDurationVaultStrategy is a paid mutator transaction binding the contract method 0xfb515303.
+//
+// Solidity: function deployDurationVaultStrategy((address,address,address,uint32,uint256,uint256,string,(address,uint32),bytes,address,string) config) returns(address newVault)
+func (_IStrategyFactory *IStrategyFactoryTransactorSession) DeployDurationVaultStrategy(config IDurationVaultStrategyTypesVaultConfig) (*types.Transaction, error) {
+ return _IStrategyFactory.Contract.DeployDurationVaultStrategy(&_IStrategyFactory.TransactOpts, config)
+}
+
// DeployNewStrategy is a paid mutator transaction binding the contract method 0x6b9b6229.
//
// Solidity: function deployNewStrategy(address token) returns(address newStrategy)
@@ -305,9 +440,9 @@ func (_IStrategyFactory *IStrategyFactoryTransactorSession) WhitelistStrategies(
return _IStrategyFactory.Contract.WhitelistStrategies(&_IStrategyFactory.TransactOpts, strategiesToWhitelist)
}
-// IStrategyFactoryStrategyBeaconModifiedIterator is returned from FilterStrategyBeaconModified and is used to iterate over the raw logs and unpacked data for StrategyBeaconModified events raised by the IStrategyFactory contract.
-type IStrategyFactoryStrategyBeaconModifiedIterator struct {
- Event *IStrategyFactoryStrategyBeaconModified // Event containing the contract specifics and raw log
+// IStrategyFactoryDurationVaultDeployedIterator is returned from FilterDurationVaultDeployed and is used to iterate over the raw logs and unpacked data for DurationVaultDeployed events raised by the IStrategyFactory contract.
+type IStrategyFactoryDurationVaultDeployedIterator struct {
+ Event *IStrategyFactoryDurationVaultDeployed // 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
@@ -321,7 +456,7 @@ type IStrategyFactoryStrategyBeaconModifiedIterator struct {
// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
-func (it *IStrategyFactoryStrategyBeaconModifiedIterator) Next() bool {
+func (it *IStrategyFactoryDurationVaultDeployedIterator) Next() bool {
// If the iterator failed, stop iterating
if it.fail != nil {
return false
@@ -330,7 +465,7 @@ func (it *IStrategyFactoryStrategyBeaconModifiedIterator) Next() bool {
if it.done {
select {
case log := <-it.logs:
- it.Event = new(IStrategyFactoryStrategyBeaconModified)
+ it.Event = new(IStrategyFactoryDurationVaultDeployed)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
@@ -345,7 +480,7 @@ func (it *IStrategyFactoryStrategyBeaconModifiedIterator) Next() bool {
// Iterator still in progress, wait for either a data or an error event
select {
case log := <-it.logs:
- it.Event = new(IStrategyFactoryStrategyBeaconModified)
+ it.Event = new(IStrategyFactoryDurationVaultDeployed)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
@@ -361,42 +496,75 @@ func (it *IStrategyFactoryStrategyBeaconModifiedIterator) Next() bool {
}
// Error returns any retrieval or parsing error occurred during filtering.
-func (it *IStrategyFactoryStrategyBeaconModifiedIterator) Error() error {
+func (it *IStrategyFactoryDurationVaultDeployedIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
-func (it *IStrategyFactoryStrategyBeaconModifiedIterator) Close() error {
+func (it *IStrategyFactoryDurationVaultDeployedIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
-// IStrategyFactoryStrategyBeaconModified represents a StrategyBeaconModified event raised by the IStrategyFactory contract.
-type IStrategyFactoryStrategyBeaconModified struct {
- PreviousBeacon common.Address
- NewBeacon common.Address
- Raw types.Log // Blockchain specific contextual infos
+// IStrategyFactoryDurationVaultDeployed represents a DurationVaultDeployed event raised by the IStrategyFactory contract.
+type IStrategyFactoryDurationVaultDeployed struct {
+ Vault common.Address
+ UnderlyingToken common.Address
+ VaultAdmin common.Address
+ Duration uint32
+ MaxPerDeposit *big.Int
+ StakeCap *big.Int
+ MetadataURI string
+ OperatorSetAVS common.Address
+ OperatorSetId uint32
+ Raw types.Log // Blockchain specific contextual infos
}
-// FilterStrategyBeaconModified is a free log retrieval operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
+// FilterDurationVaultDeployed is a free log retrieval operation binding the contract event 0x6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f81879345568504.
//
-// Solidity: event StrategyBeaconModified(address previousBeacon, address newBeacon)
-func (_IStrategyFactory *IStrategyFactoryFilterer) FilterStrategyBeaconModified(opts *bind.FilterOpts) (*IStrategyFactoryStrategyBeaconModifiedIterator, error) {
+// Solidity: event DurationVaultDeployed(address indexed vault, address indexed underlyingToken, address indexed vaultAdmin, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI, address operatorSetAVS, uint32 operatorSetId)
+func (_IStrategyFactory *IStrategyFactoryFilterer) FilterDurationVaultDeployed(opts *bind.FilterOpts, vault []common.Address, underlyingToken []common.Address, vaultAdmin []common.Address) (*IStrategyFactoryDurationVaultDeployedIterator, error) {
+
+ var vaultRule []interface{}
+ for _, vaultItem := range vault {
+ vaultRule = append(vaultRule, vaultItem)
+ }
+ var underlyingTokenRule []interface{}
+ for _, underlyingTokenItem := range underlyingToken {
+ underlyingTokenRule = append(underlyingTokenRule, underlyingTokenItem)
+ }
+ var vaultAdminRule []interface{}
+ for _, vaultAdminItem := range vaultAdmin {
+ vaultAdminRule = append(vaultAdminRule, vaultAdminItem)
+ }
- logs, sub, err := _IStrategyFactory.contract.FilterLogs(opts, "StrategyBeaconModified")
+ logs, sub, err := _IStrategyFactory.contract.FilterLogs(opts, "DurationVaultDeployed", vaultRule, underlyingTokenRule, vaultAdminRule)
if err != nil {
return nil, err
}
- return &IStrategyFactoryStrategyBeaconModifiedIterator{contract: _IStrategyFactory.contract, event: "StrategyBeaconModified", logs: logs, sub: sub}, nil
+ return &IStrategyFactoryDurationVaultDeployedIterator{contract: _IStrategyFactory.contract, event: "DurationVaultDeployed", logs: logs, sub: sub}, nil
}
-// WatchStrategyBeaconModified is a free log subscription operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
+// WatchDurationVaultDeployed is a free log subscription operation binding the contract event 0x6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f81879345568504.
//
-// Solidity: event StrategyBeaconModified(address previousBeacon, address newBeacon)
-func (_IStrategyFactory *IStrategyFactoryFilterer) WatchStrategyBeaconModified(opts *bind.WatchOpts, sink chan<- *IStrategyFactoryStrategyBeaconModified) (event.Subscription, error) {
+// Solidity: event DurationVaultDeployed(address indexed vault, address indexed underlyingToken, address indexed vaultAdmin, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI, address operatorSetAVS, uint32 operatorSetId)
+func (_IStrategyFactory *IStrategyFactoryFilterer) WatchDurationVaultDeployed(opts *bind.WatchOpts, sink chan<- *IStrategyFactoryDurationVaultDeployed, vault []common.Address, underlyingToken []common.Address, vaultAdmin []common.Address) (event.Subscription, error) {
+
+ var vaultRule []interface{}
+ for _, vaultItem := range vault {
+ vaultRule = append(vaultRule, vaultItem)
+ }
+ var underlyingTokenRule []interface{}
+ for _, underlyingTokenItem := range underlyingToken {
+ underlyingTokenRule = append(underlyingTokenRule, underlyingTokenItem)
+ }
+ var vaultAdminRule []interface{}
+ for _, vaultAdminItem := range vaultAdmin {
+ vaultAdminRule = append(vaultAdminRule, vaultAdminItem)
+ }
- logs, sub, err := _IStrategyFactory.contract.WatchLogs(opts, "StrategyBeaconModified")
+ logs, sub, err := _IStrategyFactory.contract.WatchLogs(opts, "DurationVaultDeployed", vaultRule, underlyingTokenRule, vaultAdminRule)
if err != nil {
return nil, err
}
@@ -406,8 +574,8 @@ func (_IStrategyFactory *IStrategyFactoryFilterer) WatchStrategyBeaconModified(o
select {
case log := <-logs:
// New log arrived, parse the event and forward to the user
- event := new(IStrategyFactoryStrategyBeaconModified)
- if err := _IStrategyFactory.contract.UnpackLog(event, "StrategyBeaconModified", log); err != nil {
+ event := new(IStrategyFactoryDurationVaultDeployed)
+ if err := _IStrategyFactory.contract.UnpackLog(event, "DurationVaultDeployed", log); err != nil {
return err
}
event.Raw = log
@@ -428,12 +596,12 @@ func (_IStrategyFactory *IStrategyFactoryFilterer) WatchStrategyBeaconModified(o
}), nil
}
-// ParseStrategyBeaconModified is a log parse operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
+// ParseDurationVaultDeployed is a log parse operation binding the contract event 0x6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f81879345568504.
//
-// Solidity: event StrategyBeaconModified(address previousBeacon, address newBeacon)
-func (_IStrategyFactory *IStrategyFactoryFilterer) ParseStrategyBeaconModified(log types.Log) (*IStrategyFactoryStrategyBeaconModified, error) {
- event := new(IStrategyFactoryStrategyBeaconModified)
- if err := _IStrategyFactory.contract.UnpackLog(event, "StrategyBeaconModified", log); err != nil {
+// Solidity: event DurationVaultDeployed(address indexed vault, address indexed underlyingToken, address indexed vaultAdmin, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI, address operatorSetAVS, uint32 operatorSetId)
+func (_IStrategyFactory *IStrategyFactoryFilterer) ParseDurationVaultDeployed(log types.Log) (*IStrategyFactoryDurationVaultDeployed, error) {
+ event := new(IStrategyFactoryDurationVaultDeployed)
+ if err := _IStrategyFactory.contract.UnpackLog(event, "DurationVaultDeployed", log); err != nil {
return nil, err
}
event.Raw = log
diff --git a/pkg/bindings/KeyRegistrar/binding.go b/pkg/bindings/KeyRegistrar/binding.go
index aa02b956f9..dae08ec72e 100644
--- a/pkg/bindings/KeyRegistrar/binding.go
+++ b/pkg/bindings/KeyRegistrar/binding.go
@@ -50,7 +50,7 @@ type OperatorSet struct {
// KeyRegistrarMetaData contains all meta data concerning the KeyRegistrar contract.
var KeyRegistrarMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BN254_KEY_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ECDSA_KEY_REGISTRATION_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\":\"configureOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterKey\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"encodeBN254KeyData\",\"inputs\":[{\"name\":\"g1Point\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"g2Point\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getBN254Key\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"g1Point\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"g2Point\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBN254KeyRegistrationMessageHash\",\"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\":\"keyData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getECDSAAddress\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getECDSAKey\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getECDSAKeyRegistrationMessageHash\",\"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\":\"keyAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getKeyHash\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorFromSigningKey\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"keyData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCurveType\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isKeyGloballyRegistered\",\"inputs\":[{\"name\":\"keyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRegistered\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerKey\",\"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\":\"keyData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AggregateBN254KeyUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"newAggregateKey\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"KeyDeregistered\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"KeyRegistered\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"},{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetConfigured\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"curveType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ConfigurationAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECAddFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECMulFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECPairingFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpModFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCurveType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidKeyFormat\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidKeypair\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"KeyAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"KeyNotFound\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorSetNotConfigured\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorStillSlashable\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroPubkey\",\"inputs\":[]}]",
- Bin: "0x60e060405234801561000f575f5ffd5b5060405161311838038061311883398101604081905261002e916100cb565b6001600160a01b03808316608052831660a052808061004c8161005a565b60c052506101fc9350505050565b5f5f829050601f8151111561008d578260405163305a27a960e01b815260040161008491906101a1565b60405180910390fd5b8051610098826101d6565b179392505050565b6001600160a01b03811681146100b4575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156100dd575f5ffd5b83516100e8816100a0565b60208501519093506100f9816100a0565b60408501519092506001600160401b03811115610114575f5ffd5b8401601f81018613610124575f5ffd5b80516001600160401b0381111561013d5761013d6100b7565b604051601f8201601f19908116603f011681016001600160401b038111828210171561016b5761016b6100b7565b604052818152828201602001881015610182575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156101f6575f198160200360031b1b821691505b50919050565b60805160a05160c051612edd61023b5f395f81816103fa015261161801525f818161019501526116ea01525f818161033b01526106000152612edd5ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063aa165c30116100a9578063d9f12db21161006e578063d9f12db214610370578063dab42d7e14610383578063ea0d8149146103a5578063ea194e2e146103b8578063f698da25146103cb575f5ffd5b8063aa165c30146102d9578063b05c8f6d146102ec578063bd30a0b914610313578063ca8aa7c714610336578063d40cda161461035d575f5ffd5b80637690e395116100ef5780637690e3951461023e5780637cffe48c146102515780638256909c1461027157806387ab86f4146102a35780639a43e3fb146102b8575f5ffd5b8063166aa1271461012b5780633b32a7bd146101655780634657e26a1461019057806350435add146101b757806354fd4d5014610236575b5f5ffd5b6101527f991b0a3376ce87f8ecc5d70962279ac09cdce934e8b5b9683e73c8ff087c7f8181565b6040519081526020015b60405180910390f35b61017861017336600461256a565b6103d3565b6040516001600160a01b03909116815260200161015c565b6101787f000000000000000000000000000000000000000000000000000000000000000081565b6102296101c53660046125eb565b8151602080840151835180519083015185840151805190850151604080519687019790975295850193909352606084810192909252608084015260a083019190915260c082019290925260e001604051602081830303815290604052905092915050565b60405161015c9190612696565b6102296103f3565b61015261024c3660046126e6565b610423565b61026461025f366004612744565b6104cb565b60405161015c9190612792565b61028461027f3660046127a0565b6104f1565b604080516001600160a01b03909316835290151560208301520161015c565b6102b66102b1366004612846565b6105df565b005b6102cb6102c636600461256a565b6108d3565b60405161015c929190612891565b6102296102e736600461256a565b610abb565b6101527fda86e76deaed01641f80ff5f72c372a038fa5182697aeb967e8b1f9819d58d8181565b61032661032136600461256a565b610bf8565b604051901515815260200161015c565b6101787f000000000000000000000000000000000000000000000000000000000000000081565b6102b661036b3660046128ce565b610c35565b61015261037e36600461295f565b610d89565b6103266103913660046129a0565b5f9081526002602052604090205460ff1690565b6102b66103b33660046129b7565b610e22565b6101526103c636600461256a565b610f48565b610152611070565b5f6103de8383610abb565b6103e7906129f0565b60601c90505b92915050565b606061041e7f0000000000000000000000000000000000000000000000000000000000000000611129565b905090565b5f5f7fda86e76deaed01641f80ff5f72c372a038fa5182697aeb967e8b1f9819d58d8186865f015187602001518787604051610460929190612a48565b6040805191829003822060208301969096526001600160a01b039485169082015292909116606083015263ffffffff16608082015260a081019190915260c0016040516020818303038152906040528051906020012090506104c181611166565b9695505050505050565b5f60015f6104d8846111ac565b815260208101919091526040015f205460ff1692915050565b5f5f5f60015f610500876111ac565b815260208101919091526040015f9081205460ff169150600182600281111561052b5761052b61275e565b0361053d5750835160208501206105ae565b60028260028111156105515761055161275e565b03610595575f5f8680602001905181019061056c9190612a57565b60408051808201825283815260209081019283525f9384529151909152902092506105ae915050565b60405163fdea7c0960e01b815260040160405180910390fd5b5f818152600360205260409020546001600160a01b0316806105d08882610bf8565b945094505050505b9250929050565b816105e98161120a565b6040516309a961f360e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631352c3e6906106379086908690600401612a79565b602060405180830381865afa158015610652573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106769190612aaf565b15828490916106c357604051631070287960e01b815282516001600160a01b03908116600483015260209093015163ffffffff166024820152911660448201526064015b60405180910390fd5b50505f60015f6106d2856111ac565b815260208101919091526040015f9081205460ff1691508160028111156106fb576106fb61275e565b0361071957604051635cd3106d60e11b815260040160405180910390fd5b5f5f5f610725866111ac565b815260208082019290925260409081015f9081206001600160a01b038916825283528190208151808301909252805460ff1615158252600181018054929391929184019161077290612ace565b80601f016020809104026020016040519081016040528092919081815260200182805461079e90612ace565b80156107e95780601f106107c0576101008083540402835291602001916107e9565b820191905f5260205f20905b8154815290600101906020018083116107cc57829003601f168201915b5050505050815250509050805f01518486909161083f57604051632e40e18760e01b815282516001600160a01b03908116600483015260209093015163ffffffff166024820152911660448201526064016106ba565b50505f5f61084c866111ac565b815260208082019290925260409081015f9081206001600160a01b03891682529092528120805460ff19168155906108876001830182612372565b5050846001600160a01b03167f28d3c3cee49478ec6fd219cfd685cd15cd01d95cabf69b4b7b57f9eaa3eb644285846040516108c4929190612b06565b60405180910390a25050505050565b604080518082019091525f80825260208201526108ee6123a9565b5f60015f6108fb876111ac565b815260208101919091526040015f205460ff16905060028160028111156109245761092461275e565b146109425760405163fdea7c0960e01b815260040160405180910390fd5b5f5f5f61094e886111ac565b815260208082019290925260409081015f9081206001600160a01b038916825283528190208151808301909252805460ff1615158252600181018054929391929184019161099b90612ace565b80601f01602080910402602001604051908101604052809291908181526020018280546109c790612ace565b8015610a125780601f106109e957610100808354040283529160200191610a12565b820191905f5260205f20905b8154815290600101906020018083116109f557829003601f168201915b5050505050815250509050805f0151610a675750506040805180820182525f808252602080830182905283518085018552828152808201929092528351808501909452828452830191909152925090506105d8565b5f5f5f5f8460200151806020019051810190610a839190612b78565b604080518082018252948552602080860194909452805180820190915291825291810191909152909b909a5098505050505050505050565b60605f60015f610aca866111ac565b815260208101919091526040015f205460ff1690506001816002811115610af357610af361275e565b14610b115760405163fdea7c0960e01b815260040160405180910390fd5b5f5f5f610b1d876111ac565b815260208082019290925260409081015f9081206001600160a01b038816825283528190208151808301909252805460ff16151582526001810180549293919291840191610b6a90612ace565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9690612ace565b8015610be15780601f10610bb857610100808354040283529160200191610be1565b820191905f5260205f20905b815481529060010190602001808311610bc457829003601f168201915b505050919092525050506020015195945050505050565b5f5f5f610c04856111ac565b815260208082019290925260409081015f9081206001600160a01b038616825290925290205460ff16905092915050565b85610c3f8161120a565b5f60015f610c4c896111ac565b815260208101919091526040015f9081205460ff169150816002811115610c7557610c7561275e565b03610c9357604051635cd3106d60e11b815260040160405180910390fd5b5f5f610c9e896111ac565b815260208082019290925260409081015f9081206001600160a01b038c16825290925290205460ff1615610ce5576040516342ee68b560e01b815260040160405180910390fd5b6001816002811115610cf957610cf961275e565b03610d1157610d0c878988888888611233565b610d38565b6002816002811115610d2557610d2561275e565b0361059557610d0c878988888888611394565b876001600160a01b03167f1201ce0c5e577111bce91e907fd99cb183da5edc1e3fb650ca40769e4e9176dd88838989604051610d779493929190612bbe565b60405180910390a25050505050505050565b81516020808401516040515f938493610df6937f991b0a3376ce87f8ecc5d70962279ac09cdce934e8b5b9683e73c8ff087c7f81938a93928991019485526001600160a01b039384166020860152918316604085015263ffffffff16606084015216608082015260a00190565b604051602081830303815290604052805190602001209050610e1781611166565b9150505b9392505050565b8151610e2d8161120a565b6001826002811115610e4157610e4161275e565b1480610e5e57506002826002811115610e5c57610e5c61275e565b145b610e7b5760405163fdea7c0960e01b815260040160405180910390fd5b5f60015f610e88866111ac565b815260208101919091526040015f9081205460ff169150816002811115610eb157610eb161275e565b14610ece576040516281f09f60e01b815260040160405180910390fd5b8260015f610edb876111ac565b815260208101919091526040015f20805460ff19166001836002811115610f0457610f0461275e565b02179055507fb2266cb118e57095fcdbedb24dabd9fc9f5127e2dbedf62ce6ee71696fb8b6e78484604051610f3a929190612b06565b60405180910390a150505050565b5f5f5f5f610f55866111ac565b815260208082019290925260409081015f9081206001600160a01b038716825283528190208151808301909252805460ff16151582526001810180549293919291840191610fa290612ace565b80601f0160208091040260200160405190810160405280929190818152602001828054610fce90612ace565b80156110195780601f10610ff057610100808354040283529160200191611019565b820191905f5260205f20905b815481529060010190602001808311610ffc57829003601f168201915b50505050508152505090505f60015f611031876111ac565b815260208101919091526040015f2054825160ff909116915061105957505f91506103ed9050565b61106782602001518261158f565b95945050505050565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea6110dd611610565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60605f61113583611685565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f61116f611070565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f815f0151826020015163ffffffff166040516020016111f292919060609290921b6001600160601b031916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526103ed90612c1b565b611213816116ac565b6112305760405163932d94f760e01b815260040160405180910390fd5b50565b601483146112545760405163d109118160e01b815260040160405180910390fd5b5f61125f8486612c3e565b60601c90508061128257604051634935505f60e01b815260040160405180910390fd5b5f6112c486868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506001925061158f915050565b5f8181526002602052604090205490915060ff16156112f657604051630c7bc20160e11b815260040160405180910390fd5b5f611302888a85610d89565b9050611347838287878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505f199250611755915050565b611389898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508892506117ad915050565b505050505050505050565b60c083146113b55760405163d109118160e01b815260040160405180910390fd5b604081146113d657604051638baa579f60e01b815260040160405180910390fd5b604080518082019091525f80825260208201526113f16123a9565b5f808080611401898b018b612c7c565b93509350935093506040518060400160405280858152602001848152509550835f14801561142d575082155b1561144b57604051634935505f60e01b815260040160405180910390fd5b60408051808201909152918252602082015292505f91506114709050888a8989610423565b90505f8061148086880188612cb6565b604080518082019091528281526020810182905291935091505f6114a885838989858061185a565b915050806114c957604051638baa579f60e01b815260040160405180910390fd5b5f61150b8c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506002925061158f915050565b5f8181526002602052604090205490915060ff161561153d57604051630c7bc20160e11b815260040160405180910390fd5b61157f8e8e8e8e8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792506117ad915050565b5050505050505050505050505050565b5f60018260028111156115a4576115a461275e565b036115b65750815160208301206103ed565b60028260028111156115ca576115ca61275e565b03610595575f5f848060200190518101906115e59190612b78565b505060408051808201825283815260209081019283525f9384529151909152902092506103ed915050565b60605f61163c7f0000000000000000000000000000000000000000000000000000000000000000611129565b9050805f8151811061165057611650612a34565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b5f60ff8216601f8111156103ed57604051632cd44ac360e21b815260040160405180910390fd5b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb890608401602060405180830381865afa158015611731573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ed9190612aaf565b4281101561177657604051630819bdcd60e01b815260040160405180910390fd5b61178a6001600160a01b0385168484611922565b6117a757604051638baa579f60e01b815260040160405180910390fd5b50505050565b6040805180820190915260018152602081018390525f806117cd876111ac565b815260208082019290925260409081015f9081206001600160a01b03881682528352208251815460ff19169015151781559082015160018201906118119082612d22565b5050505f908152600260209081526040808320805460ff191660011790556003909152902080546001600160a01b039093166001600160a01b0319909316929092179091555050565b5f5f5f61186689611976565b90505f6118758a89898c611a00565b90505f61188c6118858a84611aab565b8b90611b1b565b90505f6118ce6118c7846118c16040805180820182525f80825260209182015281518083019092526001825260029082015290565b90611aab565b8590611b1b565b905087156118f3576118ea826118e2611b8f565b838c8b611c4f565b96509450611913565b611906826118ff611b8f565b838c611e63565b9550851561191357600194505b50505050965096945050505050565b5f5f5f61192f858561209a565b90925090505f8160048111156119475761194761275e565b1480156119655750856001600160a01b0316826001600160a01b0316145b806104c157506104c18686866120d9565b604080518082019091525f80825260208201525f80806119a35f516020612e885f395f51905f5286612ddd565b90505b6119af816121c0565b90935091505f516020612e885f395f51905f5282830983036119e7576040805180820190915290815260208101919091529392505050565b5f516020612e885f395f51905f526001820890506119a6565b8251602080850151845180519083015186840151805190850151875188870151604080519889018e90528801989098526060870195909552608086019390935260a085019190915260c084015260e08301526101008201526101208101919091525f907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019061014001604051602081830303815290604052805190602001205f1c6110679190612ddd565b604080518082019091525f8082526020820152611ac66123ce565b835181526020808501519082015260408082018490525f908360608460076107d05a03fa90508080611af457fe5b5080611b1357604051632319df1960e11b815260040160405180910390fd5b505092915050565b604080518082019091525f8082526020820152611b366123ec565b835181526020808501518183015283516040808401919091529084015160608301525f908360808460066107d05a03fa90508080611b7057fe5b5080611b135760405163d4b68fd760e01b815260040160405180910390fd5b611b976123a9565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b6040805180820182528681526020808201869052825180840190935286835282018490525f91829190611c8061240a565b5f5b6002811015611e37575f611c97826006612e10565b9050848260028110611cab57611cab612a34565b60200201515183611cbc835f612e27565b600c8110611ccc57611ccc612a34565b6020020152848260028110611ce357611ce3612a34565b60200201516020015183826001611cfa9190612e27565b600c8110611d0a57611d0a612a34565b6020020152838260028110611d2157611d21612a34565b6020020151515183611d34836002612e27565b600c8110611d4457611d44612a34565b6020020152838260028110611d5b57611d5b612a34565b6020020151516001602002015183611d74836003612e27565b600c8110611d8457611d84612a34565b6020020152838260028110611d9b57611d9b612a34565b6020020151602001515f60028110611db557611db5612a34565b602002015183611dc6836004612e27565b600c8110611dd657611dd6612a34565b6020020152838260028110611ded57611ded612a34565b602002015160200151600160028110611e0857611e08612a34565b602002015183611e19836005612e27565b600c8110611e2957611e29612a34565b602002015250600101611c82565b50611e40612429565b5f6020826101808560088cfa9151919c9115159b50909950505050505050505050565b6040805180820182528581526020808201859052825180840190935285835282018390525f91611e9161240a565b5f5b6002811015612048575f611ea8826006612e10565b9050848260028110611ebc57611ebc612a34565b60200201515183611ecd835f612e27565b600c8110611edd57611edd612a34565b6020020152848260028110611ef457611ef4612a34565b60200201516020015183826001611f0b9190612e27565b600c8110611f1b57611f1b612a34565b6020020152838260028110611f3257611f32612a34565b6020020151515183611f45836002612e27565b600c8110611f5557611f55612a34565b6020020152838260028110611f6c57611f6c612a34565b6020020151516001602002015183611f85836003612e27565b600c8110611f9557611f95612a34565b6020020152838260028110611fac57611fac612a34565b6020020151602001515f60028110611fc657611fc6612a34565b602002015183611fd7836004612e27565b600c8110611fe757611fe7612a34565b6020020152838260028110611ffe57611ffe612a34565b60200201516020015160016002811061201957612019612a34565b60200201518361202a836005612e27565b600c811061203a5761203a612a34565b602002015250600101611e93565b50612051612429565b5f6020826101808560086107d05a03fa9050808061206b57fe5b508061208a576040516324ccc79360e21b815260040160405180910390fd5b5051151598975050505050505050565b5f5f82516041036120ce576020830151604084015160608501515f1a6120c28782858561223c565b945094505050506105d8565b505f905060026105d8565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401612101929190612e3a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161213f9190612e5a565b5f60405180830381855afa9150503d805f8114612177576040519150601f19603f3d011682016040523d82523d5f602084013e61217c565b606091505b509150915081801561219057506020815110155b80156104c157508051630b135d3f60e11b906121b59083016020908101908401612e70565b149695505050505050565b5f80805f516020612e885f395f51905f5260035f516020612e885f395f51905f52865f516020612e885f395f51905f52888909090890505f612230827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f525f516020612e885f395f51905f526122f9565b91959194509092505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561227157505f905060036122f0565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156122c2573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122ea575f600192509250506122f0565b91505f90505b94509492505050565b5f5f612303612429565b61230b612447565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa9250828061234857fe5b50826123675760405163d51edae360e01b815260040160405180910390fd5b505195945050505050565b50805461237e90612ace565b5f825580601f1061238d575050565b601f0160209004905f5260205f20908101906112309190612465565b60405180604001604052806123bc61247d565b81526020016123c961247d565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b5b80821115612479575f8155600101612466565b5090565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156124d2576124d261249b565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156125015761250161249b565b604052919050565b80356001600160a01b038116811461251f575f5ffd5b919050565b5f60408284031215612534575f5ffd5b61253c6124af565b905061254782612509565b8152602082013563ffffffff8116811461255f575f5ffd5b602082015292915050565b5f5f6060838503121561257b575f5ffd5b6125858484612524565b915061259360408401612509565b90509250929050565b5f82601f8301126125ab575f5ffd5b6125b560406124d8565b8060408401858111156125c6575f5ffd5b845b818110156125e05780358452602093840193016125c8565b509095945050505050565b5f5f82840360c08112156125fd575f5ffd5b604081121561260a575f5ffd5b6126126124af565b843581526020808601359082015292506080603f1982011215612633575f5ffd5b5061263c6124af565b612649856040860161259c565b8152612658856080860161259c565b6020820152809150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610e1b6020830184612668565b5f5f83601f8401126126b8575f5ffd5b50813567ffffffffffffffff8111156126cf575f5ffd5b6020830191508360208285010111156105d8575f5ffd5b5f5f5f5f608085870312156126f9575f5ffd5b61270285612509565b93506127118660208701612524565b9250606085013567ffffffffffffffff81111561272c575f5ffd5b612738878288016126a8565b95989497509550505050565b5f60408284031215612754575f5ffd5b610e1b8383612524565b634e487b7160e01b5f52602160045260245ffd5b6003811061278e57634e487b7160e01b5f52602160045260245ffd5b9052565b602081016103ed8284612772565b5f5f606083850312156127b1575f5ffd5b6127bb8484612524565b9150604083013567ffffffffffffffff8111156127d6575f5ffd5b8301601f810185136127e6575f5ffd5b803567ffffffffffffffff8111156128005761280061249b565b612813601f8201601f19166020016124d8565b818152866020838501011115612827575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f60608385031215612857575f5ffd5b61286083612509565b91506125938460208501612524565b805f5b60028110156117a7578151845260209384019390910190600101612872565b5f60c08201905083518252602084015160208301526128b460408301845161286f565b60208301516128c6608084018261286f565b509392505050565b5f5f5f5f5f5f60a087890312156128e3575f5ffd5b6128ec87612509565b95506128fb8860208901612524565b9450606087013567ffffffffffffffff811115612916575f5ffd5b61292289828a016126a8565b909550935050608087013567ffffffffffffffff811115612941575f5ffd5b61294d89828a016126a8565b979a9699509497509295939492505050565b5f5f5f60808486031215612971575f5ffd5b61297a84612509565b92506129898560208601612524565b915061299760608501612509565b90509250925092565b5f602082840312156129b0575f5ffd5b5035919050565b5f5f606083850312156129c8575f5ffd5b6129d28484612524565b91506040830135600381106129e5575f5ffd5b809150509250929050565b805160208201516001600160601b0319811691906014821015612a2d576001600160601b03196001600160601b03198360140360031b1b82161692505b5050919050565b634e487b7160e01b5f52603260045260245ffd5b818382375f9101908152919050565b5f5f60408385031215612a68575f5ffd5b505080516020909101519092909150565b6001600160a01b038316815260608101610e1b602083018480516001600160a01b0316825260209081015163ffffffff16910152565b5f60208284031215612abf575f5ffd5b81518015158114610e1b575f5ffd5b600181811c90821680612ae257607f821691505b602082108103612b0057634e487b7160e01b5f52602260045260245ffd5b50919050565b82516001600160a01b0316815260208084015163ffffffff169082015260608101610e1b6040830184612772565b5f82601f830112612b43575f5ffd5b612b4d60406124d8565b806040840185811115612b5e575f5ffd5b845b818110156125e0578051845260209384019301612b60565b5f5f5f5f60c08587031215612b8b575f5ffd5b845160208601519094509250612ba48660408701612b34565b9150612bb38660808701612b34565b905092959194509250565b84516001600160a01b0316815260208086015163ffffffff1690820152612be86040820185612772565b60806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f191601019392505050565b80516020808301519190811015612b00575f1960209190910360031b1b16919050565b80356001600160601b03198116906014841015612c75576001600160601b03196001600160601b03198560140360031b1b82161691505b5092915050565b5f5f5f5f60c08587031215612c8f575f5ffd5b8435935060208501359250612ca7866040870161259c565b9150612bb3866080870161259c565b5f5f60408385031215612cc7575f5ffd5b50508035926020909101359150565b601f821115612d1d57805f5260205f20601f840160051c81016020851015612cfb5750805b601f840160051c820191505b81811015612d1a575f8155600101612d07565b50505b505050565b815167ffffffffffffffff811115612d3c57612d3c61249b565b612d5081612d4a8454612ace565b84612cd6565b6020601f821160018114612d82575f8315612d6b5750848201515b5f19600385901b1c1916600184901b178455612d1a565b5f84815260208120601f198516915b82811015612db15787850151825560209485019460019092019101612d91565b5084821015612dce57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82612df757634e487b7160e01b5f52601260045260245ffd5b500690565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176103ed576103ed612dfc565b808201808211156103ed576103ed612dfc565b828152604060208201525f612e526040830184612668565b949350505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215612e80575f5ffd5b505191905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a26469706673582212205116202531cd1cef3f76d8ed69440a6716b5dd4f05b86f0c5d7e95b0ac108c4c64736f6c634300081e0033",
+ Bin: "0x60e060405234801561000f575f5ffd5b5060405161311838038061311883398101604081905261002e916100cb565b6001600160a01b03808316608052831660a052808061004c8161005a565b60c052506101fc9350505050565b5f5f829050601f8151111561008d578260405163305a27a960e01b815260040161008491906101a1565b60405180910390fd5b8051610098826101d6565b179392505050565b6001600160a01b03811681146100b4575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156100dd575f5ffd5b83516100e8816100a0565b60208501519093506100f9816100a0565b60408501519092506001600160401b03811115610114575f5ffd5b8401601f81018613610124575f5ffd5b80516001600160401b0381111561013d5761013d6100b7565b604051601f8201601f19908116603f011681016001600160401b038111828210171561016b5761016b6100b7565b604052818152828201602001881015610182575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156101f6575f198160200360031b1b821691505b50919050565b60805160a05160c051612edd61023b5f395f81816103fa015261161801525f818161019501526116ea01525f818161033b01526106000152612edd5ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063aa165c30116100a9578063d9f12db21161006e578063d9f12db214610370578063dab42d7e14610383578063ea0d8149146103a5578063ea194e2e146103b8578063f698da25146103cb575f5ffd5b8063aa165c30146102d9578063b05c8f6d146102ec578063bd30a0b914610313578063ca8aa7c714610336578063d40cda161461035d575f5ffd5b80637690e395116100ef5780637690e3951461023e5780637cffe48c146102515780638256909c1461027157806387ab86f4146102a35780639a43e3fb146102b8575f5ffd5b8063166aa1271461012b5780633b32a7bd146101655780634657e26a1461019057806350435add146101b757806354fd4d5014610236575b5f5ffd5b6101527f991b0a3376ce87f8ecc5d70962279ac09cdce934e8b5b9683e73c8ff087c7f8181565b6040519081526020015b60405180910390f35b61017861017336600461256a565b6103d3565b6040516001600160a01b03909116815260200161015c565b6101787f000000000000000000000000000000000000000000000000000000000000000081565b6102296101c53660046125eb565b8151602080840151835180519083015185840151805190850151604080519687019790975295850193909352606084810192909252608084015260a083019190915260c082019290925260e001604051602081830303815290604052905092915050565b60405161015c9190612696565b6102296103f3565b61015261024c3660046126e6565b610423565b61026461025f366004612744565b6104cb565b60405161015c9190612792565b61028461027f3660046127a0565b6104f1565b604080516001600160a01b03909316835290151560208301520161015c565b6102b66102b1366004612846565b6105df565b005b6102cb6102c636600461256a565b6108d3565b60405161015c929190612891565b6102296102e736600461256a565b610abb565b6101527fda86e76deaed01641f80ff5f72c372a038fa5182697aeb967e8b1f9819d58d8181565b61032661032136600461256a565b610bf8565b604051901515815260200161015c565b6101787f000000000000000000000000000000000000000000000000000000000000000081565b6102b661036b3660046128ce565b610c35565b61015261037e36600461295f565b610d89565b6103266103913660046129a0565b5f9081526002602052604090205460ff1690565b6102b66103b33660046129b7565b610e22565b6101526103c636600461256a565b610f48565b610152611070565b5f6103de8383610abb565b6103e7906129f0565b60601c90505b92915050565b606061041e7f0000000000000000000000000000000000000000000000000000000000000000611129565b905090565b5f5f7fda86e76deaed01641f80ff5f72c372a038fa5182697aeb967e8b1f9819d58d8186865f015187602001518787604051610460929190612a48565b6040805191829003822060208301969096526001600160a01b039485169082015292909116606083015263ffffffff16608082015260a081019190915260c0016040516020818303038152906040528051906020012090506104c181611166565b9695505050505050565b5f60015f6104d8846111ac565b815260208101919091526040015f205460ff1692915050565b5f5f5f60015f610500876111ac565b815260208101919091526040015f9081205460ff169150600182600281111561052b5761052b61275e565b0361053d5750835160208501206105ae565b60028260028111156105515761055161275e565b03610595575f5f8680602001905181019061056c9190612a57565b60408051808201825283815260209081019283525f9384529151909152902092506105ae915050565b60405163fdea7c0960e01b815260040160405180910390fd5b5f818152600360205260409020546001600160a01b0316806105d08882610bf8565b945094505050505b9250929050565b816105e98161120a565b6040516309a961f360e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631352c3e6906106379086908690600401612a79565b602060405180830381865afa158015610652573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106769190612aaf565b15828490916106c357604051631070287960e01b815282516001600160a01b03908116600483015260209093015163ffffffff166024820152911660448201526064015b60405180910390fd5b50505f60015f6106d2856111ac565b815260208101919091526040015f9081205460ff1691508160028111156106fb576106fb61275e565b0361071957604051635cd3106d60e11b815260040160405180910390fd5b5f5f5f610725866111ac565b815260208082019290925260409081015f9081206001600160a01b038916825283528190208151808301909252805460ff1615158252600181018054929391929184019161077290612ace565b80601f016020809104026020016040519081016040528092919081815260200182805461079e90612ace565b80156107e95780601f106107c0576101008083540402835291602001916107e9565b820191905f5260205f20905b8154815290600101906020018083116107cc57829003601f168201915b5050505050815250509050805f01518486909161083f57604051632e40e18760e01b815282516001600160a01b03908116600483015260209093015163ffffffff166024820152911660448201526064016106ba565b50505f5f61084c866111ac565b815260208082019290925260409081015f9081206001600160a01b03891682529092528120805460ff19168155906108876001830182612372565b5050846001600160a01b03167f28d3c3cee49478ec6fd219cfd685cd15cd01d95cabf69b4b7b57f9eaa3eb644285846040516108c4929190612b06565b60405180910390a25050505050565b604080518082019091525f80825260208201526108ee6123a9565b5f60015f6108fb876111ac565b815260208101919091526040015f205460ff16905060028160028111156109245761092461275e565b146109425760405163fdea7c0960e01b815260040160405180910390fd5b5f5f5f61094e886111ac565b815260208082019290925260409081015f9081206001600160a01b038916825283528190208151808301909252805460ff1615158252600181018054929391929184019161099b90612ace565b80601f01602080910402602001604051908101604052809291908181526020018280546109c790612ace565b8015610a125780601f106109e957610100808354040283529160200191610a12565b820191905f5260205f20905b8154815290600101906020018083116109f557829003601f168201915b5050505050815250509050805f0151610a675750506040805180820182525f808252602080830182905283518085018552828152808201929092528351808501909452828452830191909152925090506105d8565b5f5f5f5f8460200151806020019051810190610a839190612b78565b604080518082018252948552602080860194909452805180820190915291825291810191909152909b909a5098505050505050505050565b60605f60015f610aca866111ac565b815260208101919091526040015f205460ff1690506001816002811115610af357610af361275e565b14610b115760405163fdea7c0960e01b815260040160405180910390fd5b5f5f5f610b1d876111ac565b815260208082019290925260409081015f9081206001600160a01b038816825283528190208151808301909252805460ff16151582526001810180549293919291840191610b6a90612ace565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9690612ace565b8015610be15780601f10610bb857610100808354040283529160200191610be1565b820191905f5260205f20905b815481529060010190602001808311610bc457829003601f168201915b505050919092525050506020015195945050505050565b5f5f5f610c04856111ac565b815260208082019290925260409081015f9081206001600160a01b038616825290925290205460ff16905092915050565b85610c3f8161120a565b5f60015f610c4c896111ac565b815260208101919091526040015f9081205460ff169150816002811115610c7557610c7561275e565b03610c9357604051635cd3106d60e11b815260040160405180910390fd5b5f5f610c9e896111ac565b815260208082019290925260409081015f9081206001600160a01b038c16825290925290205460ff1615610ce5576040516342ee68b560e01b815260040160405180910390fd5b6001816002811115610cf957610cf961275e565b03610d1157610d0c878988888888611233565b610d38565b6002816002811115610d2557610d2561275e565b0361059557610d0c878988888888611394565b876001600160a01b03167f1201ce0c5e577111bce91e907fd99cb183da5edc1e3fb650ca40769e4e9176dd88838989604051610d779493929190612bbe565b60405180910390a25050505050505050565b81516020808401516040515f938493610df6937f991b0a3376ce87f8ecc5d70962279ac09cdce934e8b5b9683e73c8ff087c7f81938a93928991019485526001600160a01b039384166020860152918316604085015263ffffffff16606084015216608082015260a00190565b604051602081830303815290604052805190602001209050610e1781611166565b9150505b9392505050565b8151610e2d8161120a565b6001826002811115610e4157610e4161275e565b1480610e5e57506002826002811115610e5c57610e5c61275e565b145b610e7b5760405163fdea7c0960e01b815260040160405180910390fd5b5f60015f610e88866111ac565b815260208101919091526040015f9081205460ff169150816002811115610eb157610eb161275e565b14610ece576040516281f09f60e01b815260040160405180910390fd5b8260015f610edb876111ac565b815260208101919091526040015f20805460ff19166001836002811115610f0457610f0461275e565b02179055507fb2266cb118e57095fcdbedb24dabd9fc9f5127e2dbedf62ce6ee71696fb8b6e78484604051610f3a929190612b06565b60405180910390a150505050565b5f5f5f5f610f55866111ac565b815260208082019290925260409081015f9081206001600160a01b038716825283528190208151808301909252805460ff16151582526001810180549293919291840191610fa290612ace565b80601f0160208091040260200160405190810160405280929190818152602001828054610fce90612ace565b80156110195780601f10610ff057610100808354040283529160200191611019565b820191905f5260205f20905b815481529060010190602001808311610ffc57829003601f168201915b50505050508152505090505f60015f611031876111ac565b815260208101919091526040015f2054825160ff909116915061105957505f91506103ed9050565b61106782602001518261158f565b95945050505050565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea6110dd611610565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60605f61113583611685565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f61116f611070565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f815f0151826020015163ffffffff166040516020016111f292919060609290921b6001600160601b031916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526103ed90612c1b565b611213816116ac565b6112305760405163932d94f760e01b815260040160405180910390fd5b50565b601483146112545760405163d109118160e01b815260040160405180910390fd5b5f61125f8486612c3e565b60601c90508061128257604051634935505f60e01b815260040160405180910390fd5b5f6112c486868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506001925061158f915050565b5f8181526002602052604090205490915060ff16156112f657604051630c7bc20160e11b815260040160405180910390fd5b5f611302888a85610d89565b9050611347838287878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505f199250611755915050565b611389898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508892506117ad915050565b505050505050505050565b60c083146113b55760405163d109118160e01b815260040160405180910390fd5b604081146113d657604051638baa579f60e01b815260040160405180910390fd5b604080518082019091525f80825260208201526113f16123a9565b5f808080611401898b018b612c7c565b93509350935093506040518060400160405280858152602001848152509550835f14801561142d575082155b1561144b57604051634935505f60e01b815260040160405180910390fd5b60408051808201909152918252602082015292505f91506114709050888a8989610423565b90505f8061148086880188612cb6565b604080518082019091528281526020810182905291935091505f6114a885838989858061185a565b915050806114c957604051638baa579f60e01b815260040160405180910390fd5b5f61150b8c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506002925061158f915050565b5f8181526002602052604090205490915060ff161561153d57604051630c7bc20160e11b815260040160405180910390fd5b61157f8e8e8e8e8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792506117ad915050565b5050505050505050505050505050565b5f60018260028111156115a4576115a461275e565b036115b65750815160208301206103ed565b60028260028111156115ca576115ca61275e565b03610595575f5f848060200190518101906115e59190612b78565b505060408051808201825283815260209081019283525f9384529151909152902092506103ed915050565b60605f61163c7f0000000000000000000000000000000000000000000000000000000000000000611129565b9050805f8151811061165057611650612a34565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b5f60ff8216601f8111156103ed57604051632cd44ac360e21b815260040160405180910390fd5b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb890608401602060405180830381865afa158015611731573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ed9190612aaf565b4281101561177657604051630819bdcd60e01b815260040160405180910390fd5b61178a6001600160a01b0385168484611922565b6117a757604051638baa579f60e01b815260040160405180910390fd5b50505050565b6040805180820190915260018152602081018390525f806117cd876111ac565b815260208082019290925260409081015f9081206001600160a01b03881682528352208251815460ff19169015151781559082015160018201906118119082612d22565b5050505f908152600260209081526040808320805460ff191660011790556003909152902080546001600160a01b039093166001600160a01b0319909316929092179091555050565b5f5f5f61186689611976565b90505f6118758a89898c611a00565b90505f61188c6118858a84611aab565b8b90611b1b565b90505f6118ce6118c7846118c16040805180820182525f80825260209182015281518083019092526001825260029082015290565b90611aab565b8590611b1b565b905087156118f3576118ea826118e2611b8f565b838c8b611c4f565b96509450611913565b611906826118ff611b8f565b838c611e63565b9550851561191357600194505b50505050965096945050505050565b5f5f5f61192f858561209a565b90925090505f8160048111156119475761194761275e565b1480156119655750856001600160a01b0316826001600160a01b0316145b806104c157506104c18686866120d9565b604080518082019091525f80825260208201525f80806119a35f516020612e885f395f51905f5286612ddd565b90505b6119af816121c0565b90935091505f516020612e885f395f51905f5282830983036119e7576040805180820190915290815260208101919091529392505050565b5f516020612e885f395f51905f526001820890506119a6565b8251602080850151845180519083015186840151805190850151875188870151604080519889018e90528801989098526060870195909552608086019390935260a085019190915260c084015260e08301526101008201526101208101919091525f907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019061014001604051602081830303815290604052805190602001205f1c6110679190612ddd565b604080518082019091525f8082526020820152611ac66123ce565b835181526020808501519082015260408082018490525f908360608460076107d05a03fa90508080611af457fe5b5080611b1357604051632319df1960e11b815260040160405180910390fd5b505092915050565b604080518082019091525f8082526020820152611b366123ec565b835181526020808501518183015283516040808401919091529084015160608301525f908360808460066107d05a03fa90508080611b7057fe5b5080611b135760405163d4b68fd760e01b815260040160405180910390fd5b611b976123a9565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b6040805180820182528681526020808201869052825180840190935286835282018490525f91829190611c8061240a565b5f5b6002811015611e37575f611c97826006612e10565b9050848260028110611cab57611cab612a34565b60200201515183611cbc835f612e27565b600c8110611ccc57611ccc612a34565b6020020152848260028110611ce357611ce3612a34565b60200201516020015183826001611cfa9190612e27565b600c8110611d0a57611d0a612a34565b6020020152838260028110611d2157611d21612a34565b6020020151515183611d34836002612e27565b600c8110611d4457611d44612a34565b6020020152838260028110611d5b57611d5b612a34565b6020020151516001602002015183611d74836003612e27565b600c8110611d8457611d84612a34565b6020020152838260028110611d9b57611d9b612a34565b6020020151602001515f60028110611db557611db5612a34565b602002015183611dc6836004612e27565b600c8110611dd657611dd6612a34565b6020020152838260028110611ded57611ded612a34565b602002015160200151600160028110611e0857611e08612a34565b602002015183611e19836005612e27565b600c8110611e2957611e29612a34565b602002015250600101611c82565b50611e40612429565b5f6020826101808560088cfa9151919c9115159b50909950505050505050505050565b6040805180820182528581526020808201859052825180840190935285835282018390525f91611e9161240a565b5f5b6002811015612048575f611ea8826006612e10565b9050848260028110611ebc57611ebc612a34565b60200201515183611ecd835f612e27565b600c8110611edd57611edd612a34565b6020020152848260028110611ef457611ef4612a34565b60200201516020015183826001611f0b9190612e27565b600c8110611f1b57611f1b612a34565b6020020152838260028110611f3257611f32612a34565b6020020151515183611f45836002612e27565b600c8110611f5557611f55612a34565b6020020152838260028110611f6c57611f6c612a34565b6020020151516001602002015183611f85836003612e27565b600c8110611f9557611f95612a34565b6020020152838260028110611fac57611fac612a34565b6020020151602001515f60028110611fc657611fc6612a34565b602002015183611fd7836004612e27565b600c8110611fe757611fe7612a34565b6020020152838260028110611ffe57611ffe612a34565b60200201516020015160016002811061201957612019612a34565b60200201518361202a836005612e27565b600c811061203a5761203a612a34565b602002015250600101611e93565b50612051612429565b5f6020826101808560086107d05a03fa9050808061206b57fe5b508061208a576040516324ccc79360e21b815260040160405180910390fd5b5051151598975050505050505050565b5f5f82516041036120ce576020830151604084015160608501515f1a6120c28782858561223c565b945094505050506105d8565b505f905060026105d8565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401612101929190612e3a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161213f9190612e5a565b5f60405180830381855afa9150503d805f8114612177576040519150601f19603f3d011682016040523d82523d5f602084013e61217c565b606091505b509150915081801561219057506020815110155b80156104c157508051630b135d3f60e11b906121b59083016020908101908401612e70565b149695505050505050565b5f80805f516020612e885f395f51905f5260035f516020612e885f395f51905f52865f516020612e885f395f51905f52888909090890505f612230827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f525f516020612e885f395f51905f526122f9565b91959194509092505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561227157505f905060036122f0565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156122c2573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122ea575f600192509250506122f0565b91505f90505b94509492505050565b5f5f612303612429565b61230b612447565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa9250828061234857fe5b50826123675760405163d51edae360e01b815260040160405180910390fd5b505195945050505050565b50805461237e90612ace565b5f825580601f1061238d575050565b601f0160209004905f5260205f20908101906112309190612465565b60405180604001604052806123bc61247d565b81526020016123c961247d565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b5b80821115612479575f8155600101612466565b5090565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156124d2576124d261249b565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156125015761250161249b565b604052919050565b80356001600160a01b038116811461251f575f5ffd5b919050565b5f60408284031215612534575f5ffd5b61253c6124af565b905061254782612509565b8152602082013563ffffffff8116811461255f575f5ffd5b602082015292915050565b5f5f6060838503121561257b575f5ffd5b6125858484612524565b915061259360408401612509565b90509250929050565b5f82601f8301126125ab575f5ffd5b6125b560406124d8565b8060408401858111156125c6575f5ffd5b845b818110156125e05780358452602093840193016125c8565b509095945050505050565b5f5f82840360c08112156125fd575f5ffd5b604081121561260a575f5ffd5b6126126124af565b843581526020808601359082015292506080603f1982011215612633575f5ffd5b5061263c6124af565b612649856040860161259c565b8152612658856080860161259c565b6020820152809150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610e1b6020830184612668565b5f5f83601f8401126126b8575f5ffd5b50813567ffffffffffffffff8111156126cf575f5ffd5b6020830191508360208285010111156105d8575f5ffd5b5f5f5f5f608085870312156126f9575f5ffd5b61270285612509565b93506127118660208701612524565b9250606085013567ffffffffffffffff81111561272c575f5ffd5b612738878288016126a8565b95989497509550505050565b5f60408284031215612754575f5ffd5b610e1b8383612524565b634e487b7160e01b5f52602160045260245ffd5b6003811061278e57634e487b7160e01b5f52602160045260245ffd5b9052565b602081016103ed8284612772565b5f5f606083850312156127b1575f5ffd5b6127bb8484612524565b9150604083013567ffffffffffffffff8111156127d6575f5ffd5b8301601f810185136127e6575f5ffd5b803567ffffffffffffffff8111156128005761280061249b565b612813601f8201601f19166020016124d8565b818152866020838501011115612827575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f60608385031215612857575f5ffd5b61286083612509565b91506125938460208501612524565b805f5b60028110156117a7578151845260209384019390910190600101612872565b5f60c08201905083518252602084015160208301526128b460408301845161286f565b60208301516128c6608084018261286f565b509392505050565b5f5f5f5f5f5f60a087890312156128e3575f5ffd5b6128ec87612509565b95506128fb8860208901612524565b9450606087013567ffffffffffffffff811115612916575f5ffd5b61292289828a016126a8565b909550935050608087013567ffffffffffffffff811115612941575f5ffd5b61294d89828a016126a8565b979a9699509497509295939492505050565b5f5f5f60808486031215612971575f5ffd5b61297a84612509565b92506129898560208601612524565b915061299760608501612509565b90509250925092565b5f602082840312156129b0575f5ffd5b5035919050565b5f5f606083850312156129c8575f5ffd5b6129d28484612524565b91506040830135600381106129e5575f5ffd5b809150509250929050565b805160208201516001600160601b0319811691906014821015612a2d576001600160601b03196001600160601b03198360140360031b1b82161692505b5050919050565b634e487b7160e01b5f52603260045260245ffd5b818382375f9101908152919050565b5f5f60408385031215612a68575f5ffd5b505080516020909101519092909150565b6001600160a01b038316815260608101610e1b602083018480516001600160a01b0316825260209081015163ffffffff16910152565b5f60208284031215612abf575f5ffd5b81518015158114610e1b575f5ffd5b600181811c90821680612ae257607f821691505b602082108103612b0057634e487b7160e01b5f52602260045260245ffd5b50919050565b82516001600160a01b0316815260208084015163ffffffff169082015260608101610e1b6040830184612772565b5f82601f830112612b43575f5ffd5b612b4d60406124d8565b806040840185811115612b5e575f5ffd5b845b818110156125e0578051845260209384019301612b60565b5f5f5f5f60c08587031215612b8b575f5ffd5b845160208601519094509250612ba48660408701612b34565b9150612bb38660808701612b34565b905092959194509250565b84516001600160a01b0316815260208086015163ffffffff1690820152612be86040820185612772565b60806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f191601019392505050565b80516020808301519190811015612b00575f1960209190910360031b1b16919050565b80356001600160601b03198116906014841015612c75576001600160601b03196001600160601b03198560140360031b1b82161691505b5092915050565b5f5f5f5f60c08587031215612c8f575f5ffd5b8435935060208501359250612ca7866040870161259c565b9150612bb3866080870161259c565b5f5f60408385031215612cc7575f5ffd5b50508035926020909101359150565b601f821115612d1d57805f5260205f20601f840160051c81016020851015612cfb5750805b601f840160051c820191505b81811015612d1a575f8155600101612d07565b50505b505050565b815167ffffffffffffffff811115612d3c57612d3c61249b565b612d5081612d4a8454612ace565b84612cd6565b6020601f821160018114612d82575f8315612d6b5750848201515b5f19600385901b1c1916600184901b178455612d1a565b5f84815260208120601f198516915b82811015612db15787850151825560209485019460019092019101612d91565b5084821015612dce57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82612df757634e487b7160e01b5f52601260045260245ffd5b500690565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176103ed576103ed612dfc565b808201808211156103ed576103ed612dfc565b828152604060208201525f612e526040830184612668565b949350505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215612e80575f5ffd5b505191905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a2646970667358221220c5372579b19aaa725b7b59a759ed9f8fea7d53af64d9872500de95b65fe6b2a764736f6c634300081e0033",
}
// KeyRegistrarABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/RewardsCoordinator/binding.go b/pkg/bindings/RewardsCoordinator/binding.go
index 559181692b..ef9f26da8c 100644
--- a/pkg/bindings/RewardsCoordinator/binding.go
+++ b/pkg/bindings/RewardsCoordinator/binding.go
@@ -64,6 +64,7 @@ type IRewardsCoordinatorTypesRewardsCoordinatorConstructorParams struct {
DelegationManager common.Address
StrategyManager common.Address
AllocationManager common.Address
+ EmissionsController common.Address
PauserRegistry common.Address
PermissionController common.Address
CALCULATIONINTERVALSECONDS uint32
@@ -113,8 +114,8 @@ type OperatorSet struct {
// RewardsCoordinatorMetaData contains all meta data concerning the RewardsCoordinator contract.
var RewardsCoordinatorMetaData = &bind.MetaData{
- 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\"}]}],\"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\":\"createTotalStakeRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"createUniqueStakeRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"isTotalStakeRewardsSubmissionHash\",\"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\":\"isUniqueStakeRewardsSubmissionHash\",\"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\":\"TotalStakeRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rewardsSubmissionHash\",\"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\":\"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\":\"UniqueStakeRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rewardsSubmissionHash\",\"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\":\"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\":\"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\":\"DurationIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyRoot\",\"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\":\"InvalidIndex\",\"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: "0x6101c0604052348015610010575f5ffd5b50604051614ea1380380614ea183398101604081905261002f91610263565b608081015181516020830151604084015160a085015160c086015160e087015161010088015161012089015160608a01516001600160a01b038116610087576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261009d858261032d565b63ffffffff16156100c157604051630e06bd3160e01b815260040160405180910390fd5b6100ce620151808661032d565b63ffffffff16156100f25760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a05261013e610144565b50610360565b5f54610100900460ff16156101af5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101fe575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60405161014081016001600160401b038111828210171561022f57634e487b7160e01b5f52604160045260245ffd5b60405290565b80516001600160a01b038116811461024b575f5ffd5b919050565b805163ffffffff8116811461024b575f5ffd5b5f610140828403128015610275575f5ffd5b5061027e610200565b61028783610235565b815261029560208401610235565b60208201526102a660408401610235565b60408201526102b760608401610235565b60608201526102c860808401610235565b60808201526102d960a08401610250565b60a08201526102ea60c08401610250565b60c08201526102fb60e08401610250565b60e082015261030d6101008401610250565b6101008201526103206101208401610250565b6101208201529392505050565b5f63ffffffff83168061034e57634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051614a6261043f5f395f818161063e015261368c01525f81816104c5015261386f01525f81816104140152612d8a01525f81816105a0015261382d01525f818161090a015261371701525f818161081e0152818161376701526137db01525f818161095e01528181610b4b015281816114f30152818161176801528181612092015261230201525f81816105c7015261390a01525f81816109d1015261200201525f818161079d01528181612c2f015261359f0152614a625ff3fe608060405234801561000f575f5ffd5b50600436106103d4575f3560e01c80638cb0ae1b11610200578063dcbb03b31161011f578063f2fde38b116100b4578063f96abf2e11610084578063f96abf2e14610aac578063fabc1cbc14610abf578063fbf1e2c114610ad2578063fce36c7d14610ae5578063ff9f6cce14610af8575f5ffd5b8063f2fde38b14610a60578063f6efbb5914610a73578063f74e8eac14610a86578063f8cd844814610a99575f5ffd5b8063ea4d3c9b116100ef578063ea4d3c9b146109cc578063ed71e6a2146109f3578063f22cef8514610a20578063f2f07ab414610a33575f5ffd5b8063dcbb03b314610980578063de02e50314610993578063e063f81f146109a6578063e810ce21146109b9575f5ffd5b8063a50a1d9c11610195578063bb7e451f11610165578063bb7e451f146108e6578063bf21a8aa14610905578063c46db6061461092c578063ca8aa7c714610959575f5ffd5b8063a50a1d9c14610866578063aebd8bae14610879578063b3dbb0e0146108a6578063b73c1b92146108b9575f5ffd5b80639cb9a5fa116101d05780639cb9a5fa146108065780639d45c281146108195780639de4b35f14610840578063a0169ddd14610853575f5ffd5b80638cb0ae1b146107bf5780638da5cb5b146107d25780639104c319146107e35780639be3d4e4146107fe575f5ffd5b80634596021c116102f75780635e9d83481161028c5780637ae305831161025c5780637ae30583146107405780637b8f8b0514610753578063863cb9a91461075b578063865c69531461076e578063886f119514610798575f5ffd5b80635e9d8348146106e357806363f6a798146106f65780636d21117e1461070b578063715018a614610738575f5ffd5b806358baaa3e116102c757806358baaa3e1461069d578063595c6a67146106b05780635ac86ab7146106b85780635c975abb146106db575f5ffd5b80634596021c146106265780634657e26a146106395780634b943960146106605780634d18cc3514610686575f5ffd5b80632943e3ff1161036d57806339b70e381161033d57806339b70e38146105c25780633a8c0786146105e95780633ccc861d146106005780633efe1db614610613575f5ffd5b80632943e3ff1461051b5780632b9f64a41461054857806336af41fa1461058857806337838ed01461059b575f5ffd5b80630eb38345116103a85780630eb38345146104ad578063131433b4146104c0578063136439dd146104e7578063149bc872146104fa575f5ffd5b806218572c146103d857806304a0c5021461040f5780630ca298991461044b5780630e9a53cf14610460575b5f5ffd5b6103fa6103e6366004613e6a565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6104367f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610406565b61045e610459366004613ee2565b610b0b565b005b610468610d94565b60405161040691905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61045e6104bb366004613f3e565b610e94565b6104367f000000000000000000000000000000000000000000000000000000000000000081565b61045e6104f5366004613f75565b610f14565b61050d610508366004613f8c565b610f4e565b604051908152602001610406565b6103fa610529366004613fa6565b60d860209081525f928352604080842090915290825290205460ff1681565b610570610556366004613e6a565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610406565b61045e610596366004613fd0565b610fc3565b6104367f000000000000000000000000000000000000000000000000000000000000000081565b6105707f000000000000000000000000000000000000000000000000000000000000000081565b60cb5461043690600160a01b900463ffffffff1681565b61045e61060e36600461401f565b611134565b61045e610621366004614075565b61115b565b61045e61063436600461409f565b611331565b6105707f000000000000000000000000000000000000000000000000000000000000000081565b61067361066e366004613e6a565b611394565b60405161ffff9091168152602001610406565b60cb5461043690600160c01b900463ffffffff1681565b61045e6106ab3660046140f1565b6113ef565b61045e611403565b6103fa6106c636600461410a565b606654600160ff9092169190911b9081161490565b60665461050d565b6103fa6106f136600461412a565b611417565b60cb5461067390600160e01b900461ffff1681565b6103fa610719366004613fa6565b60cf60209081525f928352604080842090915290825290205460ff1681565b61045e6114a2565b61045e61074e366004613ee2565b6114b3565b60ca5461050d565b61045e610769366004613e6a565b611717565b61050d61077c36600461415b565b60cd60209081525f928352604080842090915290825290205481565b6105707f000000000000000000000000000000000000000000000000000000000000000081565b61045e6107cd366004613ee2565b611728565b6033546001600160a01b0316610570565b61057073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61046861198c565b61045e610814366004614187565b611a28565b6104367f000000000000000000000000000000000000000000000000000000000000000081565b61067361084e3660046141be565b611b86565b61045e610861366004613e6a565b611c09565b61045e6108743660046141fa565b611c14565b6103fa610887366004613fa6565b60d260209081525f928352604080842090915290825290205460ff1681565b61045e6108b4366004614213565b611c25565b6103fa6108c7366004613fa6565b60d960209081525f928352604080842090915290825290205460ff1681565b61050d6108f4366004613e6a565b60ce6020525f908152604090205481565b6104367f000000000000000000000000000000000000000000000000000000000000000081565b6103fa61093a366004613fa6565b60d060209081525f928352604080842090915290825290205460ff1681565b6105707f000000000000000000000000000000000000000000000000000000000000000081565b61045e61098e36600461423d565b611d33565b6104686109a1366004613f75565b611e63565b6106736109b436600461415b565b611ef3565b6104366109c7366004613f75565b611f58565b6105707f000000000000000000000000000000000000000000000000000000000000000081565b6103fa610a01366004613fa6565b60d360209081525f928352604080842090915290825290205460ff1681565b61045e610a2e36600461415b565b611fd9565b6103fa610a41366004613fa6565b60d760209081525f928352604080842090915290825290205460ff1681565b61045e610a6e366004613e6a565b612126565b61045e610a81366004614281565b6121a1565b61045e610a943660046142df565b6122d6565b61050d610aa7366004613f8c565b612480565b61045e610aba3660046140f1565b612490565b61045e610acd366004613f75565b6125c1565b60cb54610570906001600160a01b031681565b61045e610af3366004613fd0565b61262e565b61045e610b06366004613fd0565b61275f565b6009610b16816128c0565b610b236020850185613e6a565b610b2c816128eb565b610b34612911565b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610b8090889060040161434a565b602060405180830381865afa158015610b9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bbf9190614358565b610bdc57604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610d825736858583818110610bf957610bf9614373565b9050602002810190610c0b9190614387565b90505f60ce81610c1e60208b018b613e6a565b6001600160a01b031681526020808201929092526040015f90812054925090610c49908a018a613e6a565b8284604051602001610c5d939291906145af565b6040516020818303038152906040528051906020012090505f610c7f8461296a565b9050600160d75f610c9360208e018e613e6a565b6001600160a01b0316815260208082019290925260409081015f9081208682529092529020805460ff1916911515919091179055610cd28360016145f2565b60ce5f610ce260208e018e613e6a565b6001600160a01b03166001600160a01b031681526020019081526020015f208190555081336001600160a01b03167ffff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc7568c8688604051610d4393929190614605565b60405180910390a3610d72333083610d616040890160208a01613e6a565b6001600160a01b0316929190612b55565b505060019092019150610bde9050565b50610d8d6001609755565b5050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610e6c575f60ca610dcf60018461462a565b81548110610ddf57610ddf614373565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610e4e5750806040015163ffffffff164210155b15610e595792915050565b5080610e648161463d565b915050610dbb565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610e9c612bc0565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b610f1c612c1a565b6066548181168114610f415760405163c61dca5d60e01b815260040160405180910390fd5b610f4a82612cbd565b5050565b5f80610f5d6020840184613e6a565b8360200135604051602001610fa69392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b6001610fce816128c0565b335f90815260d1602052604090205460ff16610ffd57604051635c427cd960e01b815260040160405180910390fd5b611005612911565b5f5b82811015611124573684848381811061102257611022614373565b90506020028101906110349190614652565b335f81815260ce6020908152604080832054905194955093919261105e92909185918791016146e4565b60405160208183030381529060405280519060200120905061107f83612cfa565b335f90815260d0602090815260408083208484529091529020805460ff191660019081179091556110b19083906145f2565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482906110f890889061470a565b60405180910390a4611119333060408601803590610d619060208901613e6a565b505050600101611007565b5061112f6001609755565b505050565b600261113f816128c0565b611147612911565b6111518383612de5565b61112f6001609755565b6003611166816128c0565b60cb546001600160a01b0316331461119157604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b9091048116908316116111c457604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff16106111ea576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f9061120990600160a01b900463ffffffff164261471c565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b600261133c816128c0565b611344612911565b5f5b838110156113835761137b85858381811061136357611363614373565b90506020028101906113759190614738565b84612de5565b600101611346565b5061138e6001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff16908201526113e99061306d565b92915050565b6113f7612bc0565b611400816130dd565b50565b61140b612c1a565b6114155f19612cbd565b565b5f61149a8260ca61142b60208301836140f1565b63ffffffff168154811061144157611441614373565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015261314e565b506001919050565b6114aa612bc0565b6114155f6132f1565b600a6114be816128c0565b6114cb6020850185613e6a565b6114d4816128eb565b6114dc612911565b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc7589061152890889060040161434a565b602060405180830381865afa158015611543573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115679190614358565b61158457604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610d8257368585838181106115a1576115a1614373565b90506020028101906115b39190614652565b90505f60ce816115c660208b018b613e6a565b6001600160a01b031681526020808201929092526040015f908120549250906115f1908a018a613e6a565b8284604051602001611605939291906146e4565b60405160208183030381529060405280519060200120905061162683612cfa565b600160d85f61163860208d018d613e6a565b6001600160a01b0316815260208082019290925260409081015f9081208582529092529020805460ff19169115159190911790556116778260016145f2565b60ce5f61168760208d018d613e6a565b6001600160a01b03166001600160a01b031681526020019081526020015f208190555080336001600160a01b03167fb3337dc034abe0f5e3694e1f115f3d6ec9fcee74e7835ea68f6e2d29bbc1b0aa8b85876040516116e89392919061474c565b60405180910390a3611709333060408601803590610d619060208901613e6a565b505050806001019050611586565b61171f612bc0565b61140081613342565b600b611733816128c0565b6117406020850185613e6a565b611749816128eb565b611751612911565b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc7589061179d90889060040161434a565b602060405180830381865afa1580156117b8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117dc9190614358565b6117f957604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610d82573685858381811061181657611816614373565b90506020028101906118289190614652565b90505f60ce8161183b60208b018b613e6a565b6001600160a01b031681526020808201929092526040015f90812054925090611866908a018a613e6a565b828460405160200161187a939291906146e4565b60405160208183030381529060405280519060200120905061189b83612cfa565b600160d95f6118ad60208d018d613e6a565b6001600160a01b0316815260208082019290925260409081015f9081208582529092529020805460ff19169115159190911790556118ec8260016145f2565b60ce5f6118fc60208d018d613e6a565b6001600160a01b03166001600160a01b031681526020019081526020015f208190555080336001600160a01b03167f71836f06ac5c96075d4c5b5699a92b18e9c6d91579a382e9e55a1adf097f64df8b858760405161195d9392919061474c565b60405180910390a361197e333060408601803590610d619060208901613e6a565b5050508060010190506117fb565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546119bf9060019061462a565b815481106119cf576119cf614373565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6005611a33816128c0565b83611a3d816128eb565b611a45612911565b5f5b83811015610d825736858583818110611a6257611a62614373565b9050602002810190611a749190614387565b6001600160a01b0388165f90815260ce6020908152604080832054905193945092611aa5918b9185918791016145af565b6040516020818303038152906040528051906020012090505f611ac78461296a565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff19166001908117909155909150611b059084906145f2565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e090611b589088908a90614771565b60405180910390a4611b76333083610d616040890160208a01613e6a565b505060019092019150611a479050565b6001600160a01b0382165f90815260d660205260408120611c029082611bb9611bb436879003870187614789565b61339d565b815260208082019290925260409081015f208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261306d565b9392505050565b33610f4a8183613400565b611c1c612bc0565b61140081613463565b6007611c30816128c0565b82611c3a816128eb565b60cb545f90611c5690600160a01b900463ffffffff164261471c565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015291925090611caf9061306d565b6001600160a01b0387165f90815260d560205260409020909150611cd49086846134ce565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b6006611d3e816128c0565b83611d48816128eb565b60cb545f90611d6490600160a01b900463ffffffff164261471c565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff1692810192909252919250611dcb9061306d565b6001600160a01b038089165f90815260d460209081526040808320938b16835292905220909150611dfd9086846134ce565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca8281548110611e9957611e99614373565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff169281019290925290611c029061306d565b60ca545f905b63ffffffff811615611fbf578260ca611f786001846147f1565b63ffffffff1681548110611f8e57611f8e614373565b905f5260205f2090600202015f015403611fad57611c026001826147f1565b80611fb78161480d565b915050611f5e565b5060405163504570e360e01b815260040160405180910390fd5b81611fe3816128eb565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015612047573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061206b9190614358565b806120ff575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa1580156120d9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120fd919061482b565b115b61211c5760405163fb494ea160e01b815260040160405180910390fd5b61112f8383613400565b61212e612bc0565b6001600160a01b0381166121985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b611400816132f1565b5f54610100900460ff16158080156121bf57505f54600160ff909116105b806121d85750303b1580156121d857505f5460ff166001145b61223b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161218f565b5f805460ff19166001179055801561225c575f805461ff0019166101001790555b61226585612cbd565b61226e866132f1565b61227784613342565b612280836130dd565b61228982613463565b80156122ce575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60086122e1816128c0565b836122eb816128eb565b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc7589061233790879060040161434a565b602060405180830381865afa158015612352573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123769190614358565b61239357604051631fb1705560e21b815260040160405180910390fd5b60cb545f906123af90600160a01b900463ffffffff164261471c565b6001600160a01b0387165f90815260d660205260408120919250906123e19082611bb9611bb4368b90038b018b614789565b6001600160a01b0388165f90815260d6602052604081209192506124269190612412611bb4368b90038b018b614789565b81526020019081526020015f2086846134ce565b866001600160a01b0316336001600160a01b03167f14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f18885858a60405161246f9493929190614842565b60405180910390a350505050505050565b5f6001610f5d6020840184613e6a565b600361249b816128c0565b60cb546001600160a01b031633146124c657604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff8316106124ee576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff168154811061250857612508614373565b905f5260205f20906002020190508060010160089054906101000a900460ff161561254657604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff16421061257757604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b6125c961359d565b606654801982198116146125f05760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f612638816128c0565b612640612911565b5f5b82811015611124573684848381811061265d5761265d614373565b905060200281019061266f9190614652565b335f81815260ce6020908152604080832054905194955093919261269992909185918791016146e4565b6040516020818303038152906040528051906020012090506126ba83612cfa565b335f90815260cf602090815260408083208484529091529020805460ff191660019081179091556126ec9083906145f2565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e62819061273390889061470a565b60405180910390a4612754333060408601803590610d619060208901613e6a565b505050600101612642565b600461276a816128c0565b335f90815260d1602052604090205460ff1661279957604051635c427cd960e01b815260040160405180910390fd5b6127a1612911565b5f5b8281101561112457368484838181106127be576127be614373565b90506020028101906127d09190614652565b335f81815260ce602090815260408083205490519495509391926127fa92909185918791016146e4565b60405160208183030381529060405280519060200120905061281b83612cfa565b335f90815260d2602090815260408083208484529091529020805460ff1916600190811790915561284d9083906145f2565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b9061289490889061470a565b60405180910390a46128b5333060408601803590610d619060208901613e6a565b5050506001016127a3565b606654600160ff83161b908116036114005760405163840a48d560e01b815260040160405180910390fd5b6128f48161364e565b6114005760405163932d94f760e01b815260040160405180910390fd5b6002609754036129635760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161218f565b6002609755565b5f61299d6129788380614876565b61298860808601606087016140f1565b61299860a08701608088016140f1565b6136f7565b5f6129ab6040840184614876565b9050116129cb5760405163796cc52560e01b815260040160405180910390fd5b426129dc60a08401608085016140f1565b6129ec60808501606086016140f1565b6129f6919061471c565b63ffffffff1610612a1a5760405163150358a160e21b815260040160405180910390fd5b5f80805b612a2b6040860186614876565b9050811015612b1c5736612a426040870187614876565b83818110612a5257612a52614373565b6040029190910191505f9050612a6b6020830183613e6a565b6001600160a01b031603612a9257604051630863a45360e11b815260040160405180910390fd5b612a9f6020820182613e6a565b6001600160a01b0316836001600160a01b031610612ad0576040516310fb47f160e31b815260040160405180910390fd5b5f816020013511612af4576040516310eb483f60e21b815260040160405180910390fd5b612b016020820182613e6a565b9250612b116020820135856145f2565b935050600101612a1e565b506f4b3b4ca85a86c47a098a223fffffffff821115612b4e5760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6040516001600160a01b038085166024830152831660448201526064810182905261138e9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526139f5565b6033546001600160a01b031633146114155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161218f565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015612c7c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ca09190614358565b61141557604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b612d27612d078280614876565b612d1760808501606086016140f1565b61299860a08601608087016140f1565b5f816040013511612d4b576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff81604001351115612d805760405163070b5a6f60e21b815260040160405180910390fd5b612db063ffffffff7f000000000000000000000000000000000000000000000000000000000000000016426145f2565b612dc060808301606084016140f1565b63ffffffff16111561140057604051637ee2b44360e01b815260040160405180910390fd5b5f60ca612df560208501856140f1565b63ffffffff1681548110612e0b57612e0b614373565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff16151560608201529050612e6b838261314e565b5f612e7c6080850160608601613e6a565b6001600160a01b038082165f90815260cc60205260409020549192501680612ea15750805b336001600160a01b03821614612eca57604051635c427cd960e01b815260040160405180910390fd5b5f5b612ed960a08701876148bb565b90508110156122ce5736612ef060e0880188614876565b83818110612f0057612f00614373565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612f3490850185613e6a565b6001600160a01b03166001600160a01b031681526020019081526020015f2054905080826020013511612f7a5760405163aa385e8160e01b815260040160405180910390fd5b5f612f8982602085013561462a565b6001600160a01b0387165f90815260cd60209081526040822092935085018035929190612fb69087613e6a565b6001600160a01b031681526020808201929092526040015f2091909155612ff79089908390612fe790870187613e6a565b6001600160a01b03169190613ac8565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061303b6020890189613e6a565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050600101612ecc565b5f816040015163ffffffff165f148061309f5750815161ffff90811614801561309f5750816040015163ffffffff1642105b156130b757505060cb54600160e01b900461ffff1690565b816040015163ffffffff164210156130d05781516113e9565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80606001511561317157604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff1642101561319c57604051631437a2bb60e31b815260040160405180910390fd5b6131a960c08301836148bb565b90506131b860a08401846148bb565b9050146131d8576040516343714afd60e01b815260040160405180910390fd5b6131e560e0830183614876565b90506131f460c08401846148bb565b905014613214576040516343714afd60e01b815260040160405180910390fd5b80516132409061322a60408501602086016140f1565b6132376040860186614900565b86606001613af8565b5f5b61324f60a08401846148bb565b905081101561112f576132e9608084013561326d60a08601866148bb565b8481811061327d5761327d614373565b905060200201602081019061329291906140f1565b61329f60c08701876148bb565b858181106132af576132af614373565b90506020028101906132c19190614900565b6132ce60e0890189614876565b878181106132de576132de614373565b905060400201613b9c565b600101613242565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b5f815f0151826020015163ffffffff166040516020016133e892919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526113e990614942565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff831611156134f55760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff16421161352357604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f0361354a57825461ffff191661ffff178355613561565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061361d9190614965565b6001600160a01b0316336001600160a01b0316146114155760405163794821ff60e01b815260040160405180910390fd5b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb890608401602060405180830381865afa1580156136d3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e99190614358565b826137155760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff16111561376257604051630dd0b9f560e21b815260040160405180910390fd5b61378c7f000000000000000000000000000000000000000000000000000000000000000082614994565b63ffffffff16156137b05760405163ee66470560e01b815260040160405180910390fd5b5f8163ffffffff16116137d65760405163cb3f434d60e01b815260040160405180910390fd5b6138007f000000000000000000000000000000000000000000000000000000000000000083614994565b63ffffffff161561382457604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff164261385d919061462a565b1115801561389757508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b6138b45760405163041aa75760e11b815260040160405180910390fd5b5f805b848110156122ce575f8686838181106138d2576138d2614373565b6138e89260206040909202019081019150613e6a565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613951573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139759190614358565b8061399c57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6139b957604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106139eb5760405163dfad9ca160e01b815260040160405180910390fd5b91506001016138b7565b5f613a49826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613bda9092919063ffffffff16565b905080515f1480613a69575080806020019051810190613a699190614358565b61112f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161218f565b6040516001600160a01b03831660248201526044810182905261112f90849063a9059cbb60e01b90606401612b89565b613b036020836149bb565b6001901b8463ffffffff1610613b2b5760405162c6c39d60e71b815260040160405180910390fd5b5f613b3582610f4e565b9050613b7f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff8916613bf0565b6122ce576040516369ca16c960e01b815260040160405180910390fd5b613ba76020836149bb565b6001901b8463ffffffff1610613bd05760405163054ff4df60e51b815260040160405180910390fd5b5f613b3582612480565b6060613be884845f85613c25565b949350505050565b5f83613c0f576040516329e7276760e11b815260040160405180910390fd5b83613c1b868585613cfc565b1495945050505050565b606082471015613c865760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161218f565b5f5f866001600160a01b03168587604051613ca191906149ce565b5f6040518083038185875af1925050503d805f8114613cdb576040519150601f19603f3d011682016040523d82523d5f602084013e613ce0565b606091505b5091509150613cf187838387613db9565b979650505050505050565b5f83515f03613d0c575081611c02565b60208451613d1a91906149e4565b15613d38576040516313717da960e21b815260040160405180910390fd5b8260205b85518111613d9957613d4f6002856149e4565b5f03613d7057815f528086015160205260405f209150600284049350613d87565b808601515f528160205260405f2091506002840493505b613d926020826145f2565b9050613d3c565b508215613be8576040516363df817160e01b815260040160405180910390fd5b60608315613e275782515f03613e20576001600160a01b0385163b613e205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161218f565b5081613be8565b613be88383815115613e3c5781518083602001fd5b8060405162461bcd60e51b815260040161218f91906149f7565b6001600160a01b0381168114611400575f5ffd5b5f60208284031215613e7a575f5ffd5b8135611c0281613e56565b5f60408284031215613e95575f5ffd5b50919050565b5f5f83601f840112613eab575f5ffd5b5081356001600160401b03811115613ec1575f5ffd5b6020830191508360208260051b8501011115613edb575f5ffd5b9250929050565b5f5f5f60608486031215613ef4575f5ffd5b613efe8585613e85565b925060408401356001600160401b03811115613f18575f5ffd5b613f2486828701613e9b565b9497909650939450505050565b8015158114611400575f5ffd5b5f5f60408385031215613f4f575f5ffd5b8235613f5a81613e56565b91506020830135613f6a81613f31565b809150509250929050565b5f60208284031215613f85575f5ffd5b5035919050565b5f60408284031215613f9c575f5ffd5b611c028383613e85565b5f5f60408385031215613fb7575f5ffd5b8235613fc281613e56565b946020939093013593505050565b5f5f60208385031215613fe1575f5ffd5b82356001600160401b03811115613ff6575f5ffd5b61400285828601613e9b565b90969095509350505050565b5f6101008284031215613e95575f5ffd5b5f5f60408385031215614030575f5ffd5b82356001600160401b03811115614045575f5ffd5b6140518582860161400e565b9250506020830135613f6a81613e56565b803563ffffffff811681146130d8575f5ffd5b5f5f60408385031215614086575f5ffd5b8235915061409660208401614062565b90509250929050565b5f5f5f604084860312156140b1575f5ffd5b83356001600160401b038111156140c6575f5ffd5b6140d286828701613e9b565b90945092505060208401356140e681613e56565b809150509250925092565b5f60208284031215614101575f5ffd5b611c0282614062565b5f6020828403121561411a575f5ffd5b813560ff81168114611c02575f5ffd5b5f6020828403121561413a575f5ffd5b81356001600160401b0381111561414f575f5ffd5b613be88482850161400e565b5f5f6040838503121561416c575f5ffd5b823561417781613e56565b91506020830135613f6a81613e56565b5f5f5f60408486031215614199575f5ffd5b83356141a481613e56565b925060208401356001600160401b03811115613f18575f5ffd5b5f5f606083850312156141cf575f5ffd5b82356141da81613e56565b91506140968460208501613e85565b803561ffff811681146130d8575f5ffd5b5f6020828403121561420a575f5ffd5b611c02826141e9565b5f5f60408385031215614224575f5ffd5b823561422f81613e56565b9150614096602084016141e9565b5f5f5f6060848603121561424f575f5ffd5b833561425a81613e56565b9250602084013561426a81613e56565b9150614278604085016141e9565b90509250925092565b5f5f5f5f5f60a08688031215614295575f5ffd5b85356142a081613e56565b94506020860135935060408601356142b781613e56565b92506142c560608701614062565b91506142d3608087016141e9565b90509295509295909350565b5f5f5f608084860312156142f1575f5ffd5b83356142fc81613e56565b925061430b8560208601613e85565b9150614278606085016141e9565b803561432481613e56565b6001600160a01b0316825263ffffffff61434060208301614062565b1660208301525050565b604081016113e98284614319565b5f60208284031215614368575f5ffd5b8151611c0281613f31565b634e487b7160e01b5f52603260045260245ffd5b5f823560be1983360301811261439b575f5ffd5b9190910192915050565b5f5f8335601e198436030181126143ba575f5ffd5b83016020810192503590506001600160401b038111156143d8575f5ffd5b8060061b3603821315613edb575f5ffd5b8183526020830192505f815f5b8481101561444c57813561440981613e56565b6001600160a01b0316865260208201356bffffffffffffffffffffffff8116808214614433575f5ffd5b60208801525060409586019591909101906001016143f6565b5093949350505050565b5f5f8335601e1984360301811261446b575f5ffd5b83016020810192503590506001600160401b03811115614489575f5ffd5b803603821315613edb575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f6144ca82836143a5565b60c085526144dc60c0860182846143e9565b91505060208301356144ed81613e56565b6001600160a01b0316602085015261450860408401846143a5565b858303604087015280835290915f91906020015b8183101561455757833561452f81613e56565b6001600160a01b0316815260208481013590820152604093840193600193909301920161451c565b61456360608701614062565b63ffffffff81166060890152935061457d60808701614062565b63ffffffff81166080890152935061459860a0870187614456565b9450925086810360a0880152613cf1818585614497565b60018060a01b0384168152826020820152606060408201525f6145d560608301846144bf565b95945050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156113e9576113e96145de565b61460f8185614319565b826040820152608060608201525f6145d560808301846144bf565b818103818111156113e9576113e96145de565b5f8161464b5761464b6145de565b505f190190565b5f8235609e1983360301811261439b575f5ffd5b5f61467182836143a5565b60a0855261468360a0860182846143e9565b915050602083013561469481613e56565b6001600160a01b031660208501526040838101359085015263ffffffff6146bd60608501614062565b16606085015263ffffffff6146d460808501614062565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f6145d56060830184614666565b602081525f611c026020830184614666565b63ffffffff81811683821601908111156113e9576113e96145de565b5f823560fe1983360301811261439b575f5ffd5b6147568185614319565b826040820152608060608201525f6145d56080830184614666565b828152604060208201525f613be860408301846144bf565b5f604082840312801561479a575f5ffd5b50604080519081016001600160401b03811182821017156147c957634e487b7160e01b5f52604160045260245ffd5b60405282356147d781613e56565b81526147e560208401614062565b60208201529392505050565b63ffffffff82811682821603908111156113e9576113e96145de565b5f63ffffffff821680614822576148226145de565b5f190192915050565b5f6020828403121561483b575f5ffd5b5051919050565b60a081016148508287614319565b63ffffffff94909416604082015261ffff92831660608201529116608090910152919050565b5f5f8335601e1984360301811261488b575f5ffd5b8301803591506001600160401b038211156148a4575f5ffd5b6020019150600681901b3603821315613edb575f5ffd5b5f5f8335601e198436030181126148d0575f5ffd5b8301803591506001600160401b038211156148e9575f5ffd5b6020019150600581901b3603821315613edb575f5ffd5b5f5f8335601e19843603018112614915575f5ffd5b8301803591506001600160401b0382111561492e575f5ffd5b602001915036819003821315613edb575f5ffd5b80516020808301519190811015613e95575f1960209190910360031b1b16919050565b5f60208284031215614975575f5ffd5b8151611c0281613e56565b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff8316806149a9576149a9614980565b8063ffffffff84160691505092915050565b5f826149c9576149c9614980565b500490565b5f82518060208501845e5f920191825250919050565b5f826149f2576149f2614980565b500690565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea264697066735822122028d6e0924d97e27beadd0d1be6d611cfd5cc6240b3bc4abe0f3f6f4cea81d5c964736f6c634300081e0033",
+ 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\":\"emissionsController\",\"type\":\"address\",\"internalType\":\"contractIEmissionsController\"},{\"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\":\"createEigenDARewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"createTotalStakeRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"createUniqueStakeRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"emissionsController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEmissionsController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feeRecipient\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"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\"},{\"name\":\"_feeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"isOptedInForProtocolFee\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isOptedIn\",\"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\":\"isTotalStakeRewardsSubmissionHash\",\"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\":\"isUniqueStakeRewardsSubmissionHash\",\"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\":\"setFeeRecipient\",\"inputs\":[{\"name\":\"_feeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"setOptInForProtocolFee\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"optInForProtocolFee\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"FeeRecipientSet\",\"inputs\":[{\"name\":\"oldFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":\"OptInForProtocolFeeSet\",\"inputs\":[{\"name\":\"submitter\",\"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\":\"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\":\"TotalStakeRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rewardsSubmissionHash\",\"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\":\"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\":\"UniqueStakeRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rewardsSubmissionHash\",\"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\":\"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\":\"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\":\"DurationIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyRoot\",\"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\":\"InvalidIndex\",\"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: "0x6101e0604052348015610010575f5ffd5b506040516157b53803806157b583398101604081905261002f91610270565b60a0810151815160208301516040840151606085015160c086015160e08701516101008801516101208901516101408a015160808b01516001600160a01b03811661008d576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03166080526100a3858261034d565b63ffffffff16156100c757604051630e06bd3160e01b815260040160405180910390fd5b6100d4620151808661034d565b63ffffffff16156100f85760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0398891660a05296881660c05294871660e0529286166101005263ffffffff918216610120528116610140529081166101605290811661018052166101a052166101c05261014b610151565b50610380565b5f54610100900460ff16156101bc5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461020b575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60405161016081016001600160401b038111828210171561023c57634e487b7160e01b5f52604160045260245ffd5b60405290565b80516001600160a01b0381168114610258575f5ffd5b919050565b805163ffffffff81168114610258575f5ffd5b5f610160828403128015610282575f5ffd5b5061028b61020d565b61029483610242565b81526102a260208401610242565b60208201526102b360408401610242565b60408201526102c460608401610242565b60608201526102d560808401610242565b60808201526102e660a08401610242565b60a08201526102f760c0840161025d565b60c082015261030860e0840161025d565b60e082015261031a610100840161025d565b61010082015261032d610120840161025d565b610120820152610340610140840161025d565b6101408201529392505050565b5f63ffffffff83168061036e57634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516153456104705f395f81816106800152613b5801525f81816105070152613d3e01525f81816104560152612f6401525f81816105e20152613cfc01525f81816109e10152613be601525f81816108c001528181613c360152613caa01525f818161076501526115b301525f8181610a3501528181610c2201528181611646015281816118ef0152818161238301526124b901525f81816106090152613dd001525f8181610abb01526122f301525f818161082c01528181612e200152613a6b01526153455ff3fe608060405234801561000f575f5ffd5b5060043610610416575f3560e01c80638cb0ae1b11610221578063ca8aa7c71161012a578063f2f07ab4116100b4578063f96abf2e11610084578063f96abf2e14610b83578063fabc1cbc14610b96578063fbf1e2c114610ba9578063fce36c7d14610bbc578063ff9f6cce14610bcf575f5ffd5b8063f2f07ab414610b1d578063f2fde38b14610b4a578063f74e8eac14610b5d578063f8cd844814610b70575f5ffd5b8063e74b981b116100fa578063e74b981b14610a90578063e810ce2114610aa3578063ea4d3c9b14610ab6578063ed71e6a214610add578063f22cef8514610b0a575f5ffd5b8063ca8aa7c714610a30578063dcbb03b314610a57578063de02e50314610a6a578063e063f81f14610a7d575f5ffd5b8063a50a1d9c116101ab578063b3dbb0e01161017b578063b3dbb0e01461097d578063b73c1b9214610990578063bb7e451f146109bd578063bf21a8aa146109dc578063c46db60614610a03575f5ffd5b8063a50a1d9c14610908578063a89c29301461091b578063acad72991461093d578063aebd8bae14610950575f5ffd5b80639be3d4e4116101f15780639be3d4e4146108a05780639cb9a5fa146108a85780639d45c281146108bb5780639de4b35f146108e2578063a0169ddd146108f5575f5ffd5b80638cb0ae1b1461084e5780638d424f49146108615780638da5cb5b146108745780639104c31914610885575f5ffd5b8063469048401161032357806367eab2be116102ad5780637ae305831161027d5780637ae30583146107cf5780637b8f8b05146107e2578063863cb9a9146107ea578063865c6953146107fd578063886f119514610827575f5ffd5b806367eab2be146107605780636d21117e14610787578063715018a6146107b45780637282a352146107bc575f5ffd5b8063595c6a67116102f3578063595c6a67146107055780635ac86ab71461070d5780635c975abb146107305780635e9d83481461073857806363f6a7981461074b575f5ffd5b806346904840146106a25780634b943960146106b55780634d18cc35146106db57806358baaa3e146106f2575f5ffd5b80632b9f64a4116103a45780633a8c0786116103745780633a8c07861461062b5780633ccc861d146106425780633efe1db6146106555780634596021c146106685780634657e26a1461067b575f5ffd5b80632b9f64a41461058a57806336af41fa146105ca57806337838ed0146105dd57806339b70e3814610604575f5ffd5b80630eb38345116103ea5780630eb38345146104ef578063131433b414610502578063136439dd14610529578063149bc8721461053c5780632943e3ff1461055d575f5ffd5b806218572c1461041a57806304a0c502146104515780630ca298991461048d5780630e9a53cf146104a2575b5f5ffd5b61043c610428366004614330565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6104787f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610448565b6104a061049b3660046143a8565b610be2565b005b6104aa610e5d565b60405161044891905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b6104a06104fd366004614404565b610f5d565b6104787f000000000000000000000000000000000000000000000000000000000000000081565b6104a061053736600461443b565b610fdd565b61054f61054a366004614452565b611017565b604051908152602001610448565b61043c61056b36600461446c565b60d860209081525f928352604080842090915290825290205460ff1681565b6105b2610598366004614330565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610448565b6104a06105d8366004614496565b61108c565b6104787f000000000000000000000000000000000000000000000000000000000000000081565b6105b27f000000000000000000000000000000000000000000000000000000000000000081565b60cb5461047890600160a01b900463ffffffff1681565b6104a06106503660046144e5565b611217565b6104a061066336600461453b565b61123e565b6104a0610676366004614565565b611414565b6105b27f000000000000000000000000000000000000000000000000000000000000000081565b60db546105b2906001600160a01b031681565b6106c86106c3366004614330565b611477565b60405161ffff9091168152602001610448565b60cb5461047890600160c01b900463ffffffff1681565b6104a06107003660046145b7565b6114d2565b6104a06114e6565b61043c61071b3660046145d0565b606654600160ff9092169190911b9081161490565b60665461054f565b61043c6107463660046145f0565b6114fa565b60cb546106c890600160e01b900461ffff1681565b6105b27f000000000000000000000000000000000000000000000000000000000000000081565b61043c61079536600461446c565b60cf60209081525f928352604080842090915290825290205460ff1681565b6104a0611585565b6104a06107ca366004614621565b611596565b6104a06107dd3660046143a8565b611606565b60ca5461054f565b6104a06107f8366004614330565b61189e565b61054f61080b366004614663565b60cd60209081525f928352604080842090915290825290205481565b6105b27f000000000000000000000000000000000000000000000000000000000000000081565b6104a061085c3660046143a8565b6118af565b6104a061086f366004614404565b611b47565b6033546001600160a01b03166105b2565b6105b273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6104aa611b5b565b6104a06108b6366004614621565b611bf7565b6104787f000000000000000000000000000000000000000000000000000000000000000081565b6106c86108f036600461468f565b611d4c565b6104a0610903366004614330565b611dcf565b6104a06109163660046146cb565b611dda565b61043c610929366004614330565b60da6020525f908152604090205460ff1681565b6104a061094b3660046146e4565b611deb565b61043c61095e36600461446c565b60d260209081525f928352604080842090915290825290205460ff1681565b6104a061098b366004614755565b611f05565b61043c61099e36600461446c565b60d960209081525f928352604080842090915290825290205460ff1681565b61054f6109cb366004614330565b60ce6020525f908152604090205481565b6104787f000000000000000000000000000000000000000000000000000000000000000081565b61043c610a1136600461446c565b60d060209081525f928352604080842090915290825290205460ff1681565b6105b27f000000000000000000000000000000000000000000000000000000000000000081565b6104a0610a6536600461477f565b612013565b6104aa610a7836600461443b565b612143565b6106c8610a8b366004614663565b6121d3565b6104a0610a9e366004614330565b612238565b610478610ab136600461443b565b612249565b6105b27f000000000000000000000000000000000000000000000000000000000000000081565b61043c610aeb36600461446c565b60d360209081525f928352604080842090915290825290205460ff1681565b6104a0610b18366004614663565b6122ca565b61043c610b2b36600461446c565b60d760209081525f928352604080842090915290825290205460ff1681565b6104a0610b58366004614330565b612417565b6104a0610b6b3660046147c3565b61248d565b61054f610b7e366004614452565b612637565b6104a0610b913660046145b7565b612647565b6104a0610ba436600461443b565b612778565b60cb546105b2906001600160a01b031681565b6104a0610bca366004614496565b6127e5565b6104a0610bdd366004614496565b612802565b6009610bed81612967565b610bfa6020850185614330565b610c0381612992565b610c0b6129b8565b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610c5790889060040161482e565b602060405180830381865afa158015610c72573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c96919061483c565b610cb357604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610e4b575f858583818110610cd057610cd0614857565b9050602002810190610ce2919061486b565b610ceb90614ae7565b90505f60ce81610cfe60208b018b614330565b6001600160a01b03166001600160a01b031681526020019081526020015f205490505f5f5f610d3f8b5f016020810190610d389190614330565b8587612a11565b60208801519295509093509150610d61906001600160a01b0316333085612d14565b610d7085602001518383612d7f565b600160d75f610d8260208f018f614330565b6001600160a01b0316815260208082019290925260409081015f9081208782529092529020805460ff1916911515919091179055610dc1846001614bc4565b60ce5f610dd160208f018f614330565b6001600160a01b03166001600160a01b031681526020019081526020015f208190555082336001600160a01b03167ffff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc7568d8789604051610e3293929190614d32565b60405180910390a3505060019093019250610cb5915050565b50610e566001609755565b5050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610f35575f60ca610e98600184614d60565b81548110610ea857610ea8614857565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610f175750806040015163ffffffff164210155b15610f225792915050565b5080610f2d81614d73565b915050610e84565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610f65612db1565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b610fe5612e0b565b606654818116811461100a5760405163c61dca5d60e01b815260040160405180910390fd5b61101382612eae565b5050565b5f806110266020840184614330565b836020013560405160200161106f9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b600161109781612967565b335f90815260d1602052604090205460ff166110c657604051635c427cd960e01b815260040160405180910390fd5b6110ce6129b8565b5f5b8281101561120757368484838181106110eb576110eb614857565b90506020028101906110fd9190614d88565b335f81815260ce602090815260408083205490519495509391926111279290918591879101614ea4565b6040516020818303038152906040528051906020012090506111518361114c90614eca565b612eeb565b335f90815260d0602090815260408083208484529091529020805460ff19166001908117909155611183908390614bc4565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482906111ca908890614f68565b60405180910390a46111fc3330604086018035906111eb9060208901614330565b6001600160a01b0316929190612d14565b5050506001016110d0565b506112126001609755565b505050565b600261122281612967565b61122a6129b8565b6112348383612fb4565b6112126001609755565b600361124981612967565b60cb546001600160a01b0316331461127457604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b9091048116908316116112a757604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff16106112cd576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f906112ec90600160a01b900463ffffffff1642614f7a565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b600261141f81612967565b6114276129b8565b5f5b838110156114665761145e85858381811061144657611446614857565b90506020028101906114589190614f96565b84612fb4565b600101611429565b506114716001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff16908201526114cc90613244565b92915050565b6114da612db1565b6114e3816132b4565b50565b6114ee612e0b565b6114f85f19612eae565b565b5f61157d8260ca61150e60208301836145b7565b63ffffffff168154811061152457611524614857565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152613325565b506001919050565b61158d612db1565b6114f85f6134c8565b5f6115a081612967565b6115a86129b8565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146115f157604051635c427cd960e01b815260040160405180910390fd5b6115fc848484613519565b6114716001609755565b600a61161181612967565b61161e6020850185614330565b61162781612992565b61162f6129b8565b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc7589061167b90889060040161482e565b602060405180830381865afa158015611696573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ba919061483c565b6116d757604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610e4b575f8585838181106116f4576116f4614857565b90506020028101906117069190614d88565b61170f90614eca565b905061171a81612eeb565b6117423330836040015184602001516001600160a01b0316612d14909392919063ffffffff16565b6117548160200151826040015161367e565b60408201525f60ce8161176a60208b018b614330565b6001600160a01b031681526020808201929092526040015f90812054925090611795908a018a614330565b82846040516020016117a993929190615006565b604051602081830303815290604052805190602001209050600160d85f8b5f0160208101906117d89190614330565b6001600160a01b0316815260208082019290925260409081015f9081208582529092529020805460ff1916911515919091179055611817826001614bc4565b60ce5f61182760208d018d614330565b6001600160a01b03166001600160a01b031681526020019081526020015f208190555080336001600160a01b03167fb3337dc034abe0f5e3694e1f115f3d6ec9fcee74e7835ea68f6e2d29bbc1b0aa8b85876040516118889392919061502c565b60405180910390a35050508060010190506116d9565b6118a6612db1565b6114e3816136ed565b600b6118ba81612967565b6118c76020850185614330565b6118d081612992565b6118d86129b8565b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc7589061192490889060040161482e565b602060405180830381865afa15801561193f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611963919061483c565b61198057604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610e4b575f85858381811061199d5761199d614857565b90506020028101906119af9190614d88565b6119b890614eca565b90506119c381612eeb565b6119eb3330836040015184602001516001600160a01b0316612d14909392919063ffffffff16565b6119fd8160200151826040015161367e565b60408201525f60ce81611a1360208b018b614330565b6001600160a01b031681526020808201929092526040015f90812054925090611a3e908a018a614330565b8284604051602001611a5293929190615006565b604051602081830303815290604052805190602001209050600160d95f8b5f016020810190611a819190614330565b6001600160a01b0316815260208082019290925260409081015f9081208582529092529020805460ff1916911515919091179055611ac0826001614bc4565b60ce5f611ad060208d018d614330565b6001600160a01b03166001600160a01b031681526020019081526020015f208190555080336001600160a01b03167f71836f06ac5c96075d4c5b5699a92b18e9c6d91579a382e9e55a1adf097f64df8b8587604051611b319392919061502c565b60405180910390a3505050806001019050611982565b81611b5181612992565b6112128383613748565b604080516080810182525f80825260208201819052918101829052606081019190915260ca8054611b8e90600190614d60565b81548110611b9e57611b9e614857565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b6005611c0281612967565b83611c0c81612992565b611c146129b8565b5f5b83811015610e4b575f858583818110611c3157611c31614857565b9050602002810190611c43919061486b565b611c4c90614ae7565b6001600160a01b0388165f90815260ce60205260408120549192508080611c748b8587612a11565b60208801519295509093509150611c96906001600160a01b0316333085612d14565b611ca585602001518383612d7f565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff19166001908117909155611ce0908590614bc4565b6001600160a01b038c165f81815260ce60205260409081902092909255905184919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e090611d339089908b90615051565b60405180910390a4505060019093019250611c16915050565b6001600160a01b0382165f90815260d660205260408120611dc89082611d7f611d7a36879003870187615069565b6137c0565b815260208082019290925260409081015f208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152613244565b9392505050565b336110138183613823565b611de2612db1565b6114e381613886565b5f54600290610100900460ff16158015611e0b57505f5460ff8083169116105b611e735760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461ffff191660ff831617610100179055611e8f86612eae565b611e98876134c8565b611ea1856136ed565b611eaa846132b4565b611eb383613886565b611ebc82613918565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b6007611f1081612967565b82611f1a81612992565b60cb545f90611f3690600160a01b900463ffffffff1642614f7a565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015291925090611f8f90613244565b6001600160a01b0387165f90815260d560205260409020909150611fb490868461399a565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b600661201e81612967565b8361202881612992565b60cb545f9061204490600160a01b900463ffffffff1642614f7a565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff16928101929092529192506120ab90613244565b6001600160a01b038089165f90815260d460209081526040808320938b168352929052209091506120dd90868461399a565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca828154811061217957612179614857565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff169281019290925290611dc890613244565b612240612db1565b6114e381613918565b60ca545f905b63ffffffff8116156122b0578260ca6122696001846150a8565b63ffffffff168154811061227f5761227f614857565b905f5260205f2090600202015f01540361229e57611dc86001826150a8565b806122a8816150c4565b91505061224f565b5060405163504570e360e01b815260040160405180910390fd5b816122d481612992565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015612338573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061235c919061483c565b806123f0575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa1580156123ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123ee91906150e2565b115b61240d5760405163fb494ea160e01b815260040160405180910390fd5b6112128383613823565b61241f612db1565b6001600160a01b0381166124845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611e6a565b6114e3816134c8565b600861249881612967565b836124a281612992565b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc758906124ee90879060040161482e565b602060405180830381865afa158015612509573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061252d919061483c565b61254a57604051631fb1705560e21b815260040160405180910390fd5b60cb545f9061256690600160a01b900463ffffffff1642614f7a565b6001600160a01b0387165f90815260d660205260408120919250906125989082611d7f611d7a368b90038b018b615069565b6001600160a01b0388165f90815260d6602052604081209192506125dd91906125c9611d7a368b90038b018b615069565b81526020019081526020015f20868461399a565b866001600160a01b0316336001600160a01b03167f14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f18885858a60405161262694939291906150f9565b60405180910390a350505050505050565b5f60016110266020840184614330565b600361265281612967565b60cb546001600160a01b0316331461267d57604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff8316106126a5576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff16815481106126bf576126bf614857565b905f5260205f20906002020190508060010160089054906101000a900460ff16156126fd57604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff16421061272e57604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b612780613a69565b606654801982198116146127a75760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6127ef81612967565b6127f76129b8565b611234338484613519565b600461280d81612967565b335f90815260d1602052604090205460ff1661283c57604051635c427cd960e01b815260040160405180910390fd5b6128446129b8565b5f5b82811015611207573684848381811061286157612861614857565b90506020028101906128739190614d88565b335f81815260ce6020908152604080832054905194955093919261289d9290918591879101614ea4565b6040516020818303038152906040528051906020012090506128c28361114c90614eca565b335f90815260d2602090815260408083208484529091529020805460ff191660019081179091556128f4908390614bc4565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b9061293b908890614f68565b60405180910390a461295c3330604086018035906111eb9060208901614330565b505050600101612846565b606654600160ff83161b908116036114e35760405163840a48d560e01b815260040160405180910390fd5b61299b81613b1a565b6114e35760405163932d94f760e01b815260040160405180910390fd5b600260975403612a0a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611e6a565b6002609755565b5f5f5f612a2a845f015185606001518660800151613bc3565b5f84604001515111612a4f5760405163796cc52560e01b815260040160405180910390fd5b4284608001518560600151612a649190614f7a565b63ffffffff1610612a885760405163150358a160e21b815260040160405180910390fd5b335f90815260da602052604080822054908601515160ff9091169190815b81811015612ca9575f6001600160a01b031688604001518281518110612ace57612ace614857565b60200260200101515f01516001600160a01b031603612b0057604051630863a45360e11b815260040160405180910390fd5b87604001518181518110612b1657612b16614857565b60200260200101515f01516001600160a01b0316836001600160a01b031610612b52576040516310fb47f160e31b815260040160405180910390fd5b5f88604001518281518110612b6957612b69614857565b60200260200101516020015111612b93576040516310eb483f60e21b815260040160405180910390fd5b87604001518181518110612ba957612ba9614857565b60200260200101516020015186612bc09190614bc4565b95505f61271061ffff166107d061ffff168a604001518481518110612be757612be7614857565b602002602001015160200151612bfd919061512d565b612c079190615158565b9050848015612c1557508015155b15612c4d578089604001518381518110612c3157612c31614857565b6020026020010151602001818151612c499190614d60565b9052505b88604001518281518110612c6357612c63614857565b60200260200101516020015186612c7a9190614bc4565b955088604001518281518110612c9257612c92614857565b602090810291909101015151935050600101612aa6565b506f4b3b4ca85a86c47a098a223fffffffff851115612cdb5760405163070b5a6f60e21b815260040160405180910390fd5b888888604051602001612cf09392919061516b565b60405160208183030381529060405280519060200120955050505093509350939050565b6040516001600160a01b03808516602483015283166044820152606481018290526114719085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613ebb565b8181146112125760db54611212906001600160a01b0316612da08385614d60565b6001600160a01b0386169190613f8e565b6033546001600160a01b031633146114f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611e6a565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015612e6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e91919061483c565b6114f857604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b612f01815f015182606001518360800151613bc3565b5f816040015111612f25576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff81604001511115612f5a5760405163070b5a6f60e21b815260040160405180910390fd5b612f8a63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642614bc4565b816060015163ffffffff1611156114e357604051637ee2b44360e01b815260040160405180910390fd5b5f60ca612fc460208501856145b7565b63ffffffff1681548110612fda57612fda614857565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061303a8382613325565b5f61304b6080850160608601614330565b6001600160a01b038082165f90815260cc602052604090205491925016806130705750805b336001600160a01b0382161461309957604051635c427cd960e01b815260040160405180910390fd5b5f5b6130a860a0870187615191565b905081101561323c57366130bf60e08801886151d6565b838181106130cf576130cf614857565b6001600160a01b0387165f90815260cd60209081526040808320930294909401945092909150829061310390850185614330565b6001600160a01b03166001600160a01b031681526020019081526020015f20549050808260200135116131495760405163aa385e8160e01b815260040160405180910390fd5b5f613158826020850135614d60565b6001600160a01b0387165f90815260cd602090815260408220929350850180359291906131859087614330565b6001600160a01b031681526020808201929092526040015f20919091556131c690899083906131b690870187614330565b6001600160a01b03169190613f8e565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061320a6020890189614330565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a450505060010161309b565b505050505050565b5f816040015163ffffffff165f14806132765750815161ffff9081161480156132765750816040015163ffffffff1642105b1561328e57505060cb54600160e01b900461ffff1690565b816040015163ffffffff164210156132a75781516114cc565b506020015190565b919050565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80606001511561334857604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff1642101561337357604051631437a2bb60e31b815260040160405180910390fd5b61338060c0830183615191565b905061338f60a0840184615191565b9050146133af576040516343714afd60e01b815260040160405180910390fd5b6133bc60e08301836151d6565b90506133cb60c0840184615191565b9050146133eb576040516343714afd60e01b815260040160405180910390fd5b80516134179061340160408501602086016145b7565b61340e604086018661521b565b86606001613fbe565b5f5b61342660a0840184615191565b9050811015611212576134c0608084013561344460a0860186615191565b8481811061345457613454614857565b905060200201602081019061346991906145b7565b61347660c0870187615191565b8581811061348657613486614857565b9050602002810190613498919061521b565b6134a560e08901896151d6565b878181106134b5576134b5614857565b905060400201614062565b600101613419565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f5b81811015611471575f83838381811061353657613536614857565b90506020028101906135489190614d88565b61355190614eca565b905061355c81612eeb565b6135843330836040015184602001516001600160a01b0316612d14909392919063ffffffff16565b6135968160200151826040015161367e565b6040808301919091526001600160a01b0386165f90815260ce60209081528282205492516135ca9189918591879101615006565b60408051601f1981840301815291815281516020928301206001600160a01b038a165f90815260cf84528281208282529093529120805460ff1916600190811790915590915061361b908390614bc4565b6001600160a01b0388165f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e62819061366b90889061525d565b60405180910390a450505060010161351b565b5f8061271061368f6107d08561512d565b6136999190615158565b335f90815260da602052604090205490915060ff16156136e55780156136e55760db546136d3906001600160a01b03868116911683613f8e565b6136dd8184614d60565b9150506114cc565b509092915050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382165f81815260da602052604080822054905160ff9091169284151592841515927fbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd29190a4506001600160a01b03919091165f90815260da60205260409020805460ff1916911515919091179055565b5f815f0151826020015163ffffffff1660405160200161380b92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526114cc9061526f565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b61271061ffff821611156138ad5760405163891c63df60e01b815260040160405180910390fd5b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6001600160a01b03811661393f57604051630863a45360e11b815260040160405180910390fd5b60db546040516001600160a01b038084169216907f15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721905f90a360db80546001600160a01b0319166001600160a01b0392909216919091179055565b61271061ffff831611156139c15760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff1642116139ef57604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f03613a1657825461ffff191661ffff178355613a2d565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ac5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ae99190615292565b6001600160a01b0316336001600160a01b0316146114f85760405163794821ff60e01b815260040160405180910390fd5b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb890608401602060405180830381865afa158015613b9f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114cc919061483c565b5f835111613be45760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115613c3157604051630dd0b9f560e21b815260040160405180910390fd5b613c5b7f0000000000000000000000000000000000000000000000000000000000000000826152ad565b63ffffffff1615613c7f5760405163ee66470560e01b815260040160405180910390fd5b5f8163ffffffff1611613ca55760405163cb3f434d60e01b815260040160405180910390fd5b613ccf7f0000000000000000000000000000000000000000000000000000000000000000836152ad565b63ffffffff1615613cf357604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642613d2c9190614d60565b11158015613d6657508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b613d835760405163041aa75760e11b815260040160405180910390fd5b5f805b8451811015610e56575f858281518110613da257613da2614857565b60209081029190910101515160405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613e17573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e3b919061483c565b80613e6257506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b613e7f57604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b031610613eb15760405163dfad9ca160e01b815260040160405180910390fd5b9150600101613d86565b5f613f0f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166140a09092919063ffffffff16565b905080515f1480613f2f575080806020019051810190613f2f919061483c565b6112125760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611e6a565b6040516001600160a01b03831660248201526044810182905261121290849063a9059cbb60e01b90606401612d48565b613fc9602083615158565b6001901b8463ffffffff1610613ff15760405162c6c39d60e71b815260040160405180910390fd5b5f613ffb82611017565b905061404584848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166140b6565b61323c576040516369ca16c960e01b815260040160405180910390fd5b61406d602083615158565b6001901b8463ffffffff16106140965760405163054ff4df60e51b815260040160405180910390fd5b5f613ffb82612637565b60606140ae84845f856140eb565b949350505050565b5f836140d5576040516329e7276760e11b815260040160405180910390fd5b836140e18685856141c2565b1495945050505050565b60608247101561414c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611e6a565b5f5f866001600160a01b0316858760405161416791906152d4565b5f6040518083038185875af1925050503d805f81146141a1576040519150601f19603f3d011682016040523d82523d5f602084013e6141a6565b606091505b50915091506141b78783838761427f565b979650505050505050565b5f83515f036141d2575081611dc8565b602084516141e091906152ea565b156141fe576040516313717da960e21b815260040160405180910390fd5b8260205b8551811161425f576142156002856152ea565b5f0361423657815f528086015160205260405f20915060028404935061424d565b808601515f528160205260405f2091506002840493505b614258602082614bc4565b9050614202565b5082156140ae576040516363df817160e01b815260040160405180910390fd5b606083156142ed5782515f036142e6576001600160a01b0385163b6142e65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611e6a565b50816140ae565b6140ae83838151156143025781518083602001fd5b8060405162461bcd60e51b8152600401611e6a91906152fd565b6001600160a01b03811681146114e3575f5ffd5b5f60208284031215614340575f5ffd5b8135611dc88161431c565b5f6040828403121561435b575f5ffd5b50919050565b5f5f83601f840112614371575f5ffd5b5081356001600160401b03811115614387575f5ffd5b6020830191508360208260051b85010111156143a1575f5ffd5b9250929050565b5f5f5f606084860312156143ba575f5ffd5b6143c4858561434b565b925060408401356001600160401b038111156143de575f5ffd5b6143ea86828701614361565b9497909650939450505050565b80151581146114e3575f5ffd5b5f5f60408385031215614415575f5ffd5b82356144208161431c565b91506020830135614430816143f7565b809150509250929050565b5f6020828403121561444b575f5ffd5b5035919050565b5f60408284031215614462575f5ffd5b611dc8838361434b565b5f5f6040838503121561447d575f5ffd5b82356144888161431c565b946020939093013593505050565b5f5f602083850312156144a7575f5ffd5b82356001600160401b038111156144bc575f5ffd5b6144c885828601614361565b90969095509350505050565b5f610100828403121561435b575f5ffd5b5f5f604083850312156144f6575f5ffd5b82356001600160401b0381111561450b575f5ffd5b614517858286016144d4565b92505060208301356144308161431c565b803563ffffffff811681146132af575f5ffd5b5f5f6040838503121561454c575f5ffd5b8235915061455c60208401614528565b90509250929050565b5f5f5f60408486031215614577575f5ffd5b83356001600160401b0381111561458c575f5ffd5b61459886828701614361565b90945092505060208401356145ac8161431c565b809150509250925092565b5f602082840312156145c7575f5ffd5b611dc882614528565b5f602082840312156145e0575f5ffd5b813560ff81168114611dc8575f5ffd5b5f60208284031215614600575f5ffd5b81356001600160401b03811115614615575f5ffd5b6140ae848285016144d4565b5f5f5f60408486031215614633575f5ffd5b833561463e8161431c565b925060208401356001600160401b038111156143de575f5ffd5b80356132af8161431c565b5f5f60408385031215614674575f5ffd5b823561467f8161431c565b915060208301356144308161431c565b5f5f606083850312156146a0575f5ffd5b82356146ab8161431c565b915061455c846020850161434b565b803561ffff811681146132af575f5ffd5b5f602082840312156146db575f5ffd5b611dc8826146ba565b5f5f5f5f5f5f60c087890312156146f9575f5ffd5b86356147048161431c565b955060208701359450604087013561471b8161431c565b935061472960608801614528565b9250614737608088016146ba565b915060a08701356147478161431c565b809150509295509295509295565b5f5f60408385031215614766575f5ffd5b82356147718161431c565b915061455c602084016146ba565b5f5f5f60608486031215614791575f5ffd5b833561479c8161431c565b925060208401356147ac8161431c565b91506147ba604085016146ba565b90509250925092565b5f5f5f608084860312156147d5575f5ffd5b83356147e08161431c565b92506147ef856020860161434b565b91506147ba606085016146ba565b80356148088161431c565b6001600160a01b0316825263ffffffff61482460208301614528565b1660208301525050565b604081016114cc82846147fd565b5f6020828403121561484c575f5ffd5b8151611dc8816143f7565b634e487b7160e01b5f52603260045260245ffd5b5f823560be1983360301811261487f575f5ffd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156148bf576148bf614889565b60405290565b60405160c081016001600160401b03811182821017156148bf576148bf614889565b604051601f8201601f191681016001600160401b038111828210171561490f5761490f614889565b604052919050565b5f6001600160401b0382111561492f5761492f614889565b5060051b60200190565b80356001600160601b03811681146132af575f5ffd5b5f82601f83011261495e575f5ffd5b813561497161496c82614917565b6148e7565b8082825260208201915060208360061b860101925085831115614992575f5ffd5b602085015b838110156149e957604081880312156149ae575f5ffd5b6149b661489d565b81356149c18161431c565b81526149cf60208301614939565b602082015280845250602083019250604081019050614997565b5095945050505050565b5f82601f830112614a02575f5ffd5b8135614a1061496c82614917565b8082825260208201915060208360061b860101925085831115614a31575f5ffd5b602085015b838110156149e95760408188031215614a4d575f5ffd5b614a5561489d565b8135614a608161431c565b8152602082810135818301529084529290920191604001614a36565b5f82601f830112614a8b575f5ffd5b81356001600160401b03811115614aa457614aa4614889565b614ab7601f8201601f19166020016148e7565b818152846020838601011115614acb575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f60c08236031215614af7575f5ffd5b614aff6148c5565b82356001600160401b03811115614b14575f5ffd5b614b203682860161494f565b825250614b2f60208401614658565b602082015260408301356001600160401b03811115614b4c575f5ffd5b614b58368286016149f3565b604083015250614b6a60608401614528565b6060820152614b7b60808401614528565b608082015260a08301356001600160401b03811115614b98575f5ffd5b614ba436828601614a7c565b60a08301525092915050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156114cc576114cc614bb0565b5f8151808452602084019350602083015f5b82811015614c2557815180516001600160a01b031687526020908101516001600160601b03168188015260409096019590910190600101614be9565b5093949350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815160c08452614c7160c0850182614bd7565b6020848101516001600160a01b03168682015260408086015187840391880191909152805180845290820193505f92909101905b80831015614cdc57835180516001600160a01b03168352602090810151818401529093019260019290920191604090910190614ca5565b5060608501519250614cf6606087018463ffffffff169052565b60808501519250614d0f608087018463ffffffff169052565b60a0850151925085810360a0870152614d288184614c2f565b9695505050505050565b614d3c81856147fd565b826040820152608060608201525f614d576080830184614c5d565b95945050505050565b818103818111156114cc576114cc614bb0565b5f81614d8157614d81614bb0565b505f190190565b5f8235609e1983360301811261487f575f5ffd5b8183526020830192505f815f5b84811015614c25578135614dbc8161431c565b6001600160a01b031686526001600160601b03614ddb60208401614939565b1660208701526040958601959190910190600101614da9565b5f8135601e19833603018112614e08575f5ffd5b82016020810190356001600160401b03811115614e23575f5ffd5b8060061b3603821315614e34575f5ffd5b60a08552614e4660a086018284614d9c565b915050614e5560208401614658565b6001600160a01b0316602085015260408381013590850152614e7960608401614528565b63ffffffff166060850152614e9060808401614528565b63ffffffff81166080860152509392505050565b60018060a01b0384168152826020820152606060408201525f614d576060830184614df4565b5f60a08236031215614eda575f5ffd5b60405160a081016001600160401b0381118282101715614efc57614efc614889565b60405282356001600160401b03811115614f14575f5ffd5b614f203682860161494f565b8252506020830135614f318161431c565b602082015260408381013590820152614f4c60608401614528565b6060820152614f5d60808401614528565b608082015292915050565b602081525f611dc86020830184614df4565b63ffffffff81811683821601908111156114cc576114cc614bb0565b5f823560fe1983360301811261487f575f5ffd5b5f815160a08452614fbe60a0850182614bd7565b905060018060a01b0360208401511660208501526040830151604085015263ffffffff606084015116606085015263ffffffff60808401511660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f614d576060830184614faa565b61503681856147fd565b826040820152608060608201525f614d576080830184614faa565b828152604060208201525f6140ae6040830184614c5d565b5f604082840312801561507a575f5ffd5b5061508361489d565b823561508e8161431c565b815261509c60208401614528565b60208201529392505050565b63ffffffff82811682821603908111156114cc576114cc614bb0565b5f63ffffffff8216806150d9576150d9614bb0565b5f190192915050565b5f602082840312156150f2575f5ffd5b5051919050565b60a0810161510782876147fd565b63ffffffff94909416604082015261ffff92831660608201529116608090910152919050565b80820281158282048414176114cc576114cc614bb0565b634e487b7160e01b5f52601260045260245ffd5b5f8261516657615166615144565b500490565b60018060a01b0384168152826020820152606060408201525f614d576060830184614c5d565b5f5f8335601e198436030181126151a6575f5ffd5b8301803591506001600160401b038211156151bf575f5ffd5b6020019150600581901b36038213156143a1575f5ffd5b5f5f8335601e198436030181126151eb575f5ffd5b8301803591506001600160401b03821115615204575f5ffd5b6020019150600681901b36038213156143a1575f5ffd5b5f5f8335601e19843603018112615230575f5ffd5b8301803591506001600160401b03821115615249575f5ffd5b6020019150368190038213156143a1575f5ffd5b602081525f611dc86020830184614faa565b8051602080830151919081101561435b575f1960209190910360031b1b16919050565b5f602082840312156152a2575f5ffd5b8151611dc88161431c565b5f63ffffffff8316806152c2576152c2615144565b8063ffffffff84160691505092915050565b5f82518060208501845e5f920191825250919050565b5f826152f8576152f8615144565b500690565b602081525f611dc86020830184614c2f56fea26469706673582212201e492f56c77bfbc67713c5cf9edcaa0a155ff829862174e68051339370d92cf364736f6c634300081e0033",
}
// RewardsCoordinatorABI is the input ABI used to generate the binding from.
@@ -780,6 +781,68 @@ func (_RewardsCoordinator *RewardsCoordinatorCallerSession) DelegationManager()
return _RewardsCoordinator.Contract.DelegationManager(&_RewardsCoordinator.CallOpts)
}
+// EmissionsController is a free data retrieval call binding the contract method 0x67eab2be.
+//
+// Solidity: function emissionsController() view returns(address)
+func (_RewardsCoordinator *RewardsCoordinatorCaller) EmissionsController(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _RewardsCoordinator.contract.Call(opts, &out, "emissionsController")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// EmissionsController is a free data retrieval call binding the contract method 0x67eab2be.
+//
+// Solidity: function emissionsController() view returns(address)
+func (_RewardsCoordinator *RewardsCoordinatorSession) EmissionsController() (common.Address, error) {
+ return _RewardsCoordinator.Contract.EmissionsController(&_RewardsCoordinator.CallOpts)
+}
+
+// EmissionsController is a free data retrieval call binding the contract method 0x67eab2be.
+//
+// Solidity: function emissionsController() view returns(address)
+func (_RewardsCoordinator *RewardsCoordinatorCallerSession) EmissionsController() (common.Address, error) {
+ return _RewardsCoordinator.Contract.EmissionsController(&_RewardsCoordinator.CallOpts)
+}
+
+// FeeRecipient is a free data retrieval call binding the contract method 0x46904840.
+//
+// Solidity: function feeRecipient() view returns(address)
+func (_RewardsCoordinator *RewardsCoordinatorCaller) FeeRecipient(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _RewardsCoordinator.contract.Call(opts, &out, "feeRecipient")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// FeeRecipient is a free data retrieval call binding the contract method 0x46904840.
+//
+// Solidity: function feeRecipient() view returns(address)
+func (_RewardsCoordinator *RewardsCoordinatorSession) FeeRecipient() (common.Address, error) {
+ return _RewardsCoordinator.Contract.FeeRecipient(&_RewardsCoordinator.CallOpts)
+}
+
+// FeeRecipient is a free data retrieval call binding the contract method 0x46904840.
+//
+// Solidity: function feeRecipient() view returns(address)
+func (_RewardsCoordinator *RewardsCoordinatorCallerSession) FeeRecipient() (common.Address, error) {
+ return _RewardsCoordinator.Contract.FeeRecipient(&_RewardsCoordinator.CallOpts)
+}
+
// GetCurrentClaimableDistributionRoot is a free data retrieval call binding the contract method 0x0e9a53cf.
//
// Solidity: function getCurrentClaimableDistributionRoot() view returns((bytes32,uint32,uint32,bool))
@@ -1121,6 +1184,37 @@ func (_RewardsCoordinator *RewardsCoordinatorCallerSession) IsOperatorDirectedOp
return _RewardsCoordinator.Contract.IsOperatorDirectedOperatorSetRewardsSubmissionHash(&_RewardsCoordinator.CallOpts, avs, hash)
}
+// IsOptedInForProtocolFee is a free data retrieval call binding the contract method 0xa89c2930.
+//
+// Solidity: function isOptedInForProtocolFee(address submitter) view returns(bool isOptedIn)
+func (_RewardsCoordinator *RewardsCoordinatorCaller) IsOptedInForProtocolFee(opts *bind.CallOpts, submitter common.Address) (bool, error) {
+ var out []interface{}
+ err := _RewardsCoordinator.contract.Call(opts, &out, "isOptedInForProtocolFee", submitter)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsOptedInForProtocolFee is a free data retrieval call binding the contract method 0xa89c2930.
+//
+// Solidity: function isOptedInForProtocolFee(address submitter) view returns(bool isOptedIn)
+func (_RewardsCoordinator *RewardsCoordinatorSession) IsOptedInForProtocolFee(submitter common.Address) (bool, error) {
+ return _RewardsCoordinator.Contract.IsOptedInForProtocolFee(&_RewardsCoordinator.CallOpts, submitter)
+}
+
+// IsOptedInForProtocolFee is a free data retrieval call binding the contract method 0xa89c2930.
+//
+// Solidity: function isOptedInForProtocolFee(address submitter) view returns(bool isOptedIn)
+func (_RewardsCoordinator *RewardsCoordinatorCallerSession) IsOptedInForProtocolFee(submitter common.Address) (bool, error) {
+ return _RewardsCoordinator.Contract.IsOptedInForProtocolFee(&_RewardsCoordinator.CallOpts, submitter)
+}
+
// IsRewardsForAllSubmitter is a free data retrieval call binding the contract method 0x0018572c.
//
// Solidity: function isRewardsForAllSubmitter(address submitter) view returns(bool valid)
@@ -1545,6 +1639,27 @@ func (_RewardsCoordinator *RewardsCoordinatorTransactorSession) CreateAVSRewards
return _RewardsCoordinator.Contract.CreateAVSRewardsSubmission(&_RewardsCoordinator.TransactOpts, rewardsSubmissions)
}
+// CreateEigenDARewardsSubmission is a paid mutator transaction binding the contract method 0x7282a352.
+//
+// Solidity: function createEigenDARewardsSubmission(address avs, ((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
+func (_RewardsCoordinator *RewardsCoordinatorTransactor) CreateEigenDARewardsSubmission(opts *bind.TransactOpts, avs common.Address, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error) {
+ return _RewardsCoordinator.contract.Transact(opts, "createEigenDARewardsSubmission", avs, rewardsSubmissions)
+}
+
+// CreateEigenDARewardsSubmission is a paid mutator transaction binding the contract method 0x7282a352.
+//
+// Solidity: function createEigenDARewardsSubmission(address avs, ((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
+func (_RewardsCoordinator *RewardsCoordinatorSession) CreateEigenDARewardsSubmission(avs common.Address, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error) {
+ return _RewardsCoordinator.Contract.CreateEigenDARewardsSubmission(&_RewardsCoordinator.TransactOpts, avs, rewardsSubmissions)
+}
+
+// CreateEigenDARewardsSubmission is a paid mutator transaction binding the contract method 0x7282a352.
+//
+// Solidity: function createEigenDARewardsSubmission(address avs, ((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
+func (_RewardsCoordinator *RewardsCoordinatorTransactorSession) CreateEigenDARewardsSubmission(avs common.Address, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error) {
+ return _RewardsCoordinator.Contract.CreateEigenDARewardsSubmission(&_RewardsCoordinator.TransactOpts, avs, rewardsSubmissions)
+}
+
// CreateOperatorDirectedAVSRewardsSubmission is a paid mutator transaction binding the contract method 0x9cb9a5fa.
//
// Solidity: function createOperatorDirectedAVSRewardsSubmission(address avs, ((address,uint96)[],address,(address,uint256)[],uint32,uint32,string)[] operatorDirectedRewardsSubmissions) returns()
@@ -1692,25 +1807,25 @@ func (_RewardsCoordinator *RewardsCoordinatorTransactorSession) DisableRoot(root
return _RewardsCoordinator.Contract.DisableRoot(&_RewardsCoordinator.TransactOpts, rootIndex)
}
-// Initialize is a paid mutator transaction binding the contract method 0xf6efbb59.
+// Initialize is a paid mutator transaction binding the contract method 0xacad7299.
//
-// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips) returns()
-func (_RewardsCoordinator *RewardsCoordinatorTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16) (*types.Transaction, error) {
- return _RewardsCoordinator.contract.Transact(opts, "initialize", initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips)
+// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips, address _feeRecipient) returns()
+func (_RewardsCoordinator *RewardsCoordinatorTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16, _feeRecipient common.Address) (*types.Transaction, error) {
+ return _RewardsCoordinator.contract.Transact(opts, "initialize", initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips, _feeRecipient)
}
-// Initialize is a paid mutator transaction binding the contract method 0xf6efbb59.
+// Initialize is a paid mutator transaction binding the contract method 0xacad7299.
//
-// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips) returns()
-func (_RewardsCoordinator *RewardsCoordinatorSession) Initialize(initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16) (*types.Transaction, error) {
- return _RewardsCoordinator.Contract.Initialize(&_RewardsCoordinator.TransactOpts, initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips)
+// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips, address _feeRecipient) returns()
+func (_RewardsCoordinator *RewardsCoordinatorSession) Initialize(initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16, _feeRecipient common.Address) (*types.Transaction, error) {
+ return _RewardsCoordinator.Contract.Initialize(&_RewardsCoordinator.TransactOpts, initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips, _feeRecipient)
}
-// Initialize is a paid mutator transaction binding the contract method 0xf6efbb59.
+// Initialize is a paid mutator transaction binding the contract method 0xacad7299.
//
-// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips) returns()
-func (_RewardsCoordinator *RewardsCoordinatorTransactorSession) Initialize(initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16) (*types.Transaction, error) {
- return _RewardsCoordinator.Contract.Initialize(&_RewardsCoordinator.TransactOpts, initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips)
+// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips, address _feeRecipient) returns()
+func (_RewardsCoordinator *RewardsCoordinatorTransactorSession) Initialize(initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16, _feeRecipient common.Address) (*types.Transaction, error) {
+ return _RewardsCoordinator.Contract.Initialize(&_RewardsCoordinator.TransactOpts, initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips, _feeRecipient)
}
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
@@ -1902,6 +2017,27 @@ func (_RewardsCoordinator *RewardsCoordinatorTransactorSession) SetDefaultOperat
return _RewardsCoordinator.Contract.SetDefaultOperatorSplit(&_RewardsCoordinator.TransactOpts, split)
}
+// SetFeeRecipient is a paid mutator transaction binding the contract method 0xe74b981b.
+//
+// Solidity: function setFeeRecipient(address _feeRecipient) returns()
+func (_RewardsCoordinator *RewardsCoordinatorTransactor) SetFeeRecipient(opts *bind.TransactOpts, _feeRecipient common.Address) (*types.Transaction, error) {
+ return _RewardsCoordinator.contract.Transact(opts, "setFeeRecipient", _feeRecipient)
+}
+
+// SetFeeRecipient is a paid mutator transaction binding the contract method 0xe74b981b.
+//
+// Solidity: function setFeeRecipient(address _feeRecipient) returns()
+func (_RewardsCoordinator *RewardsCoordinatorSession) SetFeeRecipient(_feeRecipient common.Address) (*types.Transaction, error) {
+ return _RewardsCoordinator.Contract.SetFeeRecipient(&_RewardsCoordinator.TransactOpts, _feeRecipient)
+}
+
+// SetFeeRecipient is a paid mutator transaction binding the contract method 0xe74b981b.
+//
+// Solidity: function setFeeRecipient(address _feeRecipient) returns()
+func (_RewardsCoordinator *RewardsCoordinatorTransactorSession) SetFeeRecipient(_feeRecipient common.Address) (*types.Transaction, error) {
+ return _RewardsCoordinator.Contract.SetFeeRecipient(&_RewardsCoordinator.TransactOpts, _feeRecipient)
+}
+
// SetOperatorAVSSplit is a paid mutator transaction binding the contract method 0xdcbb03b3.
//
// Solidity: function setOperatorAVSSplit(address operator, address avs, uint16 split) returns()
@@ -1965,6 +2101,27 @@ func (_RewardsCoordinator *RewardsCoordinatorTransactorSession) SetOperatorSetSp
return _RewardsCoordinator.Contract.SetOperatorSetSplit(&_RewardsCoordinator.TransactOpts, operator, operatorSet, split)
}
+// SetOptInForProtocolFee is a paid mutator transaction binding the contract method 0x8d424f49.
+//
+// Solidity: function setOptInForProtocolFee(address submitter, bool optInForProtocolFee) returns()
+func (_RewardsCoordinator *RewardsCoordinatorTransactor) SetOptInForProtocolFee(opts *bind.TransactOpts, submitter common.Address, optInForProtocolFee bool) (*types.Transaction, error) {
+ return _RewardsCoordinator.contract.Transact(opts, "setOptInForProtocolFee", submitter, optInForProtocolFee)
+}
+
+// SetOptInForProtocolFee is a paid mutator transaction binding the contract method 0x8d424f49.
+//
+// Solidity: function setOptInForProtocolFee(address submitter, bool optInForProtocolFee) returns()
+func (_RewardsCoordinator *RewardsCoordinatorSession) SetOptInForProtocolFee(submitter common.Address, optInForProtocolFee bool) (*types.Transaction, error) {
+ return _RewardsCoordinator.Contract.SetOptInForProtocolFee(&_RewardsCoordinator.TransactOpts, submitter, optInForProtocolFee)
+}
+
+// SetOptInForProtocolFee is a paid mutator transaction binding the contract method 0x8d424f49.
+//
+// Solidity: function setOptInForProtocolFee(address submitter, bool optInForProtocolFee) returns()
+func (_RewardsCoordinator *RewardsCoordinatorTransactorSession) SetOptInForProtocolFee(submitter common.Address, optInForProtocolFee bool) (*types.Transaction, error) {
+ return _RewardsCoordinator.Contract.SetOptInForProtocolFee(&_RewardsCoordinator.TransactOpts, submitter, optInForProtocolFee)
+}
+
// SetRewardsForAllSubmitter is a paid mutator transaction binding the contract method 0x0eb38345.
//
// Solidity: function setRewardsForAllSubmitter(address _submitter, bool _newValue) returns()
@@ -2972,6 +3129,159 @@ func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseDistributionRootSubm
return event, nil
}
+// RewardsCoordinatorFeeRecipientSetIterator is returned from FilterFeeRecipientSet and is used to iterate over the raw logs and unpacked data for FeeRecipientSet events raised by the RewardsCoordinator contract.
+type RewardsCoordinatorFeeRecipientSetIterator struct {
+ Event *RewardsCoordinatorFeeRecipientSet // 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 *RewardsCoordinatorFeeRecipientSetIterator) 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(RewardsCoordinatorFeeRecipientSet)
+ 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(RewardsCoordinatorFeeRecipientSet)
+ 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 *RewardsCoordinatorFeeRecipientSetIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *RewardsCoordinatorFeeRecipientSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// RewardsCoordinatorFeeRecipientSet represents a FeeRecipientSet event raised by the RewardsCoordinator contract.
+type RewardsCoordinatorFeeRecipientSet struct {
+ OldFeeRecipient common.Address
+ NewFeeRecipient common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterFeeRecipientSet is a free log retrieval operation binding the contract event 0x15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721.
+//
+// Solidity: event FeeRecipientSet(address indexed oldFeeRecipient, address indexed newFeeRecipient)
+func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterFeeRecipientSet(opts *bind.FilterOpts, oldFeeRecipient []common.Address, newFeeRecipient []common.Address) (*RewardsCoordinatorFeeRecipientSetIterator, error) {
+
+ var oldFeeRecipientRule []interface{}
+ for _, oldFeeRecipientItem := range oldFeeRecipient {
+ oldFeeRecipientRule = append(oldFeeRecipientRule, oldFeeRecipientItem)
+ }
+ var newFeeRecipientRule []interface{}
+ for _, newFeeRecipientItem := range newFeeRecipient {
+ newFeeRecipientRule = append(newFeeRecipientRule, newFeeRecipientItem)
+ }
+
+ logs, sub, err := _RewardsCoordinator.contract.FilterLogs(opts, "FeeRecipientSet", oldFeeRecipientRule, newFeeRecipientRule)
+ if err != nil {
+ return nil, err
+ }
+ return &RewardsCoordinatorFeeRecipientSetIterator{contract: _RewardsCoordinator.contract, event: "FeeRecipientSet", logs: logs, sub: sub}, nil
+}
+
+// WatchFeeRecipientSet is a free log subscription operation binding the contract event 0x15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721.
+//
+// Solidity: event FeeRecipientSet(address indexed oldFeeRecipient, address indexed newFeeRecipient)
+func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchFeeRecipientSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorFeeRecipientSet, oldFeeRecipient []common.Address, newFeeRecipient []common.Address) (event.Subscription, error) {
+
+ var oldFeeRecipientRule []interface{}
+ for _, oldFeeRecipientItem := range oldFeeRecipient {
+ oldFeeRecipientRule = append(oldFeeRecipientRule, oldFeeRecipientItem)
+ }
+ var newFeeRecipientRule []interface{}
+ for _, newFeeRecipientItem := range newFeeRecipient {
+ newFeeRecipientRule = append(newFeeRecipientRule, newFeeRecipientItem)
+ }
+
+ logs, sub, err := _RewardsCoordinator.contract.WatchLogs(opts, "FeeRecipientSet", oldFeeRecipientRule, newFeeRecipientRule)
+ 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(RewardsCoordinatorFeeRecipientSet)
+ if err := _RewardsCoordinator.contract.UnpackLog(event, "FeeRecipientSet", 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
+}
+
+// ParseFeeRecipientSet is a log parse operation binding the contract event 0x15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721.
+//
+// Solidity: event FeeRecipientSet(address indexed oldFeeRecipient, address indexed newFeeRecipient)
+func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseFeeRecipientSet(log types.Log) (*RewardsCoordinatorFeeRecipientSet, error) {
+ event := new(RewardsCoordinatorFeeRecipientSet)
+ if err := _RewardsCoordinator.contract.UnpackLog(event, "FeeRecipientSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
// RewardsCoordinatorInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the RewardsCoordinator contract.
type RewardsCoordinatorInitializedIterator struct {
Event *RewardsCoordinatorInitialized // Event containing the contract specifics and raw log
@@ -3904,6 +4214,168 @@ func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseOperatorSetSplitBips
return event, nil
}
+// RewardsCoordinatorOptInForProtocolFeeSetIterator is returned from FilterOptInForProtocolFeeSet and is used to iterate over the raw logs and unpacked data for OptInForProtocolFeeSet events raised by the RewardsCoordinator contract.
+type RewardsCoordinatorOptInForProtocolFeeSetIterator struct {
+ Event *RewardsCoordinatorOptInForProtocolFeeSet // 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 *RewardsCoordinatorOptInForProtocolFeeSetIterator) 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(RewardsCoordinatorOptInForProtocolFeeSet)
+ 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(RewardsCoordinatorOptInForProtocolFeeSet)
+ 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 *RewardsCoordinatorOptInForProtocolFeeSetIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *RewardsCoordinatorOptInForProtocolFeeSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// RewardsCoordinatorOptInForProtocolFeeSet represents a OptInForProtocolFeeSet event raised by the RewardsCoordinator contract.
+type RewardsCoordinatorOptInForProtocolFeeSet struct {
+ Submitter common.Address
+ OldValue bool
+ NewValue bool
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterOptInForProtocolFeeSet is a free log retrieval operation binding the contract event 0xbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd2.
+//
+// Solidity: event OptInForProtocolFeeSet(address indexed submitter, bool indexed oldValue, bool indexed newValue)
+func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterOptInForProtocolFeeSet(opts *bind.FilterOpts, submitter []common.Address, oldValue []bool, newValue []bool) (*RewardsCoordinatorOptInForProtocolFeeSetIterator, error) {
+
+ var submitterRule []interface{}
+ for _, submitterItem := range submitter {
+ submitterRule = append(submitterRule, submitterItem)
+ }
+ var oldValueRule []interface{}
+ for _, oldValueItem := range oldValue {
+ oldValueRule = append(oldValueRule, oldValueItem)
+ }
+ var newValueRule []interface{}
+ for _, newValueItem := range newValue {
+ newValueRule = append(newValueRule, newValueItem)
+ }
+
+ logs, sub, err := _RewardsCoordinator.contract.FilterLogs(opts, "OptInForProtocolFeeSet", submitterRule, oldValueRule, newValueRule)
+ if err != nil {
+ return nil, err
+ }
+ return &RewardsCoordinatorOptInForProtocolFeeSetIterator{contract: _RewardsCoordinator.contract, event: "OptInForProtocolFeeSet", logs: logs, sub: sub}, nil
+}
+
+// WatchOptInForProtocolFeeSet is a free log subscription operation binding the contract event 0xbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd2.
+//
+// Solidity: event OptInForProtocolFeeSet(address indexed submitter, bool indexed oldValue, bool indexed newValue)
+func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchOptInForProtocolFeeSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorOptInForProtocolFeeSet, submitter []common.Address, oldValue []bool, newValue []bool) (event.Subscription, error) {
+
+ var submitterRule []interface{}
+ for _, submitterItem := range submitter {
+ submitterRule = append(submitterRule, submitterItem)
+ }
+ var oldValueRule []interface{}
+ for _, oldValueItem := range oldValue {
+ oldValueRule = append(oldValueRule, oldValueItem)
+ }
+ var newValueRule []interface{}
+ for _, newValueItem := range newValue {
+ newValueRule = append(newValueRule, newValueItem)
+ }
+
+ logs, sub, err := _RewardsCoordinator.contract.WatchLogs(opts, "OptInForProtocolFeeSet", submitterRule, oldValueRule, newValueRule)
+ 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(RewardsCoordinatorOptInForProtocolFeeSet)
+ if err := _RewardsCoordinator.contract.UnpackLog(event, "OptInForProtocolFeeSet", 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
+}
+
+// ParseOptInForProtocolFeeSet is a log parse operation binding the contract event 0xbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd2.
+//
+// Solidity: event OptInForProtocolFeeSet(address indexed submitter, bool indexed oldValue, bool indexed newValue)
+func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseOptInForProtocolFeeSet(log types.Log) (*RewardsCoordinatorOptInForProtocolFeeSet, error) {
+ event := new(RewardsCoordinatorOptInForProtocolFeeSet)
+ if err := _RewardsCoordinator.contract.UnpackLog(event, "OptInForProtocolFeeSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
// RewardsCoordinatorOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the RewardsCoordinator contract.
type RewardsCoordinatorOwnershipTransferredIterator struct {
Event *RewardsCoordinatorOwnershipTransferred // Event containing the contract specifics and raw log
diff --git a/pkg/bindings/RewardsCoordinatorStorage/binding.go b/pkg/bindings/RewardsCoordinatorStorage/binding.go
index 3a0d098a62..53730316f5 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\":\"createTotalStakeRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"createUniqueStakeRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"isTotalStakeRewardsSubmissionHash\",\"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\":\"isUniqueStakeRewardsSubmissionHash\",\"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\":\"event\",\"name\":\"TotalStakeRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rewardsSubmissionHash\",\"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\":\"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\":\"UniqueStakeRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rewardsSubmissionHash\",\"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\":\"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\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationIsZero\",\"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\":\"createEigenDARewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"createTotalStakeRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"createUniqueStakeRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"emissionsController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEmissionsController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feeRecipient\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"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\"},{\"name\":\"_feeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"isOptedInForProtocolFee\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isOptedIn\",\"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\":\"isTotalStakeRewardsSubmissionHash\",\"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\":\"isUniqueStakeRewardsSubmissionHash\",\"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\":\"setFeeRecipient\",\"inputs\":[{\"name\":\"_feeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"setOptInForProtocolFee\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"optInForProtocolFee\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"FeeRecipientSet\",\"inputs\":[{\"name\":\"oldFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"OptInForProtocolFeeSet\",\"inputs\":[{\"name\":\"submitter\",\"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\":\"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\":\"TotalStakeRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rewardsSubmissionHash\",\"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\":\"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\":\"UniqueStakeRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rewardsSubmissionHash\",\"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\":\"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\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationIsZero\",\"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.
@@ -744,6 +744,68 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) Delega
return _RewardsCoordinatorStorage.Contract.DelegationManager(&_RewardsCoordinatorStorage.CallOpts)
}
+// EmissionsController is a free data retrieval call binding the contract method 0x67eab2be.
+//
+// Solidity: function emissionsController() view returns(address)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) EmissionsController(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _RewardsCoordinatorStorage.contract.Call(opts, &out, "emissionsController")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// EmissionsController is a free data retrieval call binding the contract method 0x67eab2be.
+//
+// Solidity: function emissionsController() view returns(address)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) EmissionsController() (common.Address, error) {
+ return _RewardsCoordinatorStorage.Contract.EmissionsController(&_RewardsCoordinatorStorage.CallOpts)
+}
+
+// EmissionsController is a free data retrieval call binding the contract method 0x67eab2be.
+//
+// Solidity: function emissionsController() view returns(address)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) EmissionsController() (common.Address, error) {
+ return _RewardsCoordinatorStorage.Contract.EmissionsController(&_RewardsCoordinatorStorage.CallOpts)
+}
+
+// FeeRecipient is a free data retrieval call binding the contract method 0x46904840.
+//
+// Solidity: function feeRecipient() view returns(address)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) FeeRecipient(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _RewardsCoordinatorStorage.contract.Call(opts, &out, "feeRecipient")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// FeeRecipient is a free data retrieval call binding the contract method 0x46904840.
+//
+// Solidity: function feeRecipient() view returns(address)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) FeeRecipient() (common.Address, error) {
+ return _RewardsCoordinatorStorage.Contract.FeeRecipient(&_RewardsCoordinatorStorage.CallOpts)
+}
+
+// FeeRecipient is a free data retrieval call binding the contract method 0x46904840.
+//
+// Solidity: function feeRecipient() view returns(address)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) FeeRecipient() (common.Address, error) {
+ return _RewardsCoordinatorStorage.Contract.FeeRecipient(&_RewardsCoordinatorStorage.CallOpts)
+}
+
// GetCurrentClaimableDistributionRoot is a free data retrieval call binding the contract method 0x0e9a53cf.
//
// Solidity: function getCurrentClaimableDistributionRoot() view returns((bytes32,uint32,uint32,bool))
@@ -1085,6 +1147,37 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) IsOper
return _RewardsCoordinatorStorage.Contract.IsOperatorDirectedOperatorSetRewardsSubmissionHash(&_RewardsCoordinatorStorage.CallOpts, avs, hash)
}
+// IsOptedInForProtocolFee is a free data retrieval call binding the contract method 0xa89c2930.
+//
+// Solidity: function isOptedInForProtocolFee(address submitter) view returns(bool isOptedIn)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) IsOptedInForProtocolFee(opts *bind.CallOpts, submitter common.Address) (bool, error) {
+ var out []interface{}
+ err := _RewardsCoordinatorStorage.contract.Call(opts, &out, "isOptedInForProtocolFee", submitter)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+// IsOptedInForProtocolFee is a free data retrieval call binding the contract method 0xa89c2930.
+//
+// Solidity: function isOptedInForProtocolFee(address submitter) view returns(bool isOptedIn)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) IsOptedInForProtocolFee(submitter common.Address) (bool, error) {
+ return _RewardsCoordinatorStorage.Contract.IsOptedInForProtocolFee(&_RewardsCoordinatorStorage.CallOpts, submitter)
+}
+
+// IsOptedInForProtocolFee is a free data retrieval call binding the contract method 0xa89c2930.
+//
+// Solidity: function isOptedInForProtocolFee(address submitter) view returns(bool isOptedIn)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) IsOptedInForProtocolFee(submitter common.Address) (bool, error) {
+ return _RewardsCoordinatorStorage.Contract.IsOptedInForProtocolFee(&_RewardsCoordinatorStorage.CallOpts, submitter)
+}
+
// IsRewardsForAllSubmitter is a free data retrieval call binding the contract method 0x0018572c.
//
// Solidity: function isRewardsForAllSubmitter(address submitter) view returns(bool valid)
@@ -1354,6 +1447,27 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactorSession) Cr
return _RewardsCoordinatorStorage.Contract.CreateAVSRewardsSubmission(&_RewardsCoordinatorStorage.TransactOpts, rewardsSubmissions)
}
+// CreateEigenDARewardsSubmission is a paid mutator transaction binding the contract method 0x7282a352.
+//
+// Solidity: function createEigenDARewardsSubmission(address avs, ((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) CreateEigenDARewardsSubmission(opts *bind.TransactOpts, avs common.Address, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error) {
+ return _RewardsCoordinatorStorage.contract.Transact(opts, "createEigenDARewardsSubmission", avs, rewardsSubmissions)
+}
+
+// CreateEigenDARewardsSubmission is a paid mutator transaction binding the contract method 0x7282a352.
+//
+// Solidity: function createEigenDARewardsSubmission(address avs, ((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) CreateEigenDARewardsSubmission(avs common.Address, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error) {
+ return _RewardsCoordinatorStorage.Contract.CreateEigenDARewardsSubmission(&_RewardsCoordinatorStorage.TransactOpts, avs, rewardsSubmissions)
+}
+
+// CreateEigenDARewardsSubmission is a paid mutator transaction binding the contract method 0x7282a352.
+//
+// Solidity: function createEigenDARewardsSubmission(address avs, ((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactorSession) CreateEigenDARewardsSubmission(avs common.Address, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error) {
+ return _RewardsCoordinatorStorage.Contract.CreateEigenDARewardsSubmission(&_RewardsCoordinatorStorage.TransactOpts, avs, rewardsSubmissions)
+}
+
// CreateOperatorDirectedAVSRewardsSubmission is a paid mutator transaction binding the contract method 0x9cb9a5fa.
//
// Solidity: function createOperatorDirectedAVSRewardsSubmission(address avs, ((address,uint96)[],address,(address,uint256)[],uint32,uint32,string)[] operatorDirectedRewardsSubmissions) returns()
@@ -1501,25 +1615,25 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactorSession) Di
return _RewardsCoordinatorStorage.Contract.DisableRoot(&_RewardsCoordinatorStorage.TransactOpts, rootIndex)
}
-// Initialize is a paid mutator transaction binding the contract method 0xf6efbb59.
+// Initialize is a paid mutator transaction binding the contract method 0xacad7299.
//
-// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips) returns()
-func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16) (*types.Transaction, error) {
- return _RewardsCoordinatorStorage.contract.Transact(opts, "initialize", initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips)
+// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips, address _feeRecipient) returns()
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16, _feeRecipient common.Address) (*types.Transaction, error) {
+ return _RewardsCoordinatorStorage.contract.Transact(opts, "initialize", initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips, _feeRecipient)
}
-// Initialize is a paid mutator transaction binding the contract method 0xf6efbb59.
+// Initialize is a paid mutator transaction binding the contract method 0xacad7299.
//
-// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips) returns()
-func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) Initialize(initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16) (*types.Transaction, error) {
- return _RewardsCoordinatorStorage.Contract.Initialize(&_RewardsCoordinatorStorage.TransactOpts, initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips)
+// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips, address _feeRecipient) returns()
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) Initialize(initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16, _feeRecipient common.Address) (*types.Transaction, error) {
+ return _RewardsCoordinatorStorage.Contract.Initialize(&_RewardsCoordinatorStorage.TransactOpts, initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips, _feeRecipient)
}
-// Initialize is a paid mutator transaction binding the contract method 0xf6efbb59.
+// Initialize is a paid mutator transaction binding the contract method 0xacad7299.
//
-// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips) returns()
-func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactorSession) Initialize(initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16) (*types.Transaction, error) {
- return _RewardsCoordinatorStorage.Contract.Initialize(&_RewardsCoordinatorStorage.TransactOpts, initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips)
+// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips, address _feeRecipient) returns()
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactorSession) Initialize(initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16, _feeRecipient common.Address) (*types.Transaction, error) {
+ return _RewardsCoordinatorStorage.Contract.Initialize(&_RewardsCoordinatorStorage.TransactOpts, initialOwner, initialPausedStatus, _rewardsUpdater, _activationDelay, _defaultSplitBips, _feeRecipient)
}
// ProcessClaim is a paid mutator transaction binding the contract method 0x3ccc861d.
@@ -1648,6 +1762,27 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactorSession) Se
return _RewardsCoordinatorStorage.Contract.SetDefaultOperatorSplit(&_RewardsCoordinatorStorage.TransactOpts, split)
}
+// SetFeeRecipient is a paid mutator transaction binding the contract method 0xe74b981b.
+//
+// Solidity: function setFeeRecipient(address _feeRecipient) returns()
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) SetFeeRecipient(opts *bind.TransactOpts, _feeRecipient common.Address) (*types.Transaction, error) {
+ return _RewardsCoordinatorStorage.contract.Transact(opts, "setFeeRecipient", _feeRecipient)
+}
+
+// SetFeeRecipient is a paid mutator transaction binding the contract method 0xe74b981b.
+//
+// Solidity: function setFeeRecipient(address _feeRecipient) returns()
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) SetFeeRecipient(_feeRecipient common.Address) (*types.Transaction, error) {
+ return _RewardsCoordinatorStorage.Contract.SetFeeRecipient(&_RewardsCoordinatorStorage.TransactOpts, _feeRecipient)
+}
+
+// SetFeeRecipient is a paid mutator transaction binding the contract method 0xe74b981b.
+//
+// Solidity: function setFeeRecipient(address _feeRecipient) returns()
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactorSession) SetFeeRecipient(_feeRecipient common.Address) (*types.Transaction, error) {
+ return _RewardsCoordinatorStorage.Contract.SetFeeRecipient(&_RewardsCoordinatorStorage.TransactOpts, _feeRecipient)
+}
+
// SetOperatorAVSSplit is a paid mutator transaction binding the contract method 0xdcbb03b3.
//
// Solidity: function setOperatorAVSSplit(address operator, address avs, uint16 split) returns()
@@ -1711,6 +1846,27 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactorSession) Se
return _RewardsCoordinatorStorage.Contract.SetOperatorSetSplit(&_RewardsCoordinatorStorage.TransactOpts, operator, operatorSet, split)
}
+// SetOptInForProtocolFee is a paid mutator transaction binding the contract method 0x8d424f49.
+//
+// Solidity: function setOptInForProtocolFee(address submitter, bool optInForProtocolFee) returns()
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) SetOptInForProtocolFee(opts *bind.TransactOpts, submitter common.Address, optInForProtocolFee bool) (*types.Transaction, error) {
+ return _RewardsCoordinatorStorage.contract.Transact(opts, "setOptInForProtocolFee", submitter, optInForProtocolFee)
+}
+
+// SetOptInForProtocolFee is a paid mutator transaction binding the contract method 0x8d424f49.
+//
+// Solidity: function setOptInForProtocolFee(address submitter, bool optInForProtocolFee) returns()
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) SetOptInForProtocolFee(submitter common.Address, optInForProtocolFee bool) (*types.Transaction, error) {
+ return _RewardsCoordinatorStorage.Contract.SetOptInForProtocolFee(&_RewardsCoordinatorStorage.TransactOpts, submitter, optInForProtocolFee)
+}
+
+// SetOptInForProtocolFee is a paid mutator transaction binding the contract method 0x8d424f49.
+//
+// Solidity: function setOptInForProtocolFee(address submitter, bool optInForProtocolFee) returns()
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactorSession) SetOptInForProtocolFee(submitter common.Address, optInForProtocolFee bool) (*types.Transaction, error) {
+ return _RewardsCoordinatorStorage.Contract.SetOptInForProtocolFee(&_RewardsCoordinatorStorage.TransactOpts, submitter, optInForProtocolFee)
+}
+
// SetRewardsForAllSubmitter is a paid mutator transaction binding the contract method 0x0eb38345.
//
// Solidity: function setRewardsForAllSubmitter(address _submitter, bool _newValue) returns()
@@ -2676,6 +2832,159 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseDistri
return event, nil
}
+// RewardsCoordinatorStorageFeeRecipientSetIterator is returned from FilterFeeRecipientSet and is used to iterate over the raw logs and unpacked data for FeeRecipientSet events raised by the RewardsCoordinatorStorage contract.
+type RewardsCoordinatorStorageFeeRecipientSetIterator struct {
+ Event *RewardsCoordinatorStorageFeeRecipientSet // 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 *RewardsCoordinatorStorageFeeRecipientSetIterator) 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(RewardsCoordinatorStorageFeeRecipientSet)
+ 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(RewardsCoordinatorStorageFeeRecipientSet)
+ 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 *RewardsCoordinatorStorageFeeRecipientSetIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *RewardsCoordinatorStorageFeeRecipientSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// RewardsCoordinatorStorageFeeRecipientSet represents a FeeRecipientSet event raised by the RewardsCoordinatorStorage contract.
+type RewardsCoordinatorStorageFeeRecipientSet struct {
+ OldFeeRecipient common.Address
+ NewFeeRecipient common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterFeeRecipientSet is a free log retrieval operation binding the contract event 0x15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721.
+//
+// Solidity: event FeeRecipientSet(address indexed oldFeeRecipient, address indexed newFeeRecipient)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterFeeRecipientSet(opts *bind.FilterOpts, oldFeeRecipient []common.Address, newFeeRecipient []common.Address) (*RewardsCoordinatorStorageFeeRecipientSetIterator, error) {
+
+ var oldFeeRecipientRule []interface{}
+ for _, oldFeeRecipientItem := range oldFeeRecipient {
+ oldFeeRecipientRule = append(oldFeeRecipientRule, oldFeeRecipientItem)
+ }
+ var newFeeRecipientRule []interface{}
+ for _, newFeeRecipientItem := range newFeeRecipient {
+ newFeeRecipientRule = append(newFeeRecipientRule, newFeeRecipientItem)
+ }
+
+ logs, sub, err := _RewardsCoordinatorStorage.contract.FilterLogs(opts, "FeeRecipientSet", oldFeeRecipientRule, newFeeRecipientRule)
+ if err != nil {
+ return nil, err
+ }
+ return &RewardsCoordinatorStorageFeeRecipientSetIterator{contract: _RewardsCoordinatorStorage.contract, event: "FeeRecipientSet", logs: logs, sub: sub}, nil
+}
+
+// WatchFeeRecipientSet is a free log subscription operation binding the contract event 0x15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721.
+//
+// Solidity: event FeeRecipientSet(address indexed oldFeeRecipient, address indexed newFeeRecipient)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchFeeRecipientSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageFeeRecipientSet, oldFeeRecipient []common.Address, newFeeRecipient []common.Address) (event.Subscription, error) {
+
+ var oldFeeRecipientRule []interface{}
+ for _, oldFeeRecipientItem := range oldFeeRecipient {
+ oldFeeRecipientRule = append(oldFeeRecipientRule, oldFeeRecipientItem)
+ }
+ var newFeeRecipientRule []interface{}
+ for _, newFeeRecipientItem := range newFeeRecipient {
+ newFeeRecipientRule = append(newFeeRecipientRule, newFeeRecipientItem)
+ }
+
+ logs, sub, err := _RewardsCoordinatorStorage.contract.WatchLogs(opts, "FeeRecipientSet", oldFeeRecipientRule, newFeeRecipientRule)
+ 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(RewardsCoordinatorStorageFeeRecipientSet)
+ if err := _RewardsCoordinatorStorage.contract.UnpackLog(event, "FeeRecipientSet", 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
+}
+
+// ParseFeeRecipientSet is a log parse operation binding the contract event 0x15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721.
+//
+// Solidity: event FeeRecipientSet(address indexed oldFeeRecipient, address indexed newFeeRecipient)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseFeeRecipientSet(log types.Log) (*RewardsCoordinatorStorageFeeRecipientSet, error) {
+ event := new(RewardsCoordinatorStorageFeeRecipientSet)
+ if err := _RewardsCoordinatorStorage.contract.UnpackLog(event, "FeeRecipientSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
// RewardsCoordinatorStorageOperatorAVSSplitBipsSetIterator is returned from FilterOperatorAVSSplitBipsSet and is used to iterate over the raw logs and unpacked data for OperatorAVSSplitBipsSet events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageOperatorAVSSplitBipsSetIterator struct {
Event *RewardsCoordinatorStorageOperatorAVSSplitBipsSet // Event containing the contract specifics and raw log
@@ -3474,6 +3783,168 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseOperat
return event, nil
}
+// RewardsCoordinatorStorageOptInForProtocolFeeSetIterator is returned from FilterOptInForProtocolFeeSet and is used to iterate over the raw logs and unpacked data for OptInForProtocolFeeSet events raised by the RewardsCoordinatorStorage contract.
+type RewardsCoordinatorStorageOptInForProtocolFeeSetIterator struct {
+ Event *RewardsCoordinatorStorageOptInForProtocolFeeSet // 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 *RewardsCoordinatorStorageOptInForProtocolFeeSetIterator) 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(RewardsCoordinatorStorageOptInForProtocolFeeSet)
+ 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(RewardsCoordinatorStorageOptInForProtocolFeeSet)
+ 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 *RewardsCoordinatorStorageOptInForProtocolFeeSetIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *RewardsCoordinatorStorageOptInForProtocolFeeSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// RewardsCoordinatorStorageOptInForProtocolFeeSet represents a OptInForProtocolFeeSet event raised by the RewardsCoordinatorStorage contract.
+type RewardsCoordinatorStorageOptInForProtocolFeeSet struct {
+ Submitter common.Address
+ OldValue bool
+ NewValue bool
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterOptInForProtocolFeeSet is a free log retrieval operation binding the contract event 0xbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd2.
+//
+// Solidity: event OptInForProtocolFeeSet(address indexed submitter, bool indexed oldValue, bool indexed newValue)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterOptInForProtocolFeeSet(opts *bind.FilterOpts, submitter []common.Address, oldValue []bool, newValue []bool) (*RewardsCoordinatorStorageOptInForProtocolFeeSetIterator, error) {
+
+ var submitterRule []interface{}
+ for _, submitterItem := range submitter {
+ submitterRule = append(submitterRule, submitterItem)
+ }
+ var oldValueRule []interface{}
+ for _, oldValueItem := range oldValue {
+ oldValueRule = append(oldValueRule, oldValueItem)
+ }
+ var newValueRule []interface{}
+ for _, newValueItem := range newValue {
+ newValueRule = append(newValueRule, newValueItem)
+ }
+
+ logs, sub, err := _RewardsCoordinatorStorage.contract.FilterLogs(opts, "OptInForProtocolFeeSet", submitterRule, oldValueRule, newValueRule)
+ if err != nil {
+ return nil, err
+ }
+ return &RewardsCoordinatorStorageOptInForProtocolFeeSetIterator{contract: _RewardsCoordinatorStorage.contract, event: "OptInForProtocolFeeSet", logs: logs, sub: sub}, nil
+}
+
+// WatchOptInForProtocolFeeSet is a free log subscription operation binding the contract event 0xbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd2.
+//
+// Solidity: event OptInForProtocolFeeSet(address indexed submitter, bool indexed oldValue, bool indexed newValue)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchOptInForProtocolFeeSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageOptInForProtocolFeeSet, submitter []common.Address, oldValue []bool, newValue []bool) (event.Subscription, error) {
+
+ var submitterRule []interface{}
+ for _, submitterItem := range submitter {
+ submitterRule = append(submitterRule, submitterItem)
+ }
+ var oldValueRule []interface{}
+ for _, oldValueItem := range oldValue {
+ oldValueRule = append(oldValueRule, oldValueItem)
+ }
+ var newValueRule []interface{}
+ for _, newValueItem := range newValue {
+ newValueRule = append(newValueRule, newValueItem)
+ }
+
+ logs, sub, err := _RewardsCoordinatorStorage.contract.WatchLogs(opts, "OptInForProtocolFeeSet", submitterRule, oldValueRule, newValueRule)
+ 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(RewardsCoordinatorStorageOptInForProtocolFeeSet)
+ if err := _RewardsCoordinatorStorage.contract.UnpackLog(event, "OptInForProtocolFeeSet", 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
+}
+
+// ParseOptInForProtocolFeeSet is a log parse operation binding the contract event 0xbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd2.
+//
+// Solidity: event OptInForProtocolFeeSet(address indexed submitter, bool indexed oldValue, bool indexed newValue)
+func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseOptInForProtocolFeeSet(log types.Log) (*RewardsCoordinatorStorageOptInForProtocolFeeSet, error) {
+ event := new(RewardsCoordinatorStorageOptInForProtocolFeeSet)
+ if err := _RewardsCoordinatorStorage.contract.UnpackLog(event, "OptInForProtocolFeeSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
// RewardsCoordinatorStorageRewardsClaimedIterator is returned from FilterRewardsClaimed and is used to iterate over the raw logs and unpacked data for RewardsClaimed events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageRewardsClaimedIterator struct {
Event *RewardsCoordinatorStorageRewardsClaimed // Event containing the contract specifics and raw log
diff --git a/pkg/bindings/StrategyBase/binding.go b/pkg/bindings/StrategyBase/binding.go
index aeb50b8471..22cfc2f43f 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\":[{\"name\":\"amountOut\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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: "0x60c060405234801561000f575f5ffd5b5060405161131a38038061131a83398101604081905261002e9161014b565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610183565b5f54610100900460ff16156100e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610132575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610148575f5ffd5b50565b5f5f6040838503121561015c575f5ffd5b825161016781610134565b602084015190925061017881610134565b809150509250929050565b60805160a0516111536101c75f395f81816101750152818161034a0152818161064301526106c501525f818161022b015281816108730152610bf101526111535ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063886f1195116100a9578063ce7c2ac21161006e578063ce7c2ac21461029b578063d9caed12146102ae578063e3dae51c146102c1578063f3e73875146102d4578063fabc1cbc146102e7575f5ffd5b8063886f1195146102265780638c8710191461024d5780638f6a624014610260578063ab5921e114610273578063c4d66de814610288575f5ffd5b8063553ca5f8116100ef578063553ca5f8146101c1578063595c6a67146101d45780635ac86ab7146101dc5780635c975abb1461020b5780637a8b263714610213575f5ffd5b8063136439dd1461012b5780632495a5991461014057806339b70e38146101705780633a98ef391461019757806347e7ef24146101ae575b5f5ffd5b61013e610139366004610ecb565b6102fa565b005b603254610153906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a060335481565b604051908152602001610167565b6101a06101bc366004610ef6565b610334565b6101a06101cf366004610f20565b610463565b61013e610476565b6101fb6101ea366004610f50565b6001805460ff9092161b9081161490565b6040519015158152602001610167565b6001546101a0565b6101a0610221366004610ecb565b61048a565b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101a061025b366004610ecb565b6104d3565b6101a061026e366004610f20565b6104dd565b61027b6104ea565b6040516101679190610f6b565b61013e610296366004610f20565b61050a565b6101a06102a9366004610f20565b61061c565b6101a06102bc366004610fa0565b6106ae565b6101a06102cf366004610ecb565b6107b0565b6101a06102e2366004610ecb565b6107e7565b61013e6102f5366004610ecb565b6107f1565b61030261085e565b60015481811681146103275760405163c61dca5d60e01b815260040160405180910390fd5b61033082610901565b5050565b5f5f61033f8161093e565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610388576040516348da714f60e01b815260040160405180910390fd5b6103928484610974565b6033545f6103a26103e883610ff2565b90505f6103e86103b06109a2565b6103ba9190610ff2565b90505f6103c78783611005565b9050806103d48489611018565b6103de919061102f565b9550855f0361040057604051630c392ed360e11b815260040160405180910390fd5b61040a8685610ff2565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561043f57604051632f14e8a360e11b815260040160405180910390fd5b610458826103e86033546104539190610ff2565b610a11565b505050505092915050565b5f6104706102218361061c565b92915050565b61047e61085e565b6104885f19610901565b565b5f5f6103e860335461049c9190610ff2565b90505f6103e86104aa6109a2565b6104b49190610ff2565b9050816104c18583611018565b6104cb919061102f565b949350505050565b5f610470826107b0565b5f6104706102e28361061c565b60606040518060800160405280604d81526020016110d1604d9139905090565b5f54610100900460ff161580801561052857505f54600160ff909116105b806105415750303b15801561054157505f5460ff166001145b6105a95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156105ca575f805461ff0019166101001790555b6105d382610a5d565b8015610330575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa15801561068a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610470919061104e565b5f60016106ba8161093e565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610703576040516348da714f60e01b815260040160405180910390fd5b61070e858585610ba8565b6033548084111561073257604051630b469df360e41b815260040160405180910390fd5b5f61073f6103e883610ff2565b90505f6103e861074d6109a2565b6107579190610ff2565b9050816107648783611018565b61076e919061102f565b945061077a8684611005565b60335561079a61078a8683611005565b6103e86033546104539190610ff2565b6107a5888887610bdb565b505050509392505050565b5f5f6103e86033546107c29190610ff2565b90505f6103e86107d06109a2565b6107da9190610ff2565b9050806104c18386611018565b5f6104708261048a565b6107f9610bef565b600154801982198116146108205760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156108c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108e49190611065565b61048857604051631d77d47760e21b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b610953816001805460ff9092161b9081161490565b156109715760405163840a48d560e01b815260040160405180910390fd5b50565b6032546001600160a01b0383811691161461033057604051630312abdd60e61b815260040160405180910390fd5b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa1580156109e8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0c919061104e565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610a4584670de0b6b3a7640000611018565b610a4f919061102f565b604051908152602001610610565b5f54610100900460ff16610ac75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016105a0565b603280546001600160a01b0319166001600160a01b038316179055610aeb5f610901565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b5d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b819190611084565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610bd657604051630312abdd60e61b815260040160405180910390fd5b505050565b610bd66001600160a01b0383168483610ca0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6f919061109f565b6001600160a01b0316336001600160a01b0316146104885760405163794821ff60e01b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610bd6928692915f91610d2f918516908490610dae565b905080515f1480610d4f575080806020019051810190610d4f9190611065565b610bd65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105a0565b60606104cb84845f85855f5f866001600160a01b03168587604051610dd391906110ba565b5f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b5091509150610e2387838387610e2e565b979650505050505050565b60608315610e9c5782515f03610e95576001600160a01b0385163b610e955760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105a0565b50816104cb565b6104cb8383815115610eb15781518083602001fd5b8060405162461bcd60e51b81526004016105a09190610f6b565b5f60208284031215610edb575f5ffd5b5035919050565b6001600160a01b0381168114610971575f5ffd5b5f5f60408385031215610f07575f5ffd5b8235610f1281610ee2565b946020939093013593505050565b5f60208284031215610f30575f5ffd5b8135610f3b81610ee2565b9392505050565b60ff81168114610971575f5ffd5b5f60208284031215610f60575f5ffd5b8135610f3b81610f42565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215610fb2575f5ffd5b8335610fbd81610ee2565b92506020840135610fcd81610ee2565b929592945050506040919091013590565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561047057610470610fde565b8181038181111561047057610470610fde565b808202811582820484141761047057610470610fde565b5f8261104957634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020828403121561105e575f5ffd5b5051919050565b5f60208284031215611075575f5ffd5b81518015158114610f3b575f5ffd5b5f60208284031215611094575f5ffd5b8151610f3b81610f42565b5f602082840312156110af575f5ffd5b8151610f3b81610ee2565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212203abe60d9a70d35e0604b29d164d1198d947fd7386d0235addc35df381d625d9264736f6c634300081e0033",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beforeAddShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beforeRemoveShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"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\":[{\"name\":\"amountOut\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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: "0x60c060405234801561000f575f5ffd5b5060405161139338038061139383398101604081905261002e9161014b565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610183565b5f54610100900460ff16156100e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610132575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610148575f5ffd5b50565b5f5f6040838503121561015c575f5ffd5b825161016781610134565b602084015190925061017881610134565b809150509250929050565b60805160a0516111c56101ce5f395f818161019e0152818161032e015281816103bc015281816106b5015261073701525f8181610254015281816108e50152610c6301526111c55ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c80637a8b2637116100b4578063c4d66de811610079578063c4d66de8146102b1578063ce7c2ac2146102c4578063d9caed12146102d7578063e3dae51c146102ea578063f3e73875146102fd578063fabc1cbc14610310575f5ffd5b80637a8b26371461023c578063886f11951461024f5780638c871019146102765780638f6a624014610289578063ab5921e11461029c575f5ffd5b806347e7ef241161010557806347e7ef24146101d7578063553ca5f8146101ea578063595c6a67146101fd5780635ac86ab7146102055780635c975abb1461023457806373e3c28014610141575f5ffd5b806303e3e6eb14610141578063136439dd146101565780632495a5991461016957806339b70e38146101995780633a98ef39146101c0575b5f5ffd5b61015461014f366004610f51565b610323565b005b610154610164366004610f7b565b610370565b60325461017c906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61017c7f000000000000000000000000000000000000000000000000000000000000000081565b6101c960335481565b604051908152602001610190565b6101c96101e5366004610f51565b6103a6565b6101c96101f8366004610f92565b6104d5565b6101546104e8565b610224610213366004610fc2565b6001805460ff9092161b9081161490565b6040519015158152602001610190565b6001546101c9565b6101c961024a366004610f7b565b6104fc565b61017c7f000000000000000000000000000000000000000000000000000000000000000081565b6101c9610284366004610f7b565b610545565b6101c9610297366004610f92565b61054f565b6102a461055c565b6040516101909190610fdd565b6101546102bf366004610f92565b61057c565b6101c96102d2366004610f92565b61068e565b6101c96102e5366004611012565b610720565b6101c96102f8366004610f7b565b610822565b6101c961030b366004610f7b565b610859565b61015461031e366004610f7b565b610863565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461036c576040516348da714f60e01b815260040160405180910390fd5b5050565b6103786108d0565b600154818116811461039d5760405163c61dca5d60e01b815260040160405180910390fd5b61036c82610973565b5f5f6103b1816109b0565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103fa576040516348da714f60e01b815260040160405180910390fd5b61040484846109e6565b6033545f6104146103e883611064565b90505f6103e8610422610a14565b61042c9190611064565b90505f6104398783611077565b905080610446848961108a565b61045091906110a1565b9550855f0361047257604051630c392ed360e11b815260040160405180910390fd5b61047c8685611064565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156104b157604051632f14e8a360e11b815260040160405180910390fd5b6104ca826103e86033546104c59190611064565b610a83565b505050505092915050565b5f6104e261024a8361068e565b92915050565b6104f06108d0565b6104fa5f19610973565b565b5f5f6103e860335461050e9190611064565b90505f6103e861051c610a14565b6105269190611064565b905081610533858361108a565b61053d91906110a1565b949350505050565b5f6104e282610822565b5f6104e261030b8361068e565b60606040518060800160405280604d8152602001611143604d9139905090565b5f54610100900460ff161580801561059a57505f54600160ff909116105b806105b35750303b1580156105b357505f5460ff166001145b61061b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561063c575f805461ff0019166101001790555b61064582610acf565b801561036c575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156106fc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e291906110c0565b5f600161072c816109b0565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610775576040516348da714f60e01b815260040160405180910390fd5b610780858585610c1a565b603354808411156107a457604051630b469df360e41b815260040160405180910390fd5b5f6107b16103e883611064565b90505f6103e86107bf610a14565b6107c99190611064565b9050816107d6878361108a565b6107e091906110a1565b94506107ec8684611077565b60335561080c6107fc8683611077565b6103e86033546104c59190611064565b610817888887610c4d565b505050509392505050565b5f5f6103e86033546108349190611064565b90505f6103e8610842610a14565b61084c9190611064565b905080610533838661108a565b5f6104e2826104fc565b61086b610c61565b600154801982198116146108925760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610932573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095691906110d7565b6104fa57604051631d77d47760e21b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6109c5816001805460ff9092161b9081161490565b156109e35760405163840a48d560e01b815260040160405180910390fd5b50565b6032546001600160a01b0383811691161461036c57604051630312abdd60e61b815260040160405180910390fd5b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a5a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7e91906110c0565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610ab784670de0b6b3a764000061108a565b610ac191906110a1565b604051908152602001610682565b5f54610100900460ff16610b395760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610612565b603280546001600160a01b0319166001600160a01b038316179055610b5d5f610973565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bcf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf391906110f6565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610c4857604051630312abdd60e61b815260040160405180910390fd5b505050565b610c486001600160a01b0383168483610d12565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cbd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce19190611111565b6001600160a01b0316336001600160a01b0316146104fa5760405163794821ff60e01b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610c48928692915f91610da1918516908490610e20565b905080515f1480610dc1575080806020019051810190610dc191906110d7565b610c485760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610612565b606061053d84845f85855f5f866001600160a01b03168587604051610e45919061112c565b5f6040518083038185875af1925050503d805f8114610e7f576040519150601f19603f3d011682016040523d82523d5f602084013e610e84565b606091505b5091509150610e9587838387610ea0565b979650505050505050565b60608315610f0e5782515f03610f07576001600160a01b0385163b610f075760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610612565b508161053d565b61053d8383815115610f235781518083602001fd5b8060405162461bcd60e51b81526004016106129190610fdd565b6001600160a01b03811681146109e3575f5ffd5b5f5f60408385031215610f62575f5ffd5b8235610f6d81610f3d565b946020939093013593505050565b5f60208284031215610f8b575f5ffd5b5035919050565b5f60208284031215610fa2575f5ffd5b8135610fad81610f3d565b9392505050565b60ff811681146109e3575f5ffd5b5f60208284031215610fd2575f5ffd5b8135610fad81610fb4565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215611024575f5ffd5b833561102f81610f3d565b9250602084013561103f81610f3d565b929592945050506040919091013590565b634e487b7160e01b5f52601160045260245ffd5b808201808211156104e2576104e2611050565b818103818111156104e2576104e2611050565b80820281158282048414176104e2576104e2611050565b5f826110bb57634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156110d0575f5ffd5b5051919050565b5f602082840312156110e7575f5ffd5b81518015158114610fad575f5ffd5b5f60208284031215611106575f5ffd5b8151610fad81610fb4565b5f60208284031215611121575f5ffd5b8151610fad81610f3d565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220c0caa0194e6d2c848722fddbdc7fd62faf324a4ddb472064726dcb9f3f160fe764736f6c634300081e0033",
}
// StrategyBaseABI is the input ABI used to generate the binding from.
@@ -605,6 +605,48 @@ func (_StrategyBase *StrategyBaseCallerSession) UserUnderlyingView(user common.A
return _StrategyBase.Contract.UserUnderlyingView(&_StrategyBase.CallOpts, user)
}
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address , uint256 ) returns()
+func (_StrategyBase *StrategyBaseTransactor) BeforeAddShares(opts *bind.TransactOpts, arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _StrategyBase.contract.Transact(opts, "beforeAddShares", arg0, arg1)
+}
+
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address , uint256 ) returns()
+func (_StrategyBase *StrategyBaseSession) BeforeAddShares(arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _StrategyBase.Contract.BeforeAddShares(&_StrategyBase.TransactOpts, arg0, arg1)
+}
+
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address , uint256 ) returns()
+func (_StrategyBase *StrategyBaseTransactorSession) BeforeAddShares(arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _StrategyBase.Contract.BeforeAddShares(&_StrategyBase.TransactOpts, arg0, arg1)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address , uint256 ) returns()
+func (_StrategyBase *StrategyBaseTransactor) BeforeRemoveShares(opts *bind.TransactOpts, arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _StrategyBase.contract.Transact(opts, "beforeRemoveShares", arg0, arg1)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address , uint256 ) returns()
+func (_StrategyBase *StrategyBaseSession) BeforeRemoveShares(arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _StrategyBase.Contract.BeforeRemoveShares(&_StrategyBase.TransactOpts, arg0, arg1)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address , uint256 ) returns()
+func (_StrategyBase *StrategyBaseTransactorSession) BeforeRemoveShares(arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _StrategyBase.Contract.BeforeRemoveShares(&_StrategyBase.TransactOpts, arg0, arg1)
+}
+
// 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 b55e95c3fe..60ba4232fa 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\":[{\"name\":\"amountOut\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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: "0x60c060405234801561000f575f5ffd5b506040516115f73803806115f783398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a05161142c6101cb5f395f81816101ce015281816103f50152818161077d01526107ff01525f81816102960152818161099a0152610b02015261142c5ff3fe608060405234801561000f575f5ffd5b506004361061016d575f3560e01c80637a8b2637116100d9578063c4d66de811610093578063df6fadc11161006e578063df6fadc11461033f578063e3dae51c1461035a578063f3e738751461036d578063fabc1cbc14610380575f5ffd5b8063c4d66de814610306578063ce7c2ac214610319578063d9caed121461032c575f5ffd5b80637a8b26371461027e578063886f1195146102915780638c871019146102b85780638f6a6240146102cb578063a6ab36f2146102de578063ab5921e1146102f1575f5ffd5b806347e7ef241161012a57806347e7ef2414610210578063553ca5f814610223578063595c6a67146102365780635ac86ab71461023e5780635c975abb1461026d57806361b01b5d14610275575f5ffd5b806311c70c9d14610171578063136439dd146101865780632495a5991461019957806339b70e38146101c95780633a98ef39146101f057806343fe08b014610207575b5f5ffd5b61018461017f366004611100565b610393565b005b610184610194366004611120565b6103a9565b6032546101ac906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f960335481565b6040519081526020016101c0565b6101f960645481565b6101f961021e36600461114b565b6103df565b6101f9610231366004611175565b61050e565b610184610521565b61025d61024c3660046111a5565b6001805460ff9092161b9081161490565b60405190151581526020016101c0565b6001546101f9565b6101f960655481565b6101f961028c366004611120565b610535565b6101ac7f000000000000000000000000000000000000000000000000000000000000000081565b6101f96102c6366004611120565b61057e565b6101f96102d9366004611175565b610588565b6101846102ec3660046111c0565b610595565b6102f9610670565b6040516101c091906111f6565b610184610314366004611175565b610690565b6101f9610327366004611175565b610756565b6101f961033a36600461122b565b6107e8565b606454606554604080519283526020830191909152016101c0565b6101f9610368366004611120565b6108ea565b6101f961037b366004611120565b610921565b61018461038e366004611120565b61092b565b61039b610998565b6103a58282610a49565b5050565b6103b1610aed565b60015481811681146103d65760405163c61dca5d60e01b815260040160405180910390fd5b6103a582610b90565b5f5f6103ea81610bcd565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610433576040516348da714f60e01b815260040160405180910390fd5b61043d8484610c03565b6033545f61044d6103e88361127d565b90505f6103e861045b610c5a565b610465919061127d565b90505f6104728783611290565b90508061047f84896112a3565b61048991906112ba565b9550855f036104ab57604051630c392ed360e11b815260040160405180910390fd5b6104b5868561127d565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156104ea57604051632f14e8a360e11b815260040160405180910390fd5b610503826103e86033546104fe919061127d565b610cc9565b505050505092915050565b5f61051b61028c83610756565b92915050565b610529610aed565b6105335f19610b90565b565b5f5f6103e8603354610547919061127d565b90505f6103e8610555610c5a565b61055f919061127d565b90508161056c85836112a3565b61057691906112ba565b949350505050565b5f61051b826108ea565b5f61051b61037b83610756565b5f54610100900460ff16158080156105b357505f54600160ff909116105b806105cc5750303b1580156105cc57505f5460ff166001145b6105f15760405162461bcd60e51b81526004016105e8906112d9565b60405180910390fd5b5f805460ff191660011790558015610612575f805461ff0019166101001790555b61061c8484610a49565b61062582610d15565b801561066a575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60606040518060800160405280604d81526020016113aa604d9139905090565b5f54610100900460ff16158080156106ae57505f54600160ff909116105b806106c75750303b1580156106c757505f5460ff166001145b6106e35760405162461bcd60e51b81526004016105e8906112d9565b5f805460ff191660011790558015610704575f805461ff0019166101001790555b61070d82610d15565b80156103a5575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156107c4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051b9190611327565b5f60016107f481610bcd565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461083d576040516348da714f60e01b815260040160405180910390fd5b610848858585610e60565b6033548084111561086c57604051630b469df360e41b815260040160405180910390fd5b5f6108796103e88361127d565b90505f6103e8610887610c5a565b610891919061127d565b90508161089e87836112a3565b6108a891906112ba565b94506108b48684611290565b6033556108d46108c48683611290565b6103e86033546104fe919061127d565b6108df888887610e93565b505050509392505050565b5f5f6103e86033546108fc919061127d565b90505f6103e861090a610c5a565b610914919061127d565b90508061056c83866112a3565b5f61051b82610535565b610933610998565b6001548019821981161461095a5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109f4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a18919061133e565b6001600160a01b0316336001600160a01b0316146105335760405163794821ff60e01b815260040160405180910390fd5b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610ae25760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b4f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b739190611359565b61053357604051631d77d47760e21b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b610be2816001805460ff9092161b9081161490565b15610c005760405163840a48d560e01b815260040160405180910390fd5b50565b606454811115610c265760405163052b07b760e21b815260040160405180910390fd5b606554610c31610c5a565b1115610c505760405163d86bae6760e01b815260040160405180910390fd5b6103a58282610ea7565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ca0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc49190611327565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610cfd84670de0b6b3a76400006112a3565b610d0791906112ba565b60405190815260200161074a565b5f54610100900460ff16610d7f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016105e8565b603280546001600160a01b0319166001600160a01b038316179055610da35f610b90565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e15573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e399190611378565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610e8e57604051630312abdd60e61b815260040160405180910390fd5b505050565b610e8e6001600160a01b0383168483610ed5565b6032546001600160a01b038381169116146103a557604051630312abdd60e61b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610e8e928692915f91610f64918516908490610fe3565b905080515f1480610f84575080806020019051810190610f849190611359565b610e8e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105e8565b606061057684845f85855f5f866001600160a01b031685876040516110089190611393565b5f6040518083038185875af1925050503d805f8114611042576040519150601f19603f3d011682016040523d82523d5f602084013e611047565b606091505b509150915061105887838387611063565b979650505050505050565b606083156110d15782515f036110ca576001600160a01b0385163b6110ca5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105e8565b5081610576565b61057683838151156110e65781518083602001fd5b8060405162461bcd60e51b81526004016105e891906111f6565b5f5f60408385031215611111575f5ffd5b50508035926020909101359150565b5f60208284031215611130575f5ffd5b5035919050565b6001600160a01b0381168114610c00575f5ffd5b5f5f6040838503121561115c575f5ffd5b823561116781611137565b946020939093013593505050565b5f60208284031215611185575f5ffd5b813561119081611137565b9392505050565b60ff81168114610c00575f5ffd5b5f602082840312156111b5575f5ffd5b813561119081611197565b5f5f5f606084860312156111d2575f5ffd5b833592506020840135915060408401356111eb81611137565b809150509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f6060848603121561123d575f5ffd5b833561124881611137565b9250602084013561125881611137565b929592945050506040919091013590565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561051b5761051b611269565b8181038181111561051b5761051b611269565b808202811582820484141761051b5761051b611269565b5f826112d457634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f60208284031215611337575f5ffd5b5051919050565b5f6020828403121561134e575f5ffd5b815161119081611137565b5f60208284031215611369575f5ffd5b81518015158114611190575f5ffd5b5f60208284031215611388575f5ffd5b815161119081611197565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220d3746c383368871009e44f7ae962ddb31f64bef2f69a89f96760599304322c1c64736f6c634300081e0033",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beforeAddShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beforeRemoveShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"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\":[{\"name\":\"amountOut\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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: "0x60c060405234801561000f575f5ffd5b5060405161168e38038061168e83398101604081905261002e9161014f565b8181806001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a05261007361007c565b50505050610187565b5f54610100900460ff16156100e75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610136575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014c575f5ffd5b50565b5f5f60408385031215610160575f5ffd5b825161016b81610138565b602084015190925061017c81610138565b809150509250929050565b60805160a0516114bc6101d25f395f8181610215015281816103e5015281816104850152818161080d015261088f01525f81816102dd01528181610a2a0152610b9201526114bc5ff3fe608060405234801561000f575f5ffd5b50600436106101a1575f3560e01c806373e3c280116100f3578063c4d66de811610093578063df6fadc11161006e578063df6fadc114610386578063e3dae51c146103a1578063f3e73875146103b4578063fabc1cbc146103c7575f5ffd5b8063c4d66de81461034d578063ce7c2ac214610360578063d9caed1214610373575f5ffd5b80638c871019116100ce5780638c871019146102ff5780638f6a624014610312578063a6ab36f214610325578063ab5921e114610338575f5ffd5b806373e3c280146101a55780637a8b2637146102c5578063886f1195146102d8575f5ffd5b806343fe08b01161015e578063595c6a6711610139578063595c6a671461027d5780635ac86ab7146102855780635c975abb146102b457806361b01b5d146102bc575f5ffd5b806343fe08b01461024e57806347e7ef2414610257578063553ca5f81461026a575f5ffd5b806303e3e6eb146101a557806311c70c9d146101ba578063136439dd146101cd5780632495a599146101e057806339b70e38146102105780633a98ef3914610237575b5f5ffd5b6101b86101b33660046111a4565b6103da565b005b6101b86101c83660046111ce565b610427565b6101b86101db3660046111ee565b610439565b6032546101f3906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b61024060335481565b604051908152602001610207565b61024060645481565b6102406102653660046111a4565b61046f565b610240610278366004611205565b61059e565b6101b86105b1565b6102a4610293366004611235565b6001805460ff9092161b9081161490565b6040519015158152602001610207565b600154610240565b61024060655481565b6102406102d33660046111ee565b6105c5565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b61024061030d3660046111ee565b61060e565b610240610320366004611205565b610618565b6101b8610333366004611250565b610625565b610340610700565b6040516102079190611286565b6101b861035b366004611205565b610720565b61024061036e366004611205565b6107e6565b6102406103813660046112bb565b610878565b60645460655460408051928352602083019190915201610207565b6102406103af3660046111ee565b61097a565b6102406103c23660046111ee565b6109b1565b6101b86103d53660046111ee565b6109bb565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610423576040516348da714f60e01b815260040160405180910390fd5b5050565b61042f610a28565b6104238282610ad9565b610441610b7d565b60015481811681146104665760405163c61dca5d60e01b815260040160405180910390fd5b61042382610c20565b5f5f61047a81610c5d565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c3576040516348da714f60e01b815260040160405180910390fd5b6104cd8484610c93565b6033545f6104dd6103e88361130d565b90505f6103e86104eb610cea565b6104f5919061130d565b90505f6105028783611320565b90508061050f8489611333565b610519919061134a565b9550855f0361053b57604051630c392ed360e11b815260040160405180910390fd5b610545868561130d565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561057a57604051632f14e8a360e11b815260040160405180910390fd5b610593826103e860335461058e919061130d565b610d59565b505050505092915050565b5f6105ab6102d3836107e6565b92915050565b6105b9610b7d565b6105c35f19610c20565b565b5f5f6103e86033546105d7919061130d565b90505f6103e86105e5610cea565b6105ef919061130d565b9050816105fc8583611333565b610606919061134a565b949350505050565b5f6105ab8261097a565b5f6105ab6103c2836107e6565b5f54610100900460ff161580801561064357505f54600160ff909116105b8061065c5750303b15801561065c57505f5460ff166001145b6106815760405162461bcd60e51b815260040161067890611369565b60405180910390fd5b5f805460ff1916600117905580156106a2575f805461ff0019166101001790555b6106ac8484610ad9565b6106b582610da5565b80156106fa575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60606040518060800160405280604d815260200161143a604d9139905090565b5f54610100900460ff161580801561073e57505f54600160ff909116105b806107575750303b15801561075757505f5460ff166001145b6107735760405162461bcd60e51b815260040161067890611369565b5f805460ff191660011790558015610794575f805461ff0019166101001790555b61079d82610da5565b8015610423575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa158015610854573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105ab91906113b7565b5f600161088481610c5d565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108cd576040516348da714f60e01b815260040160405180910390fd5b6108d8858585610ef0565b603354808411156108fc57604051630b469df360e41b815260040160405180910390fd5b5f6109096103e88361130d565b90505f6103e8610917610cea565b610921919061130d565b90508161092e8783611333565b610938919061134a565b94506109448684611320565b6033556109646109548683611320565b6103e860335461058e919061130d565b61096f888887610f23565b505050509392505050565b5f5f6103e860335461098c919061130d565b90505f6103e861099a610cea565b6109a4919061130d565b9050806105fc8386611333565b5f6105ab826105c5565b6109c3610a28565b600154801982198116146109ea5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a84573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa891906113ce565b6001600160a01b0316336001600160a01b0316146105c35760405163794821ff60e01b815260040160405180910390fd5b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610b725760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610bdf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0391906113e9565b6105c357604051631d77d47760e21b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b610c72816001805460ff9092161b9081161490565b15610c905760405163840a48d560e01b815260040160405180910390fd5b50565b606454811115610cb65760405163052b07b760e21b815260040160405180910390fd5b606554610cc1610cea565b1115610ce05760405163d86bae6760e01b815260040160405180910390fd5b6104238282610f37565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d30573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5491906113b7565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610d8d84670de0b6b3a7640000611333565b610d97919061134a565b6040519081526020016107da565b5f54610100900460ff16610e0f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610678565b603280546001600160a01b0319166001600160a01b038316179055610e335f610c20565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec99190611408565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610f1e57604051630312abdd60e61b815260040160405180910390fd5b505050565b610f1e6001600160a01b0383168483610f65565b6032546001600160a01b0383811691161461042357604051630312abdd60e61b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610f1e928692915f91610ff4918516908490611073565b905080515f148061101457508080602001905181019061101491906113e9565b610f1e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610678565b606061060684845f85855f5f866001600160a01b031685876040516110989190611423565b5f6040518083038185875af1925050503d805f81146110d2576040519150601f19603f3d011682016040523d82523d5f602084013e6110d7565b606091505b50915091506110e8878383876110f3565b979650505050505050565b606083156111615782515f0361115a576001600160a01b0385163b61115a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610678565b5081610606565b61060683838151156111765781518083602001fd5b8060405162461bcd60e51b81526004016106789190611286565b6001600160a01b0381168114610c90575f5ffd5b5f5f604083850312156111b5575f5ffd5b82356111c081611190565b946020939093013593505050565b5f5f604083850312156111df575f5ffd5b50508035926020909101359150565b5f602082840312156111fe575f5ffd5b5035919050565b5f60208284031215611215575f5ffd5b813561122081611190565b9392505050565b60ff81168114610c90575f5ffd5b5f60208284031215611245575f5ffd5b813561122081611227565b5f5f5f60608486031215611262575f5ffd5b8335925060208401359150604084013561127b81611190565b809150509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f606084860312156112cd575f5ffd5b83356112d881611190565b925060208401356112e881611190565b929592945050506040919091013590565b634e487b7160e01b5f52601160045260245ffd5b808201808211156105ab576105ab6112f9565b818103818111156105ab576105ab6112f9565b80820281158282048414176105ab576105ab6112f9565b5f8261136457634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156113c7575f5ffd5b5051919050565b5f602082840312156113de575f5ffd5b815161122081611190565b5f602082840312156113f9575f5ffd5b81518015158114611220575f5ffd5b5f60208284031215611418575f5ffd5b815161122081611227565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220376a891b3700d3eae28d5932faaebcee6671a6353087d1edf844221ab7c7b8b164736f6c634300081e0033",
}
// StrategyBaseTVLLimitsABI is the input ABI used to generate the binding from.
@@ -699,6 +699,48 @@ func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCallerSession) UserUnderlying
return _StrategyBaseTVLLimits.Contract.UserUnderlyingView(&_StrategyBaseTVLLimits.CallOpts, user)
}
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address , uint256 ) returns()
+func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsTransactor) BeforeAddShares(opts *bind.TransactOpts, arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _StrategyBaseTVLLimits.contract.Transact(opts, "beforeAddShares", arg0, arg1)
+}
+
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address , uint256 ) returns()
+func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsSession) BeforeAddShares(arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _StrategyBaseTVLLimits.Contract.BeforeAddShares(&_StrategyBaseTVLLimits.TransactOpts, arg0, arg1)
+}
+
+// BeforeAddShares is a paid mutator transaction binding the contract method 0x73e3c280.
+//
+// Solidity: function beforeAddShares(address , uint256 ) returns()
+func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsTransactorSession) BeforeAddShares(arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _StrategyBaseTVLLimits.Contract.BeforeAddShares(&_StrategyBaseTVLLimits.TransactOpts, arg0, arg1)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address , uint256 ) returns()
+func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsTransactor) BeforeRemoveShares(opts *bind.TransactOpts, arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _StrategyBaseTVLLimits.contract.Transact(opts, "beforeRemoveShares", arg0, arg1)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address , uint256 ) returns()
+func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsSession) BeforeRemoveShares(arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _StrategyBaseTVLLimits.Contract.BeforeRemoveShares(&_StrategyBaseTVLLimits.TransactOpts, arg0, arg1)
+}
+
+// BeforeRemoveShares is a paid mutator transaction binding the contract method 0x03e3e6eb.
+//
+// Solidity: function beforeRemoveShares(address , uint256 ) returns()
+func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsTransactorSession) BeforeRemoveShares(arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) {
+ return _StrategyBaseTVLLimits.Contract.BeforeRemoveShares(&_StrategyBaseTVLLimits.TransactOpts, arg0, arg1)
+}
+
// 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 574ccade1c..04510e34fe 100644
--- a/pkg/bindings/StrategyFactory/binding.go
+++ b/pkg/bindings/StrategyFactory/binding.go
@@ -29,10 +29,31 @@ var (
_ = abi.ConvertType
)
+// IDurationVaultStrategyTypesVaultConfig is an auto generated low-level Go binding around an user-defined struct.
+type IDurationVaultStrategyTypesVaultConfig struct {
+ UnderlyingToken common.Address
+ VaultAdmin common.Address
+ Arbitrator common.Address
+ Duration uint32
+ MaxPerDeposit *big.Int
+ StakeCap *big.Int
+ MetadataURI string
+ OperatorSet OperatorSet
+ OperatorSetRegistrationData []byte
+ DelegationApprover common.Address
+ OperatorMetadataURI string
+}
+
+// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
+type OperatorSet struct {
+ Avs common.Address
+ Id uint32
+}
+
// 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: "0x60c060405234801561000f575f5ffd5b506040516118d83803806118d883398101604081905261002e9161014e565b806001600160a01b038116610056576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03908116608052821660a052610071610078565b5050610186565b603354610100900460ff16156100e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60335460ff90811614610135576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461014b575f5ffd5b50565b5f5f6040838503121561015f575f5ffd5b825161016a81610137565b602084015190925061017b81610137565b809150509250929050565b60805160a0516117076101d15f395f81816101420152818161053a01528181610714015281816107b10152610a4901525f818161021501528181610a950152610d0901526117075ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c8063886f11951161009e578063f0062d9a1161006e578063f0062d9a1461026e578063f2fde38b14610280578063fabc1cbc14610293578063fe38b32d146102a6578063fe575a87146102b9575f5ffd5b8063886f1195146102105780638da5cb5b14610237578063b768ebc914610248578063c350a1b51461025b575f5ffd5b8063595c6a67116100e4578063595c6a67146101a95780635ac86ab7146101b15780635c975abb146101e45780636b9b6229146101f5578063715018a614610208575f5ffd5b8063136439dd1461011557806323103c411461012a57806339b70e381461013d578063581dfd6514610181575b5f5ffd5b610128610123366004610dc5565b6102db565b005b610128610138366004610e24565b610315565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461018f366004610e77565b60016020525f90815260409020546001600160a01b031681565b6101286105a3565b6101d46101bf366004610e99565b609954600160ff9092169190911b9081161490565b6040519015158152602001610178565b609954604051908152602001610178565b610164610203366004610e77565b6105b7565b610128610781565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6066546001600160a01b0316610164565b610128610256366004610e24565b610792565b610128610269366004610eb9565b610819565b5f54610164906001600160a01b031681565b61012861028e366004610e77565b610944565b6101286102a1366004610dc5565b6109bd565b6101286102b4366004610e24565b610a2a565b6101d46102c7366004610e77565b60026020525f908152604090205460ff1681565b6102e3610a80565b60995481811681146103085760405163c61dca5d60e01b815260040160405180910390fd5b61031182610b23565b5050565b61031d610b60565b5f8167ffffffffffffffff81111561033757610337610ef8565b604051908082528060200260200182016040528015610360578160200160208202803683370190505b5090505f805b838110156105195760025f86868481811061038357610383610f0c565b90506020020160208101906103989190610e77565b6001600160a01b0316815260208101919091526040015f205460ff16156103d25760405163f53de75f60e01b815260040160405180910390fd5b600160025f8787858181106103e9576103e9610f0c565b90506020020160208101906103fe9190610e77565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b385858381811061045857610458610f0c565b905060200201602081019061046d9190610e77565b6040516001600160a01b03909116815260200160405180910390a15f60015f87878581811061049e5761049e610f0c565b90506020020160208101906104b39190610e77565b6001600160a01b03908116825260208201929092526040015f2054169050801561051057808484815181106104ea576104ea610f0c565b6001600160a01b03909216602092830291909101909101528261050c81610f20565b9350505b50600101610366565b50808252801561059d576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061056f908590600401610f44565b5f604051808303815f87803b158015610586575f5ffd5b505af1158015610598573d5f5f3e3d5ffd5b505050505b50505050565b6105ab610a80565b6105b55f19610b23565b565b5f5f6105c281610bba565b6001600160a01b0383165f9081526002602052604090205460ff16156105fb5760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b038381165f9081526001602052604090205416156106335760405163c45546f760e01b815260040160405180910390fd5b5f8054604080516001600160a01b0387811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663189acdbd60e31b179052915191909216919061068a90610db8565b610695929190610f8f565b604051809103905ff0801580156106ae573d5f5f3e3d5ffd5b5090506106bb8482610be5565b6040805160018082528183019092525f916020808301908036833701905050905081815f815181106106ef576106ef610f0c565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff29061074b908490600401610f44565b5f604051808303815f87803b158015610762575f5ffd5b505af1158015610774573d5f5f3e3d5ffd5b5093979650505050505050565b610789610b60565b6105b55f610c4f565b61079a610b60565b604051632ef047f960e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635de08ff2906107e89085908590600401610fd3565b5f604051808303815f87803b1580156107ff575f5ffd5b505af1158015610811573d5f5f3e3d5ffd5b505050505050565b603354610100900460ff16158080156108395750603354600160ff909116105b806108535750303b158015610853575060335460ff166001145b6108bb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff1916600117905580156108de576033805461ff0019166101001790555b6108e784610c4f565b6108f083610b23565b6108f982610ca0565b801561059d576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b61094c610b60565b6001600160a01b0381166109b15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108b2565b6109ba81610c4f565b50565b6109c5610d07565b609954801982198116146109ec5760405163c61dca5d60e01b815260040160405180910390fd5b609982905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b610a32610b60565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b8906107e89085908590600401610fd3565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610ae2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b06919061101f565b6105b557604051631d77d47760e21b815260040160405180910390fd5b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6066546001600160a01b031633146105b55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b2565b609954600160ff83161b908116036109ba5760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038281165f8181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d63573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d87919061103e565b6001600160a01b0316336001600160a01b0316146105b55760405163794821ff60e01b815260040160405180910390fd5b6106788061105a83390190565b5f60208284031215610dd5575f5ffd5b5035919050565b5f5f83601f840112610dec575f5ffd5b50813567ffffffffffffffff811115610e03575f5ffd5b6020830191508360208260051b8501011115610e1d575f5ffd5b9250929050565b5f5f60208385031215610e35575f5ffd5b823567ffffffffffffffff811115610e4b575f5ffd5b610e5785828601610ddc565b90969095509350505050565b6001600160a01b03811681146109ba575f5ffd5b5f60208284031215610e87575f5ffd5b8135610e9281610e63565b9392505050565b5f60208284031215610ea9575f5ffd5b813560ff81168114610e92575f5ffd5b5f5f5f60608486031215610ecb575f5ffd5b8335610ed681610e63565b9250602084013591506040840135610eed81610e63565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60018201610f3d57634e487b7160e01b5f52601160045260245ffd5b5060010190565b602080825282518282018190525f918401906040840190835b81811015610f845783516001600160a01b0316835260209384019390920191600101610f5d565b509095945050505050565b60018060a01b0383168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602080825281018290525f8360408301825b85811015611015578235610ff881610e63565b6001600160a01b0316825260209283019290910190600101610fe5565b5095945050505050565b5f6020828403121561102f575f5ffd5b81518015158114610e92575f5ffd5b5f6020828403121561104e575f5ffd5b8151610e9281610e6356fe6080604052604051610678380380610678833981016040819052610022916103ed565b61002d82825f610034565b5050610513565b61003d836100f1565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a25f8251118061007c5750805b156100ec576100ea836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906104af565b83610273565b505b505050565b6001600160a01b0381163b61015b5760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101cd816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101be91906104af565b6001600160a01b03163b151590565b6102325760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610152565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029883836040518060600160405280602781526020016106516027913961029f565b9392505050565b60605f5f856001600160a01b0316856040516102bb91906104c8565b5f60405180830381855af49150503d805f81146102f3576040519150601f19603f3d011682016040523d82523d5f602084013e6102f8565b606091505b50909250905061030a86838387610314565b9695505050505050565b606083156103825782515f0361037b576001600160a01b0385163b61037b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b508161038c565b61038c8383610394565b949350505050565b8151156103a45781518083602001fd5b8060405162461bcd60e51b815260040161015291906104de565b80516001600160a01b03811681146103d4575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156103fe575f5ffd5b610407836103be565b60208401519092506001600160401b03811115610422575f5ffd5b8301601f81018513610432575f5ffd5b80516001600160401b0381111561044b5761044b6103d9565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610479576104796103d9565b604052818152828201602001871015610490575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b5f602082840312156104bf575f5ffd5b610298826103be565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b610131806105205f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b60b3565b565b5f60527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015608c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ae919060d0565b905090565b365f5f375f5f365f845af43d5f5f3e80801560cc573d5ff35b3d5ffd5b5f6020828403121560df575f5ffd5b81516001600160a01b038116811460f4575f5ffd5b939250505056fea26469706673582212207b94aecb5f7696f142cc1acc4dea07c18e8f9d41766baf4a3c001a89adb8a8a764736f6c634300081e0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122079e99ec0e4da1dd64a17d71556c45401acdb4d52d3fe3ffd913386d5e9055a8064736f6c634300081e0033",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_strategyBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_durationVaultBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blacklistTokens\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployDurationVaultStrategy\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structIDurationVaultStrategyTypes.VaultConfig\",\"components\":[{\"name\":\"underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"vaultAdmin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"arbitrator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stakeCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorSetRegistrationData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorMetadataURI\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"newVault\",\"type\":\"address\",\"internalType\":\"contractIDurationVaultStrategy\"}],\"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\":\"durationVaultBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"durationVaultsByToken\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDurationVaultStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDurationVaults\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIDurationVaultStrategy[]\"}],\"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\":\"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\":\"DurationVaultDeployed\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"contractIDurationVaultStrategy\"},{\"name\":\"underlyingToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"contractIERC20\"},{\"name\":\"vaultAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"duration\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"maxPerDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"stakeCap\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"operatorSetAVS\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"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\":\"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\":\"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: "0x610100604052348015610010575f5ffd5b50604051611fbc380380611fbc83398101604081905261002f9161015d565b826001600160a01b038116610057576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805284811660a05282811660c052811660e05261007e610087565b505050506101b9565b603354610100900460ff16156100f35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60335460ff90811614610144576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461015a575f5ffd5b50565b5f5f5f5f60808587031215610170575f5ffd5b845161017b81610146565b602086015190945061018c81610146565b604086015190935061019d81610146565b60608601519092506101ae81610146565b939692955090935050565b60805160a05160c05160e051611d9161022b5f395f818161028c0152610be701525f81816102f9015261075d01525f818161019e015281816105e8015281816108100152818161092001528181610d1b0152610db101525f818161025401528181610dfd015261100a0152611d915ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c80638da5cb5b116100b4578063f0062d9a11610079578063f0062d9a146102f4578063f2fde38b1461031b578063fabc1cbc1461032e578063fb51530314610341578063fe38b32d14610354578063fe575a8714610367575f5ffd5b80638da5cb5b146102765780639e4f2dcd14610287578063a5dae840146102ae578063b768ebc9146102ce578063cd6dc687146102e1575f5ffd5b8063595c6a6711610105578063595c6a67146101e85780635ac86ab7146101f05780635c975abb146102235780636b9b622914610234578063715018a614610247578063886f11951461024f575f5ffd5b8063136439dd1461014157806323103c41146101565780633101d5311461016957806339b70e3814610199578063581dfd65146101c0575b5f5ffd5b61015461014f366004611181565b610389565b005b6101546101643660046111e0565b6103c3565b61017c610177366004611243565b610651565b6040516001600160a01b0390911681526020015b60405180910390f35b61017c7f000000000000000000000000000000000000000000000000000000000000000081565b61017c6101ce36600461126d565b60016020525f90815260409020546001600160a01b031681565b610154610685565b6102136101fe36600461128f565b609954600160ff9092169190911b9081161490565b6040519015158152602001610190565b609954604051908152602001610190565b61017c61024236600461126d565b610699565b61015461087d565b61017c7f000000000000000000000000000000000000000000000000000000000000000081565b6066546001600160a01b031661017c565b61017c7f000000000000000000000000000000000000000000000000000000000000000081565b6102c16102bc36600461126d565b61088e565b60405161019091906112af565b6101546102dc3660046111e0565b610901565b6101546102ef366004611243565b610988565b61017c7f000000000000000000000000000000000000000000000000000000000000000081565b61015461032936600461126d565b610aaa565b61015461033c366004611181565b610b23565b61017c61034f3660046112fa565b610b90565b6101546103623660046111e0565b610d92565b61021361037536600461126d565b60026020525f908152604090205460ff1681565b610391610de8565b60995481811681146103b65760405163c61dca5d60e01b815260040160405180910390fd5b6103bf82610e8b565b5050565b6103cb610ec8565b5f8167ffffffffffffffff8111156103e5576103e5611332565b60405190808252806020026020018201604052801561040e578160200160208202803683370190505b5090505f805b838110156105c75760025f86868481811061043157610431611346565b9050602002016020810190610446919061126d565b6001600160a01b0316815260208101919091526040015f205460ff16156104805760405163f53de75f60e01b815260040160405180910390fd5b600160025f87878581811061049757610497611346565b90506020020160208101906104ac919061126d565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b385858381811061050657610506611346565b905060200201602081019061051b919061126d565b6040516001600160a01b03909116815260200160405180910390a15f60015f87878581811061054c5761054c611346565b9050602002016020810190610561919061126d565b6001600160a01b03908116825260208201929092526040015f205416905080156105be578084848151811061059857610598611346565b6001600160a01b0390921660209283029190910190910152826105ba8161135a565b9350505b50600101610414565b50808252801561064b576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061061d9085906004016112af565b5f604051808303815f87803b158015610634575f5ffd5b505af1158015610646573d5f5f3e3d5ffd5b505050505b50505050565b6003602052815f5260405f20818154811061066a575f80fd5b5f918252602090912001546001600160a01b03169150829050565b61068d610de8565b6106975f19610e8b565b565b5f5f6106a481610f22565b6001600160a01b0383165f9081526002602052604090205460ff16156106dd5760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b038381165f9081526001602052604090205416156107155760405163c45546f760e01b815260040160405180910390fd5b604080516001600160a01b03851660248083019190915282518083039091018152604490910182526020810180516001600160e01b031663189acdbd60e31b17905290515f917f00000000000000000000000000000000000000000000000000000000000000009161078690611174565b61079192919061137e565b604051809103905ff0801580156107aa573d5f5f3e3d5ffd5b5090506107b78482610f4d565b6040805160018082528183019092525f916020808301908036833701905050905081815f815181106107eb576107eb611346565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff2906108479084906004016112af565b5f604051808303815f87803b15801561085e575f5ffd5b505af1158015610870573d5f5f3e3d5ffd5b5093979650505050505050565b610885610ec8565b6106975f610fb7565b6001600160a01b0381165f908152600360209081526040918290208054835181840281018401909452808452606093928301828280156108f557602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116108d7575b50505050509050919050565b610909610ec8565b604051632ef047f960e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635de08ff29061095790859085906004016113c2565b5f604051808303815f87803b15801561096e575f5ffd5b505af1158015610980573d5f5f3e3d5ffd5b505050505050565b603354610100900460ff16158080156109a85750603354600160ff909116105b806109c25750303b1580156109c2575060335460ff166001145b610a2a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff191660011790558015610a4d576033805461ff0019166101001790555b610a5683610fb7565b610a5f82610e8b565b8015610aa5576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610ab2610ec8565b6001600160a01b038116610b175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a21565b610b2081610fb7565b50565b610b2b611008565b60995480198219811614610b525760405163c61dca5d60e01b815260040160405180910390fd5b609982905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f5f610b9b81610f22565b5f610ba9602085018561126d565b6001600160a01b0381165f9081526002602052604090205490915060ff1615610be55760405163091867bd60e11b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063c2cca26d60e01b85604051602401610c1f91906114bc565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610c5c90611174565b610c6792919061137e565b604051809103905ff080158015610c80573d5f5f3e3d5ffd5b506001600160a01b038083165f9081526003602090815260408220805460018101825590835291200180546001600160a01b03191691831691909117905592506040805160018082528183019092525f9181602001602082028036833701905050905083815f81518110610cf657610cf6611346565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff290610d529084906004016112af565b5f604051808303815f87803b158015610d69575f5ffd5b505af1158015610d7b573d5f5f3e3d5ffd5b50505050610d8a8483876110b9565b505050919050565b610d9a610ec8565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061095790859085906004016113c2565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610e4a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6e91906115f8565b61069757604051631d77d47760e21b815260040160405180910390fd5b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6066546001600160a01b031633146106975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a21565b609954600160ff83161b90811603610b205760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038281165f8181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611064573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110889190611617565b6001600160a01b0316336001600160a01b0316146106975760405163794821ff60e01b815260040160405180910390fd5b6110c9604082016020830161126d565b6001600160a01b0316826001600160a01b0316846001600160a01b03167f6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f8187934556850484606001602081019061111a9190611632565b608086013560a087013561113160c089018961164b565b6111426101008b0160e08c0161126d565b6111546101208c016101008d01611632565b604051611167979695949392919061168e565b60405180910390a4505050565b610678806116e483390190565b5f60208284031215611191575f5ffd5b5035919050565b5f5f83601f8401126111a8575f5ffd5b50813567ffffffffffffffff8111156111bf575f5ffd5b6020830191508360208260051b85010111156111d9575f5ffd5b9250929050565b5f5f602083850312156111f1575f5ffd5b823567ffffffffffffffff811115611207575f5ffd5b61121385828601611198565b90969095509350505050565b6001600160a01b0381168114610b20575f5ffd5b803561123e8161121f565b919050565b5f5f60408385031215611254575f5ffd5b823561125f8161121f565b946020939093013593505050565b5f6020828403121561127d575f5ffd5b81356112888161121f565b9392505050565b5f6020828403121561129f575f5ffd5b813560ff81168114611288575f5ffd5b602080825282518282018190525f918401906040840190835b818110156112ef5783516001600160a01b03168352602093840193909201916001016112c8565b509095945050505050565b5f6020828403121561130a575f5ffd5b813567ffffffffffffffff811115611320575f5ffd5b82016101808185031215611288575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f6001820161137757634e487b7160e01b5f52601160045260245ffd5b5060010190565b60018060a01b0383168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602080825281018290525f8360408301825b858110156114045782356113e78161121f565b6001600160a01b03168252602092830192909101906001016113d4565b5095945050505050565b803563ffffffff8116811461123e575f5ffd5b5f5f8335601e19843603018112611436575f5ffd5b830160208101925035905067ffffffffffffffff811115611455575f5ffd5b8036038213156111d9575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b80356114968161121f565b6001600160a01b0316825263ffffffff6114b26020830161140e565b1660208301525050565b602081526114dd602082016114d084611233565b6001600160a01b03169052565b5f6114ea60208401611233565b6001600160a01b03811660408401525061150660408401611233565b6001600160a01b0381166060840152506115226060840161140e565b63ffffffff8116608084015250608083013560a08381019190915283013560c08084019190915261155590840184611421565b61018060e085015261156c6101a085018284611463565b915050611580610100840160e0860161148b565b61158e610120850185611421565b848303601f19016101408601526115a6838284611463565b925050506115b76101408501611233565b6001600160a01b038116610160850152506115d6610160850185611421565b848303601f19016101808601526115ee838284611463565b9695505050505050565b5f60208284031215611608575f5ffd5b81518015158114611288575f5ffd5b5f60208284031215611627575f5ffd5b81516112888161121f565b5f60208284031215611642575f5ffd5b6112888261140e565b5f5f8335601e19843603018112611660575f5ffd5b83018035915067ffffffffffffffff82111561167a575f5ffd5b6020019150368190038213156111d9575f5ffd5b63ffffffff8816815286602082015285604082015260c060608201525f6116b960c083018688611463565b6001600160a01b039490941660808301525063ffffffff9190911660a0909101529594505050505056fe6080604052604051610678380380610678833981016040819052610022916103ed565b61002d82825f610034565b5050610513565b61003d836100f1565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a25f8251118061007c5750805b156100ec576100ea836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906104af565b83610273565b505b505050565b6001600160a01b0381163b61015b5760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101cd816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101be91906104af565b6001600160a01b03163b151590565b6102325760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610152565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029883836040518060600160405280602781526020016106516027913961029f565b9392505050565b60605f5f856001600160a01b0316856040516102bb91906104c8565b5f60405180830381855af49150503d805f81146102f3576040519150601f19603f3d011682016040523d82523d5f602084013e6102f8565b606091505b50909250905061030a86838387610314565b9695505050505050565b606083156103825782515f0361037b576001600160a01b0385163b61037b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b508161038c565b61038c8383610394565b949350505050565b8151156103a45781518083602001fd5b8060405162461bcd60e51b815260040161015291906104de565b80516001600160a01b03811681146103d4575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156103fe575f5ffd5b610407836103be565b60208401519092506001600160401b03811115610422575f5ffd5b8301601f81018513610432575f5ffd5b80516001600160401b0381111561044b5761044b6103d9565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610479576104796103d9565b604052818152828201602001871015610490575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b5f602082840312156104bf575f5ffd5b610298826103be565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b610131806105205f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b60b3565b565b5f60527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015608c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ae919060d0565b905090565b365f5f375f5f365f845af43d5f5f3e80801560cc573d5ff35b3d5ffd5b5f6020828403121560df575f5ffd5b81516001600160a01b038116811460f4575f5ffd5b939250505056fea26469706673582212207b94aecb5f7696f142cc1acc4dea07c18e8f9d41766baf4a3c001a89adb8a8a764736f6c634300081e0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220f328ddf58bd6b778e9a4fff8c3099e7d1d83c7dd87e2b694b706f6a3d116d7eb64736f6c634300081e0033",
}
// StrategyFactoryABI is the input ABI used to generate the binding from.
@@ -44,7 +65,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, _strategyBeacon common.Address, _durationVaultBeacon common.Address) (common.Address, *types.Transaction, *StrategyFactory, error) {
parsed, err := StrategyFactoryMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
@@ -53,7 +74,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, _strategyBeacon, _durationVaultBeacon)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -233,6 +254,99 @@ func (_StrategyFactory *StrategyFactoryCallerSession) DeployedStrategies(arg0 co
return _StrategyFactory.Contract.DeployedStrategies(&_StrategyFactory.CallOpts, arg0)
}
+// DurationVaultBeacon is a free data retrieval call binding the contract method 0x9e4f2dcd.
+//
+// Solidity: function durationVaultBeacon() view returns(address)
+func (_StrategyFactory *StrategyFactoryCaller) DurationVaultBeacon(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _StrategyFactory.contract.Call(opts, &out, "durationVaultBeacon")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// DurationVaultBeacon is a free data retrieval call binding the contract method 0x9e4f2dcd.
+//
+// Solidity: function durationVaultBeacon() view returns(address)
+func (_StrategyFactory *StrategyFactorySession) DurationVaultBeacon() (common.Address, error) {
+ return _StrategyFactory.Contract.DurationVaultBeacon(&_StrategyFactory.CallOpts)
+}
+
+// DurationVaultBeacon is a free data retrieval call binding the contract method 0x9e4f2dcd.
+//
+// Solidity: function durationVaultBeacon() view returns(address)
+func (_StrategyFactory *StrategyFactoryCallerSession) DurationVaultBeacon() (common.Address, error) {
+ return _StrategyFactory.Contract.DurationVaultBeacon(&_StrategyFactory.CallOpts)
+}
+
+// DurationVaultsByToken is a free data retrieval call binding the contract method 0x3101d531.
+//
+// Solidity: function durationVaultsByToken(address , uint256 ) view returns(address)
+func (_StrategyFactory *StrategyFactoryCaller) DurationVaultsByToken(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (common.Address, error) {
+ var out []interface{}
+ err := _StrategyFactory.contract.Call(opts, &out, "durationVaultsByToken", arg0, arg1)
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// DurationVaultsByToken is a free data retrieval call binding the contract method 0x3101d531.
+//
+// Solidity: function durationVaultsByToken(address , uint256 ) view returns(address)
+func (_StrategyFactory *StrategyFactorySession) DurationVaultsByToken(arg0 common.Address, arg1 *big.Int) (common.Address, error) {
+ return _StrategyFactory.Contract.DurationVaultsByToken(&_StrategyFactory.CallOpts, arg0, arg1)
+}
+
+// DurationVaultsByToken is a free data retrieval call binding the contract method 0x3101d531.
+//
+// Solidity: function durationVaultsByToken(address , uint256 ) view returns(address)
+func (_StrategyFactory *StrategyFactoryCallerSession) DurationVaultsByToken(arg0 common.Address, arg1 *big.Int) (common.Address, error) {
+ return _StrategyFactory.Contract.DurationVaultsByToken(&_StrategyFactory.CallOpts, arg0, arg1)
+}
+
+// GetDurationVaults is a free data retrieval call binding the contract method 0xa5dae840.
+//
+// Solidity: function getDurationVaults(address token) view returns(address[])
+func (_StrategyFactory *StrategyFactoryCaller) GetDurationVaults(opts *bind.CallOpts, token common.Address) ([]common.Address, error) {
+ var out []interface{}
+ err := _StrategyFactory.contract.Call(opts, &out, "getDurationVaults", token)
+
+ if err != nil {
+ return *new([]common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)
+
+ return out0, err
+
+}
+
+// GetDurationVaults is a free data retrieval call binding the contract method 0xa5dae840.
+//
+// Solidity: function getDurationVaults(address token) view returns(address[])
+func (_StrategyFactory *StrategyFactorySession) GetDurationVaults(token common.Address) ([]common.Address, error) {
+ return _StrategyFactory.Contract.GetDurationVaults(&_StrategyFactory.CallOpts, token)
+}
+
+// GetDurationVaults is a free data retrieval call binding the contract method 0xa5dae840.
+//
+// Solidity: function getDurationVaults(address token) view returns(address[])
+func (_StrategyFactory *StrategyFactoryCallerSession) GetDurationVaults(token common.Address) ([]common.Address, error) {
+ return _StrategyFactory.Contract.GetDurationVaults(&_StrategyFactory.CallOpts, token)
+}
+
// IsBlacklisted is a free data retrieval call binding the contract method 0xfe575a87.
//
// Solidity: function isBlacklisted(address ) view returns(bool)
@@ -471,6 +585,27 @@ func (_StrategyFactory *StrategyFactoryTransactorSession) BlacklistTokens(tokens
return _StrategyFactory.Contract.BlacklistTokens(&_StrategyFactory.TransactOpts, tokens)
}
+// DeployDurationVaultStrategy is a paid mutator transaction binding the contract method 0xfb515303.
+//
+// Solidity: function deployDurationVaultStrategy((address,address,address,uint32,uint256,uint256,string,(address,uint32),bytes,address,string) config) returns(address newVault)
+func (_StrategyFactory *StrategyFactoryTransactor) DeployDurationVaultStrategy(opts *bind.TransactOpts, config IDurationVaultStrategyTypesVaultConfig) (*types.Transaction, error) {
+ return _StrategyFactory.contract.Transact(opts, "deployDurationVaultStrategy", config)
+}
+
+// DeployDurationVaultStrategy is a paid mutator transaction binding the contract method 0xfb515303.
+//
+// Solidity: function deployDurationVaultStrategy((address,address,address,uint32,uint256,uint256,string,(address,uint32),bytes,address,string) config) returns(address newVault)
+func (_StrategyFactory *StrategyFactorySession) DeployDurationVaultStrategy(config IDurationVaultStrategyTypesVaultConfig) (*types.Transaction, error) {
+ return _StrategyFactory.Contract.DeployDurationVaultStrategy(&_StrategyFactory.TransactOpts, config)
+}
+
+// DeployDurationVaultStrategy is a paid mutator transaction binding the contract method 0xfb515303.
+//
+// Solidity: function deployDurationVaultStrategy((address,address,address,uint32,uint256,uint256,string,(address,uint32),bytes,address,string) config) returns(address newVault)
+func (_StrategyFactory *StrategyFactoryTransactorSession) DeployDurationVaultStrategy(config IDurationVaultStrategyTypesVaultConfig) (*types.Transaction, error) {
+ return _StrategyFactory.Contract.DeployDurationVaultStrategy(&_StrategyFactory.TransactOpts, config)
+}
+
// DeployNewStrategy is a paid mutator transaction binding the contract method 0x6b9b6229.
//
// Solidity: function deployNewStrategy(address token) returns(address newStrategy)
@@ -492,25 +627,25 @@ func (_StrategyFactory *StrategyFactoryTransactorSession) DeployNewStrategy(toke
return _StrategyFactory.Contract.DeployNewStrategy(&_StrategyFactory.TransactOpts, token)
}
-// Initialize is a paid mutator transaction binding the contract method 0xc350a1b5.
+// Initialize is a paid mutator transaction binding the contract method 0xcd6dc687.
//
-// Solidity: function initialize(address _initialOwner, uint256 _initialPausedStatus, address _strategyBeacon) returns()
-func (_StrategyFactory *StrategyFactoryTransactor) Initialize(opts *bind.TransactOpts, _initialOwner common.Address, _initialPausedStatus *big.Int, _strategyBeacon common.Address) (*types.Transaction, error) {
- return _StrategyFactory.contract.Transact(opts, "initialize", _initialOwner, _initialPausedStatus, _strategyBeacon)
+// Solidity: function initialize(address _initialOwner, uint256 _initialPausedStatus) returns()
+func (_StrategyFactory *StrategyFactoryTransactor) Initialize(opts *bind.TransactOpts, _initialOwner common.Address, _initialPausedStatus *big.Int) (*types.Transaction, error) {
+ return _StrategyFactory.contract.Transact(opts, "initialize", _initialOwner, _initialPausedStatus)
}
-// Initialize is a paid mutator transaction binding the contract method 0xc350a1b5.
+// Initialize is a paid mutator transaction binding the contract method 0xcd6dc687.
//
-// Solidity: function initialize(address _initialOwner, uint256 _initialPausedStatus, address _strategyBeacon) returns()
-func (_StrategyFactory *StrategyFactorySession) Initialize(_initialOwner common.Address, _initialPausedStatus *big.Int, _strategyBeacon common.Address) (*types.Transaction, error) {
- return _StrategyFactory.Contract.Initialize(&_StrategyFactory.TransactOpts, _initialOwner, _initialPausedStatus, _strategyBeacon)
+// Solidity: function initialize(address _initialOwner, uint256 _initialPausedStatus) returns()
+func (_StrategyFactory *StrategyFactorySession) Initialize(_initialOwner common.Address, _initialPausedStatus *big.Int) (*types.Transaction, error) {
+ return _StrategyFactory.Contract.Initialize(&_StrategyFactory.TransactOpts, _initialOwner, _initialPausedStatus)
}
-// Initialize is a paid mutator transaction binding the contract method 0xc350a1b5.
+// Initialize is a paid mutator transaction binding the contract method 0xcd6dc687.
//
-// Solidity: function initialize(address _initialOwner, uint256 _initialPausedStatus, address _strategyBeacon) returns()
-func (_StrategyFactory *StrategyFactoryTransactorSession) Initialize(_initialOwner common.Address, _initialPausedStatus *big.Int, _strategyBeacon common.Address) (*types.Transaction, error) {
- return _StrategyFactory.Contract.Initialize(&_StrategyFactory.TransactOpts, _initialOwner, _initialPausedStatus, _strategyBeacon)
+// Solidity: function initialize(address _initialOwner, uint256 _initialPausedStatus) returns()
+func (_StrategyFactory *StrategyFactoryTransactorSession) Initialize(_initialOwner common.Address, _initialPausedStatus *big.Int) (*types.Transaction, error) {
+ return _StrategyFactory.Contract.Initialize(&_StrategyFactory.TransactOpts, _initialOwner, _initialPausedStatus)
}
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
@@ -660,6 +795,174 @@ func (_StrategyFactory *StrategyFactoryTransactorSession) WhitelistStrategies(st
return _StrategyFactory.Contract.WhitelistStrategies(&_StrategyFactory.TransactOpts, strategiesToWhitelist)
}
+// StrategyFactoryDurationVaultDeployedIterator is returned from FilterDurationVaultDeployed and is used to iterate over the raw logs and unpacked data for DurationVaultDeployed events raised by the StrategyFactory contract.
+type StrategyFactoryDurationVaultDeployedIterator struct {
+ Event *StrategyFactoryDurationVaultDeployed // 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 *StrategyFactoryDurationVaultDeployedIterator) 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(StrategyFactoryDurationVaultDeployed)
+ 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(StrategyFactoryDurationVaultDeployed)
+ 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 *StrategyFactoryDurationVaultDeployedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *StrategyFactoryDurationVaultDeployedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// StrategyFactoryDurationVaultDeployed represents a DurationVaultDeployed event raised by the StrategyFactory contract.
+type StrategyFactoryDurationVaultDeployed struct {
+ Vault common.Address
+ UnderlyingToken common.Address
+ VaultAdmin common.Address
+ Duration uint32
+ MaxPerDeposit *big.Int
+ StakeCap *big.Int
+ MetadataURI string
+ OperatorSetAVS common.Address
+ OperatorSetId uint32
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDurationVaultDeployed is a free log retrieval operation binding the contract event 0x6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f81879345568504.
+//
+// Solidity: event DurationVaultDeployed(address indexed vault, address indexed underlyingToken, address indexed vaultAdmin, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI, address operatorSetAVS, uint32 operatorSetId)
+func (_StrategyFactory *StrategyFactoryFilterer) FilterDurationVaultDeployed(opts *bind.FilterOpts, vault []common.Address, underlyingToken []common.Address, vaultAdmin []common.Address) (*StrategyFactoryDurationVaultDeployedIterator, error) {
+
+ var vaultRule []interface{}
+ for _, vaultItem := range vault {
+ vaultRule = append(vaultRule, vaultItem)
+ }
+ var underlyingTokenRule []interface{}
+ for _, underlyingTokenItem := range underlyingToken {
+ underlyingTokenRule = append(underlyingTokenRule, underlyingTokenItem)
+ }
+ var vaultAdminRule []interface{}
+ for _, vaultAdminItem := range vaultAdmin {
+ vaultAdminRule = append(vaultAdminRule, vaultAdminItem)
+ }
+
+ logs, sub, err := _StrategyFactory.contract.FilterLogs(opts, "DurationVaultDeployed", vaultRule, underlyingTokenRule, vaultAdminRule)
+ if err != nil {
+ return nil, err
+ }
+ return &StrategyFactoryDurationVaultDeployedIterator{contract: _StrategyFactory.contract, event: "DurationVaultDeployed", logs: logs, sub: sub}, nil
+}
+
+// WatchDurationVaultDeployed is a free log subscription operation binding the contract event 0x6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f81879345568504.
+//
+// Solidity: event DurationVaultDeployed(address indexed vault, address indexed underlyingToken, address indexed vaultAdmin, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI, address operatorSetAVS, uint32 operatorSetId)
+func (_StrategyFactory *StrategyFactoryFilterer) WatchDurationVaultDeployed(opts *bind.WatchOpts, sink chan<- *StrategyFactoryDurationVaultDeployed, vault []common.Address, underlyingToken []common.Address, vaultAdmin []common.Address) (event.Subscription, error) {
+
+ var vaultRule []interface{}
+ for _, vaultItem := range vault {
+ vaultRule = append(vaultRule, vaultItem)
+ }
+ var underlyingTokenRule []interface{}
+ for _, underlyingTokenItem := range underlyingToken {
+ underlyingTokenRule = append(underlyingTokenRule, underlyingTokenItem)
+ }
+ var vaultAdminRule []interface{}
+ for _, vaultAdminItem := range vaultAdmin {
+ vaultAdminRule = append(vaultAdminRule, vaultAdminItem)
+ }
+
+ logs, sub, err := _StrategyFactory.contract.WatchLogs(opts, "DurationVaultDeployed", vaultRule, underlyingTokenRule, vaultAdminRule)
+ 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(StrategyFactoryDurationVaultDeployed)
+ if err := _StrategyFactory.contract.UnpackLog(event, "DurationVaultDeployed", 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
+}
+
+// ParseDurationVaultDeployed is a log parse operation binding the contract event 0x6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f81879345568504.
+//
+// Solidity: event DurationVaultDeployed(address indexed vault, address indexed underlyingToken, address indexed vaultAdmin, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI, address operatorSetAVS, uint32 operatorSetId)
+func (_StrategyFactory *StrategyFactoryFilterer) ParseDurationVaultDeployed(log types.Log) (*StrategyFactoryDurationVaultDeployed, error) {
+ event := new(StrategyFactoryDurationVaultDeployed)
+ if err := _StrategyFactory.contract.UnpackLog(event, "DurationVaultDeployed", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
// StrategyFactoryInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the StrategyFactory contract.
type StrategyFactoryInitializedIterator struct {
Event *StrategyFactoryInitialized // Event containing the contract specifics and raw log
@@ -1092,141 +1395,6 @@ func (_StrategyFactory *StrategyFactoryFilterer) ParsePaused(log types.Log) (*St
return event, nil
}
-// StrategyFactoryStrategyBeaconModifiedIterator is returned from FilterStrategyBeaconModified and is used to iterate over the raw logs and unpacked data for StrategyBeaconModified events raised by the StrategyFactory contract.
-type StrategyFactoryStrategyBeaconModifiedIterator struct {
- Event *StrategyFactoryStrategyBeaconModified // 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 *StrategyFactoryStrategyBeaconModifiedIterator) 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(StrategyFactoryStrategyBeaconModified)
- 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(StrategyFactoryStrategyBeaconModified)
- 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 *StrategyFactoryStrategyBeaconModifiedIterator) Error() error {
- return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *StrategyFactoryStrategyBeaconModifiedIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-// StrategyFactoryStrategyBeaconModified represents a StrategyBeaconModified event raised by the StrategyFactory contract.
-type StrategyFactoryStrategyBeaconModified struct {
- PreviousBeacon common.Address
- NewBeacon common.Address
- Raw types.Log // Blockchain specific contextual infos
-}
-
-// FilterStrategyBeaconModified is a free log retrieval operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
-//
-// Solidity: event StrategyBeaconModified(address previousBeacon, address newBeacon)
-func (_StrategyFactory *StrategyFactoryFilterer) FilterStrategyBeaconModified(opts *bind.FilterOpts) (*StrategyFactoryStrategyBeaconModifiedIterator, error) {
-
- logs, sub, err := _StrategyFactory.contract.FilterLogs(opts, "StrategyBeaconModified")
- if err != nil {
- return nil, err
- }
- return &StrategyFactoryStrategyBeaconModifiedIterator{contract: _StrategyFactory.contract, event: "StrategyBeaconModified", logs: logs, sub: sub}, nil
-}
-
-// WatchStrategyBeaconModified is a free log subscription operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
-//
-// Solidity: event StrategyBeaconModified(address previousBeacon, address newBeacon)
-func (_StrategyFactory *StrategyFactoryFilterer) WatchStrategyBeaconModified(opts *bind.WatchOpts, sink chan<- *StrategyFactoryStrategyBeaconModified) (event.Subscription, error) {
-
- logs, sub, err := _StrategyFactory.contract.WatchLogs(opts, "StrategyBeaconModified")
- 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(StrategyFactoryStrategyBeaconModified)
- if err := _StrategyFactory.contract.UnpackLog(event, "StrategyBeaconModified", 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
-}
-
-// ParseStrategyBeaconModified is a log parse operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
-//
-// Solidity: event StrategyBeaconModified(address previousBeacon, address newBeacon)
-func (_StrategyFactory *StrategyFactoryFilterer) ParseStrategyBeaconModified(log types.Log) (*StrategyFactoryStrategyBeaconModified, error) {
- event := new(StrategyFactoryStrategyBeaconModified)
- if err := _StrategyFactory.contract.UnpackLog(event, "StrategyBeaconModified", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
// StrategyFactoryStrategySetForTokenIterator is returned from FilterStrategySetForToken and is used to iterate over the raw logs and unpacked data for StrategySetForToken events raised by the StrategyFactory contract.
type StrategyFactoryStrategySetForTokenIterator struct {
Event *StrategyFactoryStrategySetForToken // Event containing the contract specifics and raw log
diff --git a/pkg/bindings/StrategyFactoryStorage/binding.go b/pkg/bindings/StrategyFactoryStorage/binding.go
index c967b62fd8..d31eaf4fde 100644
--- a/pkg/bindings/StrategyFactoryStorage/binding.go
+++ b/pkg/bindings/StrategyFactoryStorage/binding.go
@@ -29,9 +29,30 @@ var (
_ = abi.ConvertType
)
+// IDurationVaultStrategyTypesVaultConfig is an auto generated low-level Go binding around an user-defined struct.
+type IDurationVaultStrategyTypesVaultConfig struct {
+ UnderlyingToken common.Address
+ VaultAdmin common.Address
+ Arbitrator common.Address
+ Duration uint32
+ MaxPerDeposit *big.Int
+ StakeCap *big.Int
+ MetadataURI string
+ OperatorSet OperatorSet
+ OperatorSetRegistrationData []byte
+ DelegationApprover common.Address
+ OperatorMetadataURI string
+}
+
+// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
+type OperatorSet struct {
+ Avs common.Address
+ Id uint32
+}
+
// 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\":\"deployDurationVaultStrategy\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structIDurationVaultStrategyTypes.VaultConfig\",\"components\":[{\"name\":\"underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"vaultAdmin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"arbitrator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stakeCap\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorSetRegistrationData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorMetadataURI\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"newVault\",\"type\":\"address\",\"internalType\":\"contractIDurationVaultStrategy\"}],\"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\":\"durationVaultBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"durationVaultsByToken\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDurationVaultStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDurationVaults\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIDurationVaultStrategy[]\"}],\"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\":\"DurationVaultDeployed\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"contractIDurationVaultStrategy\"},{\"name\":\"underlyingToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"contractIERC20\"},{\"name\":\"vaultAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"duration\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"maxPerDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"stakeCap\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"operatorSetAVS\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"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.
@@ -211,6 +232,99 @@ func (_StrategyFactoryStorage *StrategyFactoryStorageCallerSession) DeployedStra
return _StrategyFactoryStorage.Contract.DeployedStrategies(&_StrategyFactoryStorage.CallOpts, arg0)
}
+// DurationVaultBeacon is a free data retrieval call binding the contract method 0x9e4f2dcd.
+//
+// Solidity: function durationVaultBeacon() view returns(address)
+func (_StrategyFactoryStorage *StrategyFactoryStorageCaller) DurationVaultBeacon(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _StrategyFactoryStorage.contract.Call(opts, &out, "durationVaultBeacon")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// DurationVaultBeacon is a free data retrieval call binding the contract method 0x9e4f2dcd.
+//
+// Solidity: function durationVaultBeacon() view returns(address)
+func (_StrategyFactoryStorage *StrategyFactoryStorageSession) DurationVaultBeacon() (common.Address, error) {
+ return _StrategyFactoryStorage.Contract.DurationVaultBeacon(&_StrategyFactoryStorage.CallOpts)
+}
+
+// DurationVaultBeacon is a free data retrieval call binding the contract method 0x9e4f2dcd.
+//
+// Solidity: function durationVaultBeacon() view returns(address)
+func (_StrategyFactoryStorage *StrategyFactoryStorageCallerSession) DurationVaultBeacon() (common.Address, error) {
+ return _StrategyFactoryStorage.Contract.DurationVaultBeacon(&_StrategyFactoryStorage.CallOpts)
+}
+
+// DurationVaultsByToken is a free data retrieval call binding the contract method 0x3101d531.
+//
+// Solidity: function durationVaultsByToken(address , uint256 ) view returns(address)
+func (_StrategyFactoryStorage *StrategyFactoryStorageCaller) DurationVaultsByToken(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (common.Address, error) {
+ var out []interface{}
+ err := _StrategyFactoryStorage.contract.Call(opts, &out, "durationVaultsByToken", arg0, arg1)
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// DurationVaultsByToken is a free data retrieval call binding the contract method 0x3101d531.
+//
+// Solidity: function durationVaultsByToken(address , uint256 ) view returns(address)
+func (_StrategyFactoryStorage *StrategyFactoryStorageSession) DurationVaultsByToken(arg0 common.Address, arg1 *big.Int) (common.Address, error) {
+ return _StrategyFactoryStorage.Contract.DurationVaultsByToken(&_StrategyFactoryStorage.CallOpts, arg0, arg1)
+}
+
+// DurationVaultsByToken is a free data retrieval call binding the contract method 0x3101d531.
+//
+// Solidity: function durationVaultsByToken(address , uint256 ) view returns(address)
+func (_StrategyFactoryStorage *StrategyFactoryStorageCallerSession) DurationVaultsByToken(arg0 common.Address, arg1 *big.Int) (common.Address, error) {
+ return _StrategyFactoryStorage.Contract.DurationVaultsByToken(&_StrategyFactoryStorage.CallOpts, arg0, arg1)
+}
+
+// GetDurationVaults is a free data retrieval call binding the contract method 0xa5dae840.
+//
+// Solidity: function getDurationVaults(address token) view returns(address[])
+func (_StrategyFactoryStorage *StrategyFactoryStorageCaller) GetDurationVaults(opts *bind.CallOpts, token common.Address) ([]common.Address, error) {
+ var out []interface{}
+ err := _StrategyFactoryStorage.contract.Call(opts, &out, "getDurationVaults", token)
+
+ if err != nil {
+ return *new([]common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)
+
+ return out0, err
+
+}
+
+// GetDurationVaults is a free data retrieval call binding the contract method 0xa5dae840.
+//
+// Solidity: function getDurationVaults(address token) view returns(address[])
+func (_StrategyFactoryStorage *StrategyFactoryStorageSession) GetDurationVaults(token common.Address) ([]common.Address, error) {
+ return _StrategyFactoryStorage.Contract.GetDurationVaults(&_StrategyFactoryStorage.CallOpts, token)
+}
+
+// GetDurationVaults is a free data retrieval call binding the contract method 0xa5dae840.
+//
+// Solidity: function getDurationVaults(address token) view returns(address[])
+func (_StrategyFactoryStorage *StrategyFactoryStorageCallerSession) GetDurationVaults(token common.Address) ([]common.Address, error) {
+ return _StrategyFactoryStorage.Contract.GetDurationVaults(&_StrategyFactoryStorage.CallOpts, token)
+}
+
// IsBlacklisted is a free data retrieval call binding the contract method 0xfe575a87.
//
// Solidity: function isBlacklisted(address ) view returns(bool)
@@ -273,6 +387,27 @@ func (_StrategyFactoryStorage *StrategyFactoryStorageCallerSession) StrategyBeac
return _StrategyFactoryStorage.Contract.StrategyBeacon(&_StrategyFactoryStorage.CallOpts)
}
+// DeployDurationVaultStrategy is a paid mutator transaction binding the contract method 0xfb515303.
+//
+// Solidity: function deployDurationVaultStrategy((address,address,address,uint32,uint256,uint256,string,(address,uint32),bytes,address,string) config) returns(address newVault)
+func (_StrategyFactoryStorage *StrategyFactoryStorageTransactor) DeployDurationVaultStrategy(opts *bind.TransactOpts, config IDurationVaultStrategyTypesVaultConfig) (*types.Transaction, error) {
+ return _StrategyFactoryStorage.contract.Transact(opts, "deployDurationVaultStrategy", config)
+}
+
+// DeployDurationVaultStrategy is a paid mutator transaction binding the contract method 0xfb515303.
+//
+// Solidity: function deployDurationVaultStrategy((address,address,address,uint32,uint256,uint256,string,(address,uint32),bytes,address,string) config) returns(address newVault)
+func (_StrategyFactoryStorage *StrategyFactoryStorageSession) DeployDurationVaultStrategy(config IDurationVaultStrategyTypesVaultConfig) (*types.Transaction, error) {
+ return _StrategyFactoryStorage.Contract.DeployDurationVaultStrategy(&_StrategyFactoryStorage.TransactOpts, config)
+}
+
+// DeployDurationVaultStrategy is a paid mutator transaction binding the contract method 0xfb515303.
+//
+// Solidity: function deployDurationVaultStrategy((address,address,address,uint32,uint256,uint256,string,(address,uint32),bytes,address,string) config) returns(address newVault)
+func (_StrategyFactoryStorage *StrategyFactoryStorageTransactorSession) DeployDurationVaultStrategy(config IDurationVaultStrategyTypesVaultConfig) (*types.Transaction, error) {
+ return _StrategyFactoryStorage.Contract.DeployDurationVaultStrategy(&_StrategyFactoryStorage.TransactOpts, config)
+}
+
// DeployNewStrategy is a paid mutator transaction binding the contract method 0x6b9b6229.
//
// Solidity: function deployNewStrategy(address token) returns(address newStrategy)
@@ -336,9 +471,9 @@ func (_StrategyFactoryStorage *StrategyFactoryStorageTransactorSession) Whitelis
return _StrategyFactoryStorage.Contract.WhitelistStrategies(&_StrategyFactoryStorage.TransactOpts, strategiesToWhitelist)
}
-// StrategyFactoryStorageStrategyBeaconModifiedIterator is returned from FilterStrategyBeaconModified and is used to iterate over the raw logs and unpacked data for StrategyBeaconModified events raised by the StrategyFactoryStorage contract.
-type StrategyFactoryStorageStrategyBeaconModifiedIterator struct {
- Event *StrategyFactoryStorageStrategyBeaconModified // Event containing the contract specifics and raw log
+// StrategyFactoryStorageDurationVaultDeployedIterator is returned from FilterDurationVaultDeployed and is used to iterate over the raw logs and unpacked data for DurationVaultDeployed events raised by the StrategyFactoryStorage contract.
+type StrategyFactoryStorageDurationVaultDeployedIterator struct {
+ Event *StrategyFactoryStorageDurationVaultDeployed // 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
@@ -352,7 +487,7 @@ type StrategyFactoryStorageStrategyBeaconModifiedIterator struct {
// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
-func (it *StrategyFactoryStorageStrategyBeaconModifiedIterator) Next() bool {
+func (it *StrategyFactoryStorageDurationVaultDeployedIterator) Next() bool {
// If the iterator failed, stop iterating
if it.fail != nil {
return false
@@ -361,7 +496,7 @@ func (it *StrategyFactoryStorageStrategyBeaconModifiedIterator) Next() bool {
if it.done {
select {
case log := <-it.logs:
- it.Event = new(StrategyFactoryStorageStrategyBeaconModified)
+ it.Event = new(StrategyFactoryStorageDurationVaultDeployed)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
@@ -376,7 +511,7 @@ func (it *StrategyFactoryStorageStrategyBeaconModifiedIterator) Next() bool {
// Iterator still in progress, wait for either a data or an error event
select {
case log := <-it.logs:
- it.Event = new(StrategyFactoryStorageStrategyBeaconModified)
+ it.Event = new(StrategyFactoryStorageDurationVaultDeployed)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
@@ -392,42 +527,75 @@ func (it *StrategyFactoryStorageStrategyBeaconModifiedIterator) Next() bool {
}
// Error returns any retrieval or parsing error occurred during filtering.
-func (it *StrategyFactoryStorageStrategyBeaconModifiedIterator) Error() error {
+func (it *StrategyFactoryStorageDurationVaultDeployedIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
-func (it *StrategyFactoryStorageStrategyBeaconModifiedIterator) Close() error {
+func (it *StrategyFactoryStorageDurationVaultDeployedIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
-// StrategyFactoryStorageStrategyBeaconModified represents a StrategyBeaconModified event raised by the StrategyFactoryStorage contract.
-type StrategyFactoryStorageStrategyBeaconModified struct {
- PreviousBeacon common.Address
- NewBeacon common.Address
- Raw types.Log // Blockchain specific contextual infos
+// StrategyFactoryStorageDurationVaultDeployed represents a DurationVaultDeployed event raised by the StrategyFactoryStorage contract.
+type StrategyFactoryStorageDurationVaultDeployed struct {
+ Vault common.Address
+ UnderlyingToken common.Address
+ VaultAdmin common.Address
+ Duration uint32
+ MaxPerDeposit *big.Int
+ StakeCap *big.Int
+ MetadataURI string
+ OperatorSetAVS common.Address
+ OperatorSetId uint32
+ Raw types.Log // Blockchain specific contextual infos
}
-// FilterStrategyBeaconModified is a free log retrieval operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
+// FilterDurationVaultDeployed is a free log retrieval operation binding the contract event 0x6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f81879345568504.
//
-// Solidity: event StrategyBeaconModified(address previousBeacon, address newBeacon)
-func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) FilterStrategyBeaconModified(opts *bind.FilterOpts) (*StrategyFactoryStorageStrategyBeaconModifiedIterator, error) {
+// Solidity: event DurationVaultDeployed(address indexed vault, address indexed underlyingToken, address indexed vaultAdmin, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI, address operatorSetAVS, uint32 operatorSetId)
+func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) FilterDurationVaultDeployed(opts *bind.FilterOpts, vault []common.Address, underlyingToken []common.Address, vaultAdmin []common.Address) (*StrategyFactoryStorageDurationVaultDeployedIterator, error) {
+
+ var vaultRule []interface{}
+ for _, vaultItem := range vault {
+ vaultRule = append(vaultRule, vaultItem)
+ }
+ var underlyingTokenRule []interface{}
+ for _, underlyingTokenItem := range underlyingToken {
+ underlyingTokenRule = append(underlyingTokenRule, underlyingTokenItem)
+ }
+ var vaultAdminRule []interface{}
+ for _, vaultAdminItem := range vaultAdmin {
+ vaultAdminRule = append(vaultAdminRule, vaultAdminItem)
+ }
- logs, sub, err := _StrategyFactoryStorage.contract.FilterLogs(opts, "StrategyBeaconModified")
+ logs, sub, err := _StrategyFactoryStorage.contract.FilterLogs(opts, "DurationVaultDeployed", vaultRule, underlyingTokenRule, vaultAdminRule)
if err != nil {
return nil, err
}
- return &StrategyFactoryStorageStrategyBeaconModifiedIterator{contract: _StrategyFactoryStorage.contract, event: "StrategyBeaconModified", logs: logs, sub: sub}, nil
+ return &StrategyFactoryStorageDurationVaultDeployedIterator{contract: _StrategyFactoryStorage.contract, event: "DurationVaultDeployed", logs: logs, sub: sub}, nil
}
-// WatchStrategyBeaconModified is a free log subscription operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
+// WatchDurationVaultDeployed is a free log subscription operation binding the contract event 0x6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f81879345568504.
//
-// Solidity: event StrategyBeaconModified(address previousBeacon, address newBeacon)
-func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) WatchStrategyBeaconModified(opts *bind.WatchOpts, sink chan<- *StrategyFactoryStorageStrategyBeaconModified) (event.Subscription, error) {
+// Solidity: event DurationVaultDeployed(address indexed vault, address indexed underlyingToken, address indexed vaultAdmin, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI, address operatorSetAVS, uint32 operatorSetId)
+func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) WatchDurationVaultDeployed(opts *bind.WatchOpts, sink chan<- *StrategyFactoryStorageDurationVaultDeployed, vault []common.Address, underlyingToken []common.Address, vaultAdmin []common.Address) (event.Subscription, error) {
+
+ var vaultRule []interface{}
+ for _, vaultItem := range vault {
+ vaultRule = append(vaultRule, vaultItem)
+ }
+ var underlyingTokenRule []interface{}
+ for _, underlyingTokenItem := range underlyingToken {
+ underlyingTokenRule = append(underlyingTokenRule, underlyingTokenItem)
+ }
+ var vaultAdminRule []interface{}
+ for _, vaultAdminItem := range vaultAdmin {
+ vaultAdminRule = append(vaultAdminRule, vaultAdminItem)
+ }
- logs, sub, err := _StrategyFactoryStorage.contract.WatchLogs(opts, "StrategyBeaconModified")
+ logs, sub, err := _StrategyFactoryStorage.contract.WatchLogs(opts, "DurationVaultDeployed", vaultRule, underlyingTokenRule, vaultAdminRule)
if err != nil {
return nil, err
}
@@ -437,8 +605,8 @@ func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) WatchStrategyBeac
select {
case log := <-logs:
// New log arrived, parse the event and forward to the user
- event := new(StrategyFactoryStorageStrategyBeaconModified)
- if err := _StrategyFactoryStorage.contract.UnpackLog(event, "StrategyBeaconModified", log); err != nil {
+ event := new(StrategyFactoryStorageDurationVaultDeployed)
+ if err := _StrategyFactoryStorage.contract.UnpackLog(event, "DurationVaultDeployed", log); err != nil {
return err
}
event.Raw = log
@@ -459,12 +627,12 @@ func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) WatchStrategyBeac
}), nil
}
-// ParseStrategyBeaconModified is a log parse operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
+// ParseDurationVaultDeployed is a log parse operation binding the contract event 0x6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f81879345568504.
//
-// Solidity: event StrategyBeaconModified(address previousBeacon, address newBeacon)
-func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) ParseStrategyBeaconModified(log types.Log) (*StrategyFactoryStorageStrategyBeaconModified, error) {
- event := new(StrategyFactoryStorageStrategyBeaconModified)
- if err := _StrategyFactoryStorage.contract.UnpackLog(event, "StrategyBeaconModified", log); err != nil {
+// Solidity: event DurationVaultDeployed(address indexed vault, address indexed underlyingToken, address indexed vaultAdmin, uint32 duration, uint256 maxPerDeposit, uint256 stakeCap, string metadataURI, address operatorSetAVS, uint32 operatorSetId)
+func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) ParseDurationVaultDeployed(log types.Log) (*StrategyFactoryStorageDurationVaultDeployed, error) {
+ event := new(StrategyFactoryStorageDurationVaultDeployed)
+ if err := _StrategyFactoryStorage.contract.UnpackLog(event, "DurationVaultDeployed", log); err != nil {
return nil, err
}
event.Raw = log
diff --git a/pkg/bindings/StrategyManager/binding.go b/pkg/bindings/StrategyManager/binding.go
index b651c15376..c57d13df97 100644
--- a/pkg/bindings/StrategyManager/binding.go
+++ b/pkg/bindings/StrategyManager/binding.go
@@ -38,7 +38,7 @@ type OperatorSet struct {
// StrategyManagerMetaData contains all meta data concerning the StrategyManager contract.
var StrategyManagerMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"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\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clearBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearBurnOrRedistributableSharesByStrategy\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingOperatorSets\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingSlashIds\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesWithBurnableShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"sharesToBurn\",\"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\":\"BurnOrRedistributableSharesDecreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesIncreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":\"StrategyAlreadyInSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
- Bin: "0x610100604052348015610010575f5ffd5b506040516139d73803806139d783398101604081905261002f916101bc565b80808585856001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805291821660a0521660c05261007c81610093565b60e0525061008a90506100d9565b50505050610301565b5f5f829050601f815111156100c6578260405163305a27a960e01b81526004016100bd91906102a6565b60405180910390fd5b80516100d1826102db565b179392505050565b5f54610100900460ff16156101405760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100bd565b5f5460ff9081161461018f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101a5575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f608085870312156101cf575f5ffd5b84516101da81610191565b60208601519094506101eb81610191565b60408601519093506101fc81610191565b60608601519092506001600160401b03811115610217575f5ffd5b8501601f81018713610227575f5ffd5b80516001600160401b03811115610240576102406101a8565b604051601f8201601f19908116603f011681016001600160401b038111828210171561026e5761026e6101a8565b604052818152828201602001891015610285575f5ffd5b8160208401602083015e5f6020838301015280935050505092959194509250565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102fb575f198160200360031b1b821691505b50919050565b60805160a05160c05160e05161365d61037a5f395f81816110a8015261247401525f81816105fa015281816108c101528181610da30152818161103a0152818161125501526120a901525f81816105a001528181610815015261141a01525f81816104b601528181611aaa01526124e3015261365d5ff3fe608060405234801561000f575f5ffd5b506004361061026b575f3560e01c80637ecebe001161014b578063ca8aa7c7116100bf578063f2fde38b11610084578063f2fde38b1461062f578063f3b4a00014610642578063f698da251461064c578063fabc1cbc14610654578063fd98042314610667578063fe243a171461067a575f5ffd5b8063ca8aa7c71461059b578063cbc2bd62146105c2578063de44acb6146105d5578063df5cf723146105f5578063e7a050aa1461061c575f5ffd5b80638da5cb5b116101105780638da5cb5b1461052b57806394f649dd1461053c578063967fc0d21461054f5780639ac01d6114610562578063b5d8b5b814610575578063c665670214610588575f5ffd5b80637ecebe001461047f578063829fca731461049e578063886f1195146104b157806388c10299146104f05780638b8aac3c14610503575f5ffd5b806350ff7225116101e25780635de08ff2116101a75780635de08ff2146103fc578063663c1de41461040f578063715018a614610431578063724af4231461043957806376fb162b1461044c5780637def15641461045f575f5ffd5b806350ff72251461037c57806354fd4d50146103a4578063595c6a67146103b95780635ac86ab7146103c15780635c975abb146103f4575f5ffd5b806332e89ace1161023357806332e89ace146102f157806336a8c500146103045780633f292b081461031a5780633fb99ca51461032f57806348825e94146103425780634b6d5d6e14610369575f5ffd5b8063136439dd1461026f5780631794bb3c146102845780632d44def6146102975780632eae418c146102bd57806331f8fb4c146102d0575b5f5ffd5b61028261027d366004612e33565b6106a4565b005b610282610292366004612e5e565b6106de565b6102aa6102a5366004612eb2565b610804565b6040519081526020015b60405180910390f35b6102826102cb366004612ef0565b6108b6565b6102e36102de366004612f3e565b610982565b6040516102b4929190612fda565b6102aa6102ff36600461304b565b610b10565b61030c610b95565b6040516102b4929190613125565b610322610cb0565b6040516102b4919061317b565b61028261033d3660046131d8565b610d98565b6102aa7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61028261037736600461321c565b610ee0565b61038f61038a366004612e5e565b61102d565b604080519283526020830191909152016102b4565b6103ac6110a1565b6040516102b49190613265565b6102826110d1565b6103e46103cf366004613277565b609854600160ff9092169190911b9081161490565b60405190151581526020016102b4565b6098546102aa565b61028261040a366004613297565b6110e5565b6103e461041d36600461321c565b60d16020525f908152604090205460ff1681565b610282611238565b6102aa610447366004612e5e565b611249565b6102aa61045a366004612eb2565b6112a6565b61047261046d366004613306565b6112f5565b6040516102b49190613320565b6102aa61048d36600461321c565b60ca6020525f908152604090205481565b6102aa6104ac366004612f3e565b611327565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102b4565b6104726104fe366004612f3e565b611361565b6102aa61051136600461321c565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b03166104d8565b6102e361054a36600461321c565b611498565b60cb546104d8906001600160a01b031681565b6102aa610570366004613332565b61160f565b610282610583366004613297565b6116a0565b61028261059636600461321c565b6117e7565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6104d86105d0366004613393565b61180a565b6105e86105e336600461321c565b61183e565b6040516102b491906133bd565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6102aa61062a366004612e5e565b6118b1565b61028261063d36600461321c565b6118e4565b6104d8620e16e481565b6102aa61195a565b610282610662366004612e33565b611a13565b6102aa61067536600461321c565b611a80565b6102aa6106883660046133cf565b60cd60209081525f928352604080842090915290825290205481565b6106ac611a95565b60985481811681146106d15760405163c61dca5d60e01b815260040160405180910390fd5b6106da82611b38565b5050565b5f54610100900460ff16158080156106fc57505f54600160ff909116105b806107155750303b15801561071557505f5460ff166001145b61077d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561079e575f805461ff0019166101001790555b6107a782611b38565b6107b084611b75565b6107b983611bc6565b80156107fe575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b5f61080d611c2f565b6108a38484847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630f3df50e896040518263ffffffff1660e01b815260040161085f919061344f565b602060405180830381865afa15801561087a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089e919061345d565b611c88565b90506108af6001606555565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ff5760405163f739589b60e01b815260040160405180910390fd5b610907611c2f565b604051636ce5768960e11b81526001600160a01b0384169063d9caed129061093790879086908690600401613478565b6020604051808303815f875af1158015610953573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610977919061349c565b506107fe6001606555565b6060805f60d7816109a061099b368990038901896134b3565b611e90565b81526020019081526020015f205f8581526020019081526020015f2090505f6109c882611ef3565b90505f81516001600160401b038111156109e4576109e4613007565b604051908082528060200260200182016040528015610a0d578160200160208202803683370190505b5090505f82516001600160401b03811115610a2a57610a2a613007565b604051908082528060200260200182016040528015610a53578160200160208202803683370190505b5090505f5b8351811015610b0057838181518110610a7357610a7361350f565b6020026020010151838281518110610a8d57610a8d61350f565b60200260200101906001600160a01b031690816001600160a01b031681525050610ad9848281518110610ac257610ac261350f565b602002602001015186611eff90919063ffffffff16565b9050828281518110610aed57610aed61350f565b6020908102919091010152600101610a58565b50909450925050505b9250929050565b5f5f610b1b81611f23565b610b23611c2f565b6001600160a01b0385165f90815260ca6020526040902054610b5486610b4d818c8c8c878c61160f565b8688611f4e565b6001600160a01b0386165f90815260ca60205260409020600182019055610b7d868a8a8a611fa0565b925050610b8a6001606555565b509695505050505050565b6060805f610ba360d461210d565b90505f816001600160401b03811115610bbe57610bbe613007565b604051908082528060200260200182016040528015610be7578160200160208202803683370190505b5090505f826001600160401b03811115610c0357610c03613007565b604051908082528060200260200182016040528015610c2c578160200160208202803683370190505b5090505f5b83811015610ca5575f5f610c4660d484612117565b9150915081858481518110610c5d57610c5d61350f565b60200260200101906001600160a01b031690816001600160a01b03168152505080848481518110610c9057610c9061350f565b60209081029190910101525050600101610c31565b509094909350915050565b60605f610cbd60d8612125565b90505f816001600160401b03811115610cd857610cd8613007565b604051908082528060200260200182016040528015610d1c57816020015b604080518082019091525f8082526020820152815260200190600190039081610cf65790505b5090505f5b82811015610d9157610d6c610d3760d88361212e565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b828281518110610d7e57610d7e61350f565b6020908102919091010152600101610d21565b5092915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610de15760405163f739589b60e01b815260040160405180910390fd5b610de9611c2f565b5f60d781610dff61099b368990038901896134b3565b815260208082019290925260409081015f90812087825290925290209050610e28818484612139565b610e455760405163ca354fa360e01b815260040160405180910390fd5b610e62610e5a61099b368890038801886134b3565b60d89061214e565b50610e978460da5f610e7c61099b368b90038b018b6134b3565b81526020019081526020015f2061214e90919063ffffffff16565b507f5f5209798bbac45a16d2dc3bc67319fab26ee00153916d6f07b69f8a134a1e8b85858585604051610ecd9493929190613523565b60405180910390a1506107fe6001606555565b610ee8611c2f565b5f610ef460d483611eff565b915050610f0260d483612159565b50604080516001600160a01b0384168152602081018390527fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a1801561101f57816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbe919061345d565b846040518463ffffffff1660e01b8152600401610fdd93929190613478565b6020604051808303815f875af1158015610ff9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101d919061349c565b505b5061102a6001606555565b50565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110785760405163f739589b60e01b815260040160405180910390fd5b611080611c2f565b61108b85858561216d565b915091506110996001606555565b935093915050565b60606110cc7f00000000000000000000000000000000000000000000000000000000000000006122d5565b905090565b6110d9611a95565b6110e35f19611b38565b565b60cb546001600160a01b03163314611110576040516320ba3ff960e21b815260040160405180910390fd5b611118611c2f565b805f5b8181101561122c5760d15f8585848181106111385761113861350f565b905060200201602081019061114d919061321c565b6001600160a01b0316815260208101919091526040015f205460ff1661122457600160d15f8686858181106111845761118461350f565b9050602002016020810190611199919061321c565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8484838181106111f3576111f361350f565b9050602002016020810190611208919061321c565b6040516001600160a01b03909116815260200160405180910390a15b60010161111b565b50506106da6001606555565b611240612312565b6110e35f611b75565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112935760405163f739589b60e01b815260040160405180910390fd5b61129b611c2f565b6108a384848461236c565b5f806112eb8360d7836112c161099b368b90038b018b6134b3565b81526020019081526020015f205f8781526020019081526020015f20611eff90919063ffffffff16565b9695505050505050565b606061132160da5f61130f61099b368790038701876134b3565b81526020019081526020015f2061241a565b92915050565b5f6108af60d78261134061099b368890038801886134b3565b81526020019081526020015f205f8481526020019081526020015f2061210d565b606061136b611c2f565b5f6113a560d78261138461099b368990038901896134b3565b81526020019081526020015f205f8581526020019081526020015f20611ef3565b80519091505f816001600160401b038111156113c3576113c3613007565b6040519080825280602002602001820160405280156113ec578160200160208202803683370190505b5090505f5b828110156114895761146487878684815181106114105761141061350f565b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630f3df50e8c6040518263ffffffff1660e01b815260040161085f919061344f565b8282815181106114765761147661350f565b60209081029190910101526001016113f1565b50925050506113216001606555565b6001600160a01b0381165f90815260ce6020526040812054606091829190816001600160401b038111156114ce576114ce613007565b6040519080825280602002602001820160405280156114f7578160200160208202803683370190505b5090505f5b82811015611585576001600160a01b0386165f90815260cd6020908152604080832060ce909252822080549192918490811061153a5761153a61350f565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205482518390839081106115725761157261350f565b60209081029190910101526001016114fc565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f2081818054806020026020016040519081016040528092919081815260200182805480156115fd57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116115df575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f90611695906101000160405160208183030381529060405280519060200120612426565b979650505050505050565b60cb546001600160a01b031633146116cb576040516320ba3ff960e21b815260040160405180910390fd5b6116d3611c2f565b805f5b8181101561122c5760d15f8585848181106116f3576116f361350f565b9050602002016020810190611708919061321c565b6001600160a01b0316815260208101919091526040015f205460ff16156117df575f60d15f86868581811061173f5761173f61350f565b9050602002016020810190611754919061321c565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba0308484838181106117ae576117ae61350f565b90506020020160208101906117c3919061321c565b6040516001600160a01b03909116815260200160405180910390a15b6001016116d6565b6117ef612312565b6117f7611c2f565b61180081611bc6565b61102a6001606555565b60ce602052815f5260405f208181548110611823575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce60209081526040918290208054835181840281018401909452808452606093928301828280156118a557602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611887575b50505050509050919050565b5f5f6118bc81611f23565b6118c4611c2f565b6118d033868686611fa0565b91506118dc6001606555565b509392505050565b6118ec612312565b6001600160a01b0381166119515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610774565b61102a81611b75565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea6119c761246c565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b611a1b6124e1565b60985480198219811614611a425760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f5f611a8d60d484611eff565b949350505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611af7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1b9190613555565b6110e357604051631d77d47760e21b815260040160405180910390fd5b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b600260655403611c815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610774565b6002606555565b5f8060d781611c9f61099b368a90038a018a6134b3565b815260208082019290925260409081015f90812088825290925281209150611cc78286611eff565b9150611cd590508286612159565b505f8115611dec57856001600160a01b031663d9caed1286886001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d29573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4d919061345d565b856040518463ffffffff1660e01b8152600401611d6c93929190613478565b6020604051808303815f875af1158015611d88573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dac919061349c565b90507fe6413aa0c789e437b0a06bf64b20926584f066c79a2d8b80a759c85472f7b0af88888885604051611de39493929190613523565b60405180910390a15b5f611df684611ef3565b519050805f03611e8457611e348860da5f611e1961099b368f90038f018f6134b3565b81526020019081526020015f2061259290919063ffffffff16565b50611e5f60da5f611e4d61099b368e90038e018e6134b3565b81526020019081526020015f20612125565b5f03611e8457611e82611e7a61099b368c90038c018c6134b3565b60d890612592565b505b50979650505050505050565b5f815f0151826020015163ffffffff16604051602001611edb92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261132190613574565b60605f6108af8361259d565b5f808080611f16866001600160a01b0387166125a8565b9097909650945050505050565b609854600160ff83161b9081160361102a5760405163840a48d560e01b815260040160405180910390fd5b42811015611f6f57604051630819bdcd60e01b815260040160405180910390fd5b611f836001600160a01b03851684846125e0565b6107fe57604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff16611fda57604051632efd965160e11b815260040160405180910390fd5b611fef6001600160a01b038516338786612634565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af115801561203b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061205f919061349c565b91505f5f61206e88888661216d565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b1580156120ec575f5ffd5b505af11580156120fe573d5f5f3e3d5ffd5b50505050505050949350505050565b5f6113218261268c565b5f808080611f168686612696565b5f611321825490565b5f6108af83836126bf565b5f611a8d846001600160a01b038516846126e5565b5f6108af8383612701565b5f6108af836001600160a01b03841661274d565b5f806001600160a01b038516612196576040516316f2ccc960e01b815260040160405180910390fd5b825f036121b6576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038086165f90815260cd602090815260408083209388168352929052908120549081900361225c576001600160a01b0386165f90815260ce60209081526040909120541061221e576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038681165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b61226684826135ab565b6001600160a01b038088165f90815260cd60209081526040808320938a16835292905281902091909155517f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62906122c290889088908890613478565b60405180910390a1959294509192505050565b60605f6122e183612769565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6033546001600160a01b031633146110e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610774565b5f815f0361238d576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038085165f90815260cd6020908152604080832093871683529290522054808311156123d357604051634b18b19360e01b815260040160405180910390fd5b6123dd83826135be565b6001600160a01b038087165f90815260cd602090815260408083209389168352929052908120829055909150819003611a8d57611a8d8585612790565b60605f6108af8361290e565b5f61242f61195a565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60605f6124987f00000000000000000000000000000000000000000000000000000000000000006122d5565b9050805f815181106124ac576124ac61350f565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561253d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612561919061345d565b6001600160a01b0316336001600160a01b0316146110e35760405163794821ff60e01b815260040160405180910390fd5b5f6108af8383612966565b60606113218261241a565b5f8181526002830160205260408120548190806125d5576125c98585612a49565b92505f9150610b099050565b600192509050610b09565b5f5f5f6125ed8585612a54565b90925090505f816004811115612605576126056135d1565b1480156126235750856001600160a01b0316826001600160a01b0316145b806112eb57506112eb868686612a93565b6107fe846323b872dd60e01b85858560405160240161265593929190613478565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612b7a565b5f61132182612125565b5f80806126a3858561212e565b5f81815260029690960160205260409095205494959350505050565b5f825f0182815481106126d4576126d461350f565b905f5260205f200154905092915050565b5f8281526002840160205260408120829055611a8d848461214e565b5f81815260018301602052604081205461274657508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611321565b505f611321565b5f81815260028301602052604081208190556108af8383612592565b5f60ff8216601f81111561132157604051632cd44ac360e21b815260040160405180910390fd5b6001600160a01b0382165f90815260ce6020526040812054905b818110156128a2576001600160a01b038481165f90815260ce60205260409020805491851691839081106127e0576127e061350f565b5f918252602090912001546001600160a01b03160361289a576001600160a01b0384165f90815260ce60205260409020805461281e906001906135be565b8154811061282e5761282e61350f565b5f9182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061286a5761286a61350f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506128a2565b6001016127aa565b8181036128c257604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce602052604090208054806128e8576128e86135e5565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b6060815f018054806020026020016040519081016040528092919081815260200182805480156118a557602002820191905f5260205f20905b8154815260200190600101908083116129475750505050509050919050565b5f8181526001830160205260408120548015612a40575f6129886001836135be565b85549091505f9061299b906001906135be565b90508181146129fa575f865f0182815481106129b9576129b961350f565b905f5260205f200154905080875f0184815481106129d9576129d961350f565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612a0b57612a0b6135e5565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611321565b5f915050611321565b5f6108af8383612c52565b5f5f8251604103612a88576020830151604084015160608501515f1a612a7c87828585612c69565b94509450505050610b09565b505f90506002610b09565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401612abb9291906135f9565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612af99190613611565b5f60405180830381855afa9150503d805f8114612b31576040519150601f19603f3d011682016040523d82523d5f602084013e612b36565b606091505b5091509150818015612b4a57506020815110155b80156112eb57508051630b135d3f60e11b90612b6f908301602090810190840161349c565b149695505050505050565b5f612bce826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d269092919063ffffffff16565b905080515f1480612bee575080806020019051810190612bee9190613555565b612c4d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610774565b505050565b5f81815260018301602052604081205415156108af565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c9e57505f90506003612d1d565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612cef573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612d17575f60019250925050612d1d565b91505f90505b94509492505050565b6060611a8d84845f85855f5f866001600160a01b03168587604051612d4b9190613611565b5f6040518083038185875af1925050503d805f8114612d85576040519150601f19603f3d011682016040523d82523d5f602084013e612d8a565b606091505b50915091506116958783838760608315612e045782515f03612dfd576001600160a01b0385163b612dfd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610774565b5081611a8d565b611a8d8383815115612e195781518083602001fd5b8060405162461bcd60e51b81526004016107749190613265565b5f60208284031215612e43575f5ffd5b5035919050565b6001600160a01b038116811461102a575f5ffd5b5f5f5f60608486031215612e70575f5ffd5b8335612e7b81612e4a565b92506020840135612e8b81612e4a565b929592945050506040919091013590565b5f60408284031215612eac575f5ffd5b50919050565b5f5f5f60808486031215612ec4575f5ffd5b612ece8585612e9c565b9250604084013591506060840135612ee581612e4a565b809150509250925092565b5f5f5f5f60808587031215612f03575f5ffd5b8435612f0e81612e4a565b93506020850135612f1e81612e4a565b92506040850135612f2e81612e4a565b9396929550929360600135925050565b5f5f60608385031215612f4f575f5ffd5b612f598484612e9c565b946040939093013593505050565b5f8151808452602084019350602083015f5b82811015612fa05781516001600160a01b0316865260209586019590910190600101612f79565b5093949350505050565b5f8151808452602084019350602083015f5b82811015612fa0578151865260209586019590910190600101612fbc565b604081525f612fec6040830185612f67565b8281036020840152612ffe8185612faa565b95945050505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561304357613043613007565b604052919050565b5f5f5f5f5f5f60c08789031215613060575f5ffd5b863561306b81612e4a565b9550602087013561307b81612e4a565b945060408701359350606087013561309281612e4a565b92506080870135915060a08701356001600160401b038111156130b3575f5ffd5b8701601f810189136130c3575f5ffd5b80356001600160401b038111156130dc576130dc613007565b6130ef601f8201601f191660200161301b565b8181528a6020838501011115613103575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b604080825283519082018190525f9060208501906060840190835b818110156131675783516001600160a01b0316835260209384019390920191600101613140565b505083810360208501526112eb8186612faa565b602080825282518282018190525f918401906040840190835b818110156131cd57835180516001600160a01b0316845260209081015163ffffffff168185015290930192604090920191600101613194565b509095945050505050565b5f5f5f5f60a085870312156131eb575f5ffd5b6131f58686612e9c565b935060408501359250606085013561320c81612e4a565b9396929550929360800135925050565b5f6020828403121561322c575f5ffd5b81356108af81612e4a565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6108af6020830184613237565b5f60208284031215613287575f5ffd5b813560ff811681146108af575f5ffd5b5f5f602083850312156132a8575f5ffd5b82356001600160401b038111156132bd575f5ffd5b8301601f810185136132cd575f5ffd5b80356001600160401b038111156132e2575f5ffd5b8560208260051b84010111156132f6575f5ffd5b6020919091019590945092505050565b5f60408284031215613316575f5ffd5b6108af8383612e9c565b602081525f6108af6020830184612faa565b5f5f5f5f5f5f60c08789031215613347575f5ffd5b863561335281612e4a565b9550602087013561336281612e4a565b9450604087013561337281612e4a565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f604083850312156133a4575f5ffd5b82356133af81612e4a565b946020939093013593505050565b602081525f6108af6020830184612f67565b5f5f604083850312156133e0575f5ffd5b82356133eb81612e4a565b915060208301356133fb81612e4a565b809150509250929050565b803563ffffffff81168114613419575f5ffd5b919050565b803561342981612e4a565b6001600160a01b0316825263ffffffff61344560208301613406565b1660208301525050565b60408101611321828461341e565b5f6020828403121561346d575f5ffd5b81516108af81612e4a565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f602082840312156134ac575f5ffd5b5051919050565b5f60408284031280156134c4575f5ffd5b50604080519081016001600160401b03811182821017156134e7576134e7613007565b60405282356134f581612e4a565b815261350360208401613406565b60208201529392505050565b634e487b7160e01b5f52603260045260245ffd5b60a08101613531828761341e565b60408201949094526001600160a01b03929092166060830152608090910152919050565b5f60208284031215613565575f5ffd5b815180151581146108af575f5ffd5b80516020808301519190811015612eac575f1960209190910360031b1b16919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561132157611321613597565b8181038181111561132157611321613597565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f611a8d6040830184613237565b5f82518060208501845e5f92019182525091905056fea2646970667358221220b7627aa4b5f670af9e6ba67d84e4503527613f49f272740357d201bd3ad01df764736f6c634300081e0033",
+ Bin: "0x610100604052348015610010575f5ffd5b50604051613a92380380613a9283398101604081905261002f916101bc565b80808585856001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805291821660a0521660c05261007c81610093565b60e0525061008a90506100d9565b50505050610301565b5f5f829050601f815111156100c6578260405163305a27a960e01b81526004016100bd91906102a6565b60405180910390fd5b80516100d1826102db565b179392505050565b5f54610100900460ff16156101405760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100bd565b5f5460ff9081161461018f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101a5575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f608085870312156101cf575f5ffd5b84516101da81610191565b60208601519094506101eb81610191565b60408601519093506101fc81610191565b60608601519092506001600160401b03811115610217575f5ffd5b8501601f81018713610227575f5ffd5b80516001600160401b03811115610240576102406101a8565b604051601f8201601f19908116603f011681016001600160401b038111828210171561026e5761026e6101a8565b604052818152828201602001891015610285575f5ffd5b8160208401602083015e5f6020838301015280935050505092959194509250565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102fb575f198160200360031b1b821691505b50919050565b60805160a05160c05160e05161371861037a5f395f81816110a8015261252f01525f81816105fa015281816108c101528181610da30152818161103a0152818161125501526120a901525f81816105a001528181610815015261141a01525f81816104b601528181611aaa015261259e01526137185ff3fe608060405234801561000f575f5ffd5b506004361061026b575f3560e01c80637ecebe001161014b578063ca8aa7c7116100bf578063f2fde38b11610084578063f2fde38b1461062f578063f3b4a00014610642578063f698da251461064c578063fabc1cbc14610654578063fd98042314610667578063fe243a171461067a575f5ffd5b8063ca8aa7c71461059b578063cbc2bd62146105c2578063de44acb6146105d5578063df5cf723146105f5578063e7a050aa1461061c575f5ffd5b80638da5cb5b116101105780638da5cb5b1461052b57806394f649dd1461053c578063967fc0d21461054f5780639ac01d6114610562578063b5d8b5b814610575578063c665670214610588575f5ffd5b80637ecebe001461047f578063829fca731461049e578063886f1195146104b157806388c10299146104f05780638b8aac3c14610503575f5ffd5b806350ff7225116101e25780635de08ff2116101a75780635de08ff2146103fc578063663c1de41461040f578063715018a614610431578063724af4231461043957806376fb162b1461044c5780637def15641461045f575f5ffd5b806350ff72251461037c57806354fd4d50146103a4578063595c6a67146103b95780635ac86ab7146103c15780635c975abb146103f4575f5ffd5b806332e89ace1161023357806332e89ace146102f157806336a8c500146103045780633f292b081461031a5780633fb99ca51461032f57806348825e94146103425780634b6d5d6e14610369575f5ffd5b8063136439dd1461026f5780631794bb3c146102845780632d44def6146102975780632eae418c146102bd57806331f8fb4c146102d0575b5f5ffd5b61028261027d366004612eee565b6106a4565b005b610282610292366004612f19565b6106de565b6102aa6102a5366004612f6d565b610804565b6040519081526020015b60405180910390f35b6102826102cb366004612fab565b6108b6565b6102e36102de366004612ff9565b610982565b6040516102b4929190613095565b6102aa6102ff366004613106565b610b10565b61030c610b95565b6040516102b49291906131e0565b610322610cb0565b6040516102b49190613236565b61028261033d366004613293565b610d98565b6102aa7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b6102826103773660046132d7565b610ee0565b61038f61038a366004612f19565b61102d565b604080519283526020830191909152016102b4565b6103ac6110a1565b6040516102b49190613320565b6102826110d1565b6103e46103cf366004613332565b609854600160ff9092169190911b9081161490565b60405190151581526020016102b4565b6098546102aa565b61028261040a366004613352565b6110e5565b6103e461041d3660046132d7565b60d16020525f908152604090205460ff1681565b610282611238565b6102aa610447366004612f19565b611249565b6102aa61045a366004612f6d565b6112a6565b61047261046d3660046133c1565b6112f5565b6040516102b491906133db565b6102aa61048d3660046132d7565b60ca6020525f908152604090205481565b6102aa6104ac366004612ff9565b611327565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102b4565b6104726104fe366004612ff9565b611361565b6102aa6105113660046132d7565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b03166104d8565b6102e361054a3660046132d7565b611498565b60cb546104d8906001600160a01b031681565b6102aa6105703660046133ed565b61160f565b610282610583366004613352565b6116a0565b6102826105963660046132d7565b6117e7565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6104d86105d036600461344e565b61180a565b6105e86105e33660046132d7565b61183e565b6040516102b49190613478565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6102aa61062a366004612f19565b6118b1565b61028261063d3660046132d7565b6118e4565b6104d8620e16e481565b6102aa61195a565b610282610662366004612eee565b611a13565b6102aa6106753660046132d7565b611a80565b6102aa61068836600461348a565b60cd60209081525f928352604080842090915290825290205481565b6106ac611a95565b60985481811681146106d15760405163c61dca5d60e01b815260040160405180910390fd5b6106da82611b38565b5050565b5f54610100900460ff16158080156106fc57505f54600160ff909116105b806107155750303b15801561071557505f5460ff166001145b61077d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561079e575f805461ff0019166101001790555b6107a782611b38565b6107b084611b75565b6107b983611bc6565b80156107fe575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b5f61080d611c2f565b6108a38484847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630f3df50e896040518263ffffffff1660e01b815260040161085f919061350a565b602060405180830381865afa15801561087a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089e9190613518565b611c88565b90506108af6001606555565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ff5760405163f739589b60e01b815260040160405180910390fd5b610907611c2f565b604051636ce5768960e11b81526001600160a01b0384169063d9caed129061093790879086908690600401613533565b6020604051808303815f875af1158015610953573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109779190613557565b506107fe6001606555565b6060805f60d7816109a061099b3689900389018961356e565b611e90565b81526020019081526020015f205f8581526020019081526020015f2090505f6109c882611ef3565b90505f81516001600160401b038111156109e4576109e46130c2565b604051908082528060200260200182016040528015610a0d578160200160208202803683370190505b5090505f82516001600160401b03811115610a2a57610a2a6130c2565b604051908082528060200260200182016040528015610a53578160200160208202803683370190505b5090505f5b8351811015610b0057838181518110610a7357610a736135ca565b6020026020010151838281518110610a8d57610a8d6135ca565b60200260200101906001600160a01b031690816001600160a01b031681525050610ad9848281518110610ac257610ac26135ca565b602002602001015186611eff90919063ffffffff16565b9050828281518110610aed57610aed6135ca565b6020908102919091010152600101610a58565b50909450925050505b9250929050565b5f5f610b1b81611f23565b610b23611c2f565b6001600160a01b0385165f90815260ca6020526040902054610b5486610b4d818c8c8c878c61160f565b8688611f4e565b6001600160a01b0386165f90815260ca60205260409020600182019055610b7d868a8a8a611fa0565b925050610b8a6001606555565b509695505050505050565b6060805f610ba360d461210d565b90505f816001600160401b03811115610bbe57610bbe6130c2565b604051908082528060200260200182016040528015610be7578160200160208202803683370190505b5090505f826001600160401b03811115610c0357610c036130c2565b604051908082528060200260200182016040528015610c2c578160200160208202803683370190505b5090505f5b83811015610ca5575f5f610c4660d484612117565b9150915081858481518110610c5d57610c5d6135ca565b60200260200101906001600160a01b031690816001600160a01b03168152505080848481518110610c9057610c906135ca565b60209081029190910101525050600101610c31565b509094909350915050565b60605f610cbd60d8612125565b90505f816001600160401b03811115610cd857610cd86130c2565b604051908082528060200260200182016040528015610d1c57816020015b604080518082019091525f8082526020820152815260200190600190039081610cf65790505b5090505f5b82811015610d9157610d6c610d3760d88361212e565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b828281518110610d7e57610d7e6135ca565b6020908102919091010152600101610d21565b5092915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610de15760405163f739589b60e01b815260040160405180910390fd5b610de9611c2f565b5f60d781610dff61099b3689900389018961356e565b815260208082019290925260409081015f90812087825290925290209050610e28818484612139565b610e455760405163ca354fa360e01b815260040160405180910390fd5b610e62610e5a61099b3688900388018861356e565b60d89061214e565b50610e978460da5f610e7c61099b368b90038b018b61356e565b81526020019081526020015f2061214e90919063ffffffff16565b507f5f5209798bbac45a16d2dc3bc67319fab26ee00153916d6f07b69f8a134a1e8b85858585604051610ecd94939291906135de565b60405180910390a1506107fe6001606555565b610ee8611c2f565b5f610ef460d483611eff565b915050610f0260d483612159565b50604080516001600160a01b0384168152602081018390527fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a1801561101f57816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbe9190613518565b846040518463ffffffff1660e01b8152600401610fdd93929190613533565b6020604051808303815f875af1158015610ff9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101d9190613557565b505b5061102a6001606555565b50565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110785760405163f739589b60e01b815260040160405180910390fd5b611080611c2f565b61108b85858561216d565b915091506110996001606555565b935093915050565b60606110cc7f0000000000000000000000000000000000000000000000000000000000000000612331565b905090565b6110d9611a95565b6110e35f19611b38565b565b60cb546001600160a01b03163314611110576040516320ba3ff960e21b815260040160405180910390fd5b611118611c2f565b805f5b8181101561122c5760d15f858584818110611138576111386135ca565b905060200201602081019061114d91906132d7565b6001600160a01b0316815260208101919091526040015f205460ff1661122457600160d15f868685818110611184576111846135ca565b905060200201602081019061119991906132d7565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8484838181106111f3576111f36135ca565b905060200201602081019061120891906132d7565b6040516001600160a01b03909116815260200160405180910390a15b60010161111b565b50506106da6001606555565b61124061236e565b6110e35f611b75565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112935760405163f739589b60e01b815260040160405180910390fd5b61129b611c2f565b6108a38484846123c8565b5f806112eb8360d7836112c161099b368b90038b018b61356e565b81526020019081526020015f205f8781526020019081526020015f20611eff90919063ffffffff16565b9695505050505050565b606061132160da5f61130f61099b3687900387018761356e565b81526020019081526020015f206124d5565b92915050565b5f6108af60d78261134061099b3688900388018861356e565b81526020019081526020015f205f8481526020019081526020015f2061210d565b606061136b611c2f565b5f6113a560d78261138461099b3689900389018961356e565b81526020019081526020015f205f8581526020019081526020015f20611ef3565b80519091505f816001600160401b038111156113c3576113c36130c2565b6040519080825280602002602001820160405280156113ec578160200160208202803683370190505b5090505f5b82811015611489576114648787868481518110611410576114106135ca565b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630f3df50e8c6040518263ffffffff1660e01b815260040161085f919061350a565b828281518110611476576114766135ca565b60209081029190910101526001016113f1565b50925050506113216001606555565b6001600160a01b0381165f90815260ce6020526040812054606091829190816001600160401b038111156114ce576114ce6130c2565b6040519080825280602002602001820160405280156114f7578160200160208202803683370190505b5090505f5b82811015611585576001600160a01b0386165f90815260cd6020908152604080832060ce909252822080549192918490811061153a5761153a6135ca565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110611572576115726135ca565b60209081029190910101526001016114fc565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f2081818054806020026020016040519081016040528092919081815260200182805480156115fd57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116115df575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f906116959061010001604051602081830303815290604052805190602001206124e1565b979650505050505050565b60cb546001600160a01b031633146116cb576040516320ba3ff960e21b815260040160405180910390fd5b6116d3611c2f565b805f5b8181101561122c5760d15f8585848181106116f3576116f36135ca565b905060200201602081019061170891906132d7565b6001600160a01b0316815260208101919091526040015f205460ff16156117df575f60d15f86868581811061173f5761173f6135ca565b905060200201602081019061175491906132d7565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba0308484838181106117ae576117ae6135ca565b90506020020160208101906117c391906132d7565b6040516001600160a01b03909116815260200160405180910390a15b6001016116d6565b6117ef61236e565b6117f7611c2f565b61180081611bc6565b61102a6001606555565b60ce602052815f5260405f208181548110611823575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce60209081526040918290208054835181840281018401909452808452606093928301828280156118a557602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611887575b50505050509050919050565b5f5f6118bc81611f23565b6118c4611c2f565b6118d033868686611fa0565b91506118dc6001606555565b509392505050565b6118ec61236e565b6001600160a01b0381166119515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610774565b61102a81611b75565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea6119c7612527565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b611a1b61259c565b60985480198219811614611a425760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f5f611a8d60d484611eff565b949350505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611af7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1b9190613610565b6110e357604051631d77d47760e21b815260040160405180910390fd5b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b600260655403611c815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610774565b6002606555565b5f8060d781611c9f61099b368a90038a018a61356e565b815260208082019290925260409081015f90812088825290925281209150611cc78286611eff565b9150611cd590508286612159565b505f8115611dec57856001600160a01b031663d9caed1286886001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d29573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4d9190613518565b856040518463ffffffff1660e01b8152600401611d6c93929190613533565b6020604051808303815f875af1158015611d88573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dac9190613557565b90507fe6413aa0c789e437b0a06bf64b20926584f066c79a2d8b80a759c85472f7b0af88888885604051611de394939291906135de565b60405180910390a15b5f611df684611ef3565b519050805f03611e8457611e348860da5f611e1961099b368f90038f018f61356e565b81526020019081526020015f2061264d90919063ffffffff16565b50611e5f60da5f611e4d61099b368e90038e018e61356e565b81526020019081526020015f20612125565b5f03611e8457611e82611e7a61099b368c90038c018c61356e565b60d89061264d565b505b50979650505050505050565b5f815f0151826020015163ffffffff16604051602001611edb92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526113219061362f565b60605f6108af83612658565b5f808080611f16866001600160a01b038716612663565b9097909650945050505050565b609854600160ff83161b9081160361102a5760405163840a48d560e01b815260040160405180910390fd5b42811015611f6f57604051630819bdcd60e01b815260040160405180910390fd5b611f836001600160a01b038516848461269b565b6107fe57604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff16611fda57604051632efd965160e11b815260040160405180910390fd5b611fef6001600160a01b0385163387866126ef565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af115801561203b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061205f9190613557565b91505f5f61206e88888661216d565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b1580156120ec575f5ffd5b505af11580156120fe573d5f5f3e3d5ffd5b50505050505050949350505050565b5f61132182612747565b5f808080611f168686612751565b5f611321825490565b5f6108af838361277a565b5f611a8d846001600160a01b038516846127a0565b5f6108af83836127bc565b5f6108af836001600160a01b038416612808565b5f806001600160a01b038516612196576040516316f2ccc960e01b815260040160405180910390fd5b825f036121b6576040516342061b2560e11b815260040160405180910390fd5b60405162e7c78560e71b81526001600160a01b038681166004830152602482018590528516906373e3c280906044015f604051808303815f87803b1580156121fc575f5ffd5b505af115801561220e573d5f5f3e3d5ffd5b5050506001600160a01b038087165f90815260cd6020908152604080832093891683529290529081205491508190036122b8576001600160a01b0386165f90815260ce60209081526040909120541061227a576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038681165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b6122c28482613666565b6001600160a01b038088165f90815260cd60209081526040808320938a16835292905281902091909155517f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629061231e90889088908890613533565b60405180910390a1959294509192505050565b60605f61233d83612824565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6033546001600160a01b031633146110e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610774565b5f815f036123e9576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038085165f90815260cd60209081526040808320938716835292905220548083111561242f57604051634b18b19360e01b815260040160405180910390fd5b6040516303e3e6eb60e01b81526001600160a01b038681166004830152602482018590528516906303e3e6eb906044015f604051808303815f87803b158015612476575f5ffd5b505af1158015612488573d5f5f3e3d5ffd5b5050505082816124989190613679565b6001600160a01b038087165f90815260cd602090815260408083209389168352929052908120829055909150819003611a8d57611a8d858561284b565b60605f6108af836129c9565b5f6124ea61195a565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60605f6125537f0000000000000000000000000000000000000000000000000000000000000000612331565b9050805f81518110612567576125676135ca565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061261c9190613518565b6001600160a01b0316336001600160a01b0316146110e35760405163794821ff60e01b815260040160405180910390fd5b5f6108af8383612a21565b6060611321826124d5565b5f818152600283016020526040812054819080612690576126848585612b04565b92505f9150610b099050565b600192509050610b09565b5f5f5f6126a88585612b0f565b90925090505f8160048111156126c0576126c061368c565b1480156126de5750856001600160a01b0316826001600160a01b0316145b806112eb57506112eb868686612b4e565b6107fe846323b872dd60e01b85858560405160240161271093929190613533565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612c35565b5f61132182612125565b5f808061275e858561212e565b5f81815260029690960160205260409095205494959350505050565b5f825f01828154811061278f5761278f6135ca565b905f5260205f200154905092915050565b5f8281526002840160205260408120829055611a8d848461214e565b5f81815260018301602052604081205461280157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611321565b505f611321565b5f81815260028301602052604081208190556108af838361264d565b5f60ff8216601f81111561132157604051632cd44ac360e21b815260040160405180910390fd5b6001600160a01b0382165f90815260ce6020526040812054905b8181101561295d576001600160a01b038481165f90815260ce602052604090208054918516918390811061289b5761289b6135ca565b5f918252602090912001546001600160a01b031603612955576001600160a01b0384165f90815260ce6020526040902080546128d990600190613679565b815481106128e9576128e96135ca565b5f9182526020808320909101546001600160a01b03878116845260ce9092526040909220805491909216919083908110612925576129256135ca565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555061295d565b600101612865565b81810361297d57604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce602052604090208054806129a3576129a36136a0565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b6060815f018054806020026020016040519081016040528092919081815260200182805480156118a557602002820191905f5260205f20905b815481526020019060010190808311612a025750505050509050919050565b5f8181526001830160205260408120548015612afb575f612a43600183613679565b85549091505f90612a5690600190613679565b9050818114612ab5575f865f018281548110612a7457612a746135ca565b905f5260205f200154905080875f018481548110612a9457612a946135ca565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612ac657612ac66136a0565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611321565b5f915050611321565b5f6108af8383612d0d565b5f5f8251604103612b43576020830151604084015160608501515f1a612b3787828585612d24565b94509450505050610b09565b505f90506002610b09565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401612b769291906136b4565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612bb491906136cc565b5f60405180830381855afa9150503d805f8114612bec576040519150601f19603f3d011682016040523d82523d5f602084013e612bf1565b606091505b5091509150818015612c0557506020815110155b80156112eb57508051630b135d3f60e11b90612c2a9083016020908101908401613557565b149695505050505050565b5f612c89826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612de19092919063ffffffff16565b905080515f1480612ca9575080806020019051810190612ca99190613610565b612d085760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610774565b505050565b5f81815260018301602052604081205415156108af565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612d5957505f90506003612dd8565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612daa573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612dd2575f60019250925050612dd8565b91505f90505b94509492505050565b6060611a8d84845f85855f5f866001600160a01b03168587604051612e0691906136cc565b5f6040518083038185875af1925050503d805f8114612e40576040519150601f19603f3d011682016040523d82523d5f602084013e612e45565b606091505b50915091506116958783838760608315612ebf5782515f03612eb8576001600160a01b0385163b612eb85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610774565b5081611a8d565b611a8d8383815115612ed45781518083602001fd5b8060405162461bcd60e51b81526004016107749190613320565b5f60208284031215612efe575f5ffd5b5035919050565b6001600160a01b038116811461102a575f5ffd5b5f5f5f60608486031215612f2b575f5ffd5b8335612f3681612f05565b92506020840135612f4681612f05565b929592945050506040919091013590565b5f60408284031215612f67575f5ffd5b50919050565b5f5f5f60808486031215612f7f575f5ffd5b612f898585612f57565b9250604084013591506060840135612fa081612f05565b809150509250925092565b5f5f5f5f60808587031215612fbe575f5ffd5b8435612fc981612f05565b93506020850135612fd981612f05565b92506040850135612fe981612f05565b9396929550929360600135925050565b5f5f6060838503121561300a575f5ffd5b6130148484612f57565b946040939093013593505050565b5f8151808452602084019350602083015f5b8281101561305b5781516001600160a01b0316865260209586019590910190600101613034565b5093949350505050565b5f8151808452602084019350602083015f5b8281101561305b578151865260209586019590910190600101613077565b604081525f6130a76040830185613022565b82810360208401526130b98185613065565b95945050505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156130fe576130fe6130c2565b604052919050565b5f5f5f5f5f5f60c0878903121561311b575f5ffd5b863561312681612f05565b9550602087013561313681612f05565b945060408701359350606087013561314d81612f05565b92506080870135915060a08701356001600160401b0381111561316e575f5ffd5b8701601f8101891361317e575f5ffd5b80356001600160401b03811115613197576131976130c2565b6131aa601f8201601f19166020016130d6565b8181528a60208385010111156131be575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b604080825283519082018190525f9060208501906060840190835b818110156132225783516001600160a01b03168352602093840193909201916001016131fb565b505083810360208501526112eb8186613065565b602080825282518282018190525f918401906040840190835b8181101561328857835180516001600160a01b0316845260209081015163ffffffff16818501529093019260409092019160010161324f565b509095945050505050565b5f5f5f5f60a085870312156132a6575f5ffd5b6132b08686612f57565b93506040850135925060608501356132c781612f05565b9396929550929360800135925050565b5f602082840312156132e7575f5ffd5b81356108af81612f05565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6108af60208301846132f2565b5f60208284031215613342575f5ffd5b813560ff811681146108af575f5ffd5b5f5f60208385031215613363575f5ffd5b82356001600160401b03811115613378575f5ffd5b8301601f81018513613388575f5ffd5b80356001600160401b0381111561339d575f5ffd5b8560208260051b84010111156133b1575f5ffd5b6020919091019590945092505050565b5f604082840312156133d1575f5ffd5b6108af8383612f57565b602081525f6108af6020830184613065565b5f5f5f5f5f5f60c08789031215613402575f5ffd5b863561340d81612f05565b9550602087013561341d81612f05565b9450604087013561342d81612f05565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f6040838503121561345f575f5ffd5b823561346a81612f05565b946020939093013593505050565b602081525f6108af6020830184613022565b5f5f6040838503121561349b575f5ffd5b82356134a681612f05565b915060208301356134b681612f05565b809150509250929050565b803563ffffffff811681146134d4575f5ffd5b919050565b80356134e481612f05565b6001600160a01b0316825263ffffffff613500602083016134c1565b1660208301525050565b6040810161132182846134d9565b5f60208284031215613528575f5ffd5b81516108af81612f05565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60208284031215613567575f5ffd5b5051919050565b5f604082840312801561357f575f5ffd5b50604080519081016001600160401b03811182821017156135a2576135a26130c2565b60405282356135b081612f05565b81526135be602084016134c1565b60208201529392505050565b634e487b7160e01b5f52603260045260245ffd5b60a081016135ec82876134d9565b60408201949094526001600160a01b03929092166060830152608090910152919050565b5f60208284031215613620575f5ffd5b815180151581146108af575f5ffd5b80516020808301519190811015612f67575f1960209190910360031b1b16919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561132157611321613652565b8181038181111561132157611321613652565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f611a8d60408301846132f2565b5f82518060208501845e5f92019182525091905056fea2646970667358221220134e029ec88d5f404017f834ec41b61634d04ea93225d88bbce45d6d5a7b89d064736f6c634300081e0033",
}
// StrategyManagerABI is the input ABI used to generate the binding from.
diff --git a/script/configs/devnet/deploy_from_scratch.anvil.config.json b/script/configs/devnet/deploy_from_scratch.anvil.config.json
index 6d8b5fef76..a262317eff 100644
--- a/script/configs/devnet/deploy_from_scratch.anvil.config.json
+++ b/script/configs/devnet/deploy_from_scratch.anvil.config.json
@@ -49,7 +49,8 @@
"calculation_interval_seconds": 604800,
"global_operator_commission_bips": 1000,
"OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000,
- "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000
+ "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000,
+ "emissions_controller_address": "0x0000000000000000000000000000000000000000"
},
"ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa",
"semver": "v1.0.3"
diff --git a/script/configs/devnet/deploy_from_scratch.holesky.config.json b/script/configs/devnet/deploy_from_scratch.holesky.config.json
index 054a432868..7f254ab0ef 100644
--- a/script/configs/devnet/deploy_from_scratch.holesky.config.json
+++ b/script/configs/devnet/deploy_from_scratch.holesky.config.json
@@ -49,7 +49,8 @@
"calculation_interval_seconds": 604800,
"global_operator_commission_bips": 1000,
"OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000,
- "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000
+ "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000,
+ "emissions_controller_address": "0x0000000000000000000000000000000000000000"
},
"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 99d3c54cbe..854d69c35e 100644
--- a/script/configs/devnet/deploy_from_scratch.holesky.slashing.config.json
+++ b/script/configs/devnet/deploy_from_scratch.holesky.slashing.config.json
@@ -36,7 +36,8 @@
"calculation_interval_seconds": 604800,
"global_operator_commission_bips": 1000,
"OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000,
- "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000
+ "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000,
+ "emissions_controller_address": "0x0000000000000000000000000000000000000000"
},
"allocationManager": {
"init_paused_status": 0,
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 b557f8ab74..b01ab763ed 100644
--- a/script/configs/local/deploy_from_scratch.slashing.anvil.config.json
+++ b/script/configs/local/deploy_from_scratch.slashing.anvil.config.json
@@ -55,7 +55,8 @@
"calculation_interval_seconds": 604800,
"global_operator_commission_bips": 1000,
"OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000,
- "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000
+ "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000,
+ "emissions_controller_address": "0x0000000000000000000000000000000000000000"
},
"addresses": {
"token": {
diff --git a/script/deploy/devnet/deploy_from_scratch.s.sol b/script/deploy/devnet/deploy_from_scratch.s.sol
index 6c646de7e2..258167cf17 100644
--- a/script/deploy/devnet/deploy_from_scratch.s.sol
+++ b/script/deploy/devnet/deploy_from_scratch.s.sol
@@ -18,6 +18,7 @@ import "../../../src/contracts/permissions/PermissionController.sol";
import "../../../src/contracts/strategies/StrategyBaseTVLLimits.sol";
import "../../../src/contracts/strategies/StrategyFactory.sol";
import "../../../src/contracts/strategies/StrategyBase.sol";
+import "../../../src/contracts/strategies/DurationVaultStrategy.sol";
import "../../../src/contracts/pods/EigenPod.sol";
import "../../../src/contracts/pods/EigenPodManager.sol";
@@ -59,6 +60,8 @@ contract DeployFromScratch is Script, Test {
StrategyFactory public strategyFactoryImplementation;
UpgradeableBeacon public strategyBeacon;
StrategyBase public baseStrategyImplementation;
+ UpgradeableBeacon public durationVaultBeacon;
+ DurationVaultStrategy public durationVaultImplementation;
AllocationManager public allocationManagerImplementation;
AllocationManager public allocationManager;
AllocationManagerView public allocationManagerView;
@@ -106,6 +109,8 @@ contract DeployFromScratch is Script, Test {
uint32 REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP;
uint32 REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH;
+ address REWARDS_COORDINATOR_EMISSIONS_CONTROLLER;
+
// AllocationManager
uint256 ALLOCATION_MANAGER_INIT_PAUSED_STATUS;
@@ -172,6 +177,9 @@ contract DeployFromScratch is Script, Test {
require(executorMultisig != address(0), "executorMultisig address not configured correctly!");
require(operationsMultisig != address(0), "operationsMultisig address not configured correctly!");
+ REWARDS_COORDINATOR_EMISSIONS_CONTROLLER =
+ stdJson.readAddress(config_data, ".rewardsCoordinator.emissions_controller_address");
+
// START RECORDING TRANSACTIONS FOR DEPLOYMENT
vm.startBroadcast();
@@ -249,6 +257,7 @@ contract DeployFromScratch is Script, Test {
delegation,
strategyManager,
IAllocationManager(address(allocationManager)),
+ IEmissionsController(address(REWARDS_COORDINATOR_EMISSIONS_CONTROLLER)),
eigenLayerPauserReg,
permissionController,
REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS,
@@ -269,7 +278,6 @@ contract DeployFromScratch is Script, Test {
);
permissionControllerImplementation = new PermissionController();
- strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg);
// Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them.
{
@@ -312,7 +320,8 @@ contract DeployFromScratch is Script, Test {
REWARDS_COORDINATOR_INIT_PAUSED_STATUS,
REWARDS_COORDINATOR_UPDATER,
REWARDS_COORDINATOR_ACTIVATION_DELAY,
- REWARDS_COORDINATOR_GLOBAL_OPERATOR_COMMISSION_BIPS
+ REWARDS_COORDINATOR_GLOBAL_OPERATOR_COMMISSION_BIPS,
+ executorMultisig // feeRecipient
)
);
@@ -336,16 +345,27 @@ contract DeployFromScratch is Script, Test {
// Create a proxy beacon for base strategy implementation
strategyBeacon = new UpgradeableBeacon(address(baseStrategyImplementation));
+ // Create duration vault strategy implementation and beacon
+ durationVaultImplementation = new DurationVaultStrategy(
+ strategyManager,
+ eigenLayerPauserReg,
+ delegation,
+ IAllocationManager(address(allocationManager)),
+ rewardsCoordinator,
+ IStrategyFactory(address(strategyFactory))
+ );
+ durationVaultBeacon = new UpgradeableBeacon(address(durationVaultImplementation));
+
+ // Create strategy factory implementation with beacons (beacons are now immutable)
+ strategyFactoryImplementation = new StrategyFactory(
+ strategyManager, eigenLayerPauserReg, IBeacon(strategyBeacon), IBeacon(durationVaultBeacon)
+ );
+
// Strategy Factory, upgrade and initialized
eigenLayerProxyAdmin.upgradeAndCall(
ITransparentUpgradeableProxy(payable(address(strategyFactory))),
address(strategyFactoryImplementation),
- abi.encodeWithSelector(
- StrategyFactory.initialize.selector,
- executorMultisig,
- 0, // initial paused status
- IBeacon(strategyBeacon)
- )
+ abi.encodeWithSelector(StrategyFactory.initialize.selector, executorMultisig, 0)
);
// Set the strategyWhitelister to the factory
@@ -413,6 +433,8 @@ contract DeployFromScratch is Script, Test {
vm.serializeAddress(deployed_addresses, "strategyFactoryImplementation", address(strategyFactoryImplementation));
vm.serializeAddress(deployed_addresses, "strategyBeacon", address(strategyBeacon));
vm.serializeAddress(deployed_addresses, "baseStrategyImplementation", address(baseStrategyImplementation));
+ vm.serializeAddress(deployed_addresses, "durationVaultBeacon", address(durationVaultBeacon));
+ vm.serializeAddress(deployed_addresses, "durationVaultImplementation", address(durationVaultImplementation));
vm.serializeAddress(deployed_addresses, "eigenPodManager", address(eigenPodManager));
vm.serializeAddress(deployed_addresses, "eigenPodManagerImplementation", address(eigenPodManagerImplementation));
vm.serializeAddress(deployed_addresses, "rewardsCoordinator", address(rewardsCoordinator));
@@ -539,6 +561,11 @@ contract DeployFromScratch is Script, Test {
strategyBeacon.implementation() == address(baseStrategyImplementation),
"strategyBeacon: implementation set incorrectly"
);
+
+ require(
+ durationVaultBeacon.implementation() == address(durationVaultImplementation),
+ "durationVaultBeacon: implementation set incorrectly"
+ );
}
function _verifyInitialOwners() internal view {
@@ -549,6 +576,7 @@ contract DeployFromScratch is Script, Test {
require(eigenLayerProxyAdmin.owner() == executorMultisig, "eigenLayerProxyAdmin: owner not set correctly");
require(eigenPodBeacon.owner() == executorMultisig, "eigenPodBeacon: owner not set correctly");
require(strategyBeacon.owner() == executorMultisig, "strategyBeacon: owner not set correctly");
+ require(durationVaultBeacon.owner() == executorMultisig, "durationVaultBeacon: owner not set correctly");
}
function _checkPauserInitializations() internal view {
@@ -613,6 +641,23 @@ contract DeployFromScratch is Script, Test {
"baseStrategyImplementation: strategyManager set incorrectly"
);
+ require(
+ durationVaultImplementation.strategyManager() == strategyManager,
+ "durationVaultImplementation: strategyManager set incorrectly"
+ );
+ require(
+ address(durationVaultImplementation.delegationManager()) == address(delegation),
+ "durationVaultImplementation: delegationManager set incorrectly"
+ );
+ require(
+ address(durationVaultImplementation.allocationManager()) == address(allocationManager),
+ "durationVaultImplementation: allocationManager set incorrectly"
+ );
+ require(
+ address(durationVaultImplementation.rewardsCoordinator()) == address(rewardsCoordinator),
+ "durationVaultImplementation: rewardsCoordinator set incorrectly"
+ );
+
require(
eigenPodImplementation.ethPOS() == ethPOSDeposit,
"eigenPodImplementation: ethPOSDeposit contract address not set correctly"
diff --git a/script/deploy/local/deploy_from_scratch.slashing.s.sol b/script/deploy/local/deploy_from_scratch.slashing.s.sol
index 2bae06bc72..aeff770fe2 100644
--- a/script/deploy/local/deploy_from_scratch.slashing.s.sol
+++ b/script/deploy/local/deploy_from_scratch.slashing.s.sol
@@ -111,6 +111,8 @@ contract DeployFromScratch is Script, Test {
uint32 REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP;
uint32 REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH;
+ address REWARDS_COORDINATOR_EMISSIONS_CONTROLLER;
+
// AllocationManager
uint256 ALLOCATION_MANAGER_INIT_PAUSED_STATUS;
@@ -160,6 +162,9 @@ contract DeployFromScratch is Script, Test {
REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH =
uint32(stdJson.readUint(config_data, ".rewardsCoordinator.OPERATOR_SET_MAX_RETROACTIVE_LENGTH"));
+ REWARDS_COORDINATOR_EMISSIONS_CONTROLLER =
+ stdJson.readAddress(config_data, ".rewardsCoordinator.emissions_controller_address");
+
STRATEGY_MANAGER_INIT_WITHDRAWAL_DELAY_BLOCKS =
uint32(stdJson.readUint(config_data, ".strategyManager.init_withdrawal_delay_blocks"));
@@ -219,9 +224,6 @@ contract DeployFromScratch is Script, Test {
allocationManager = AllocationManager(
address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))
);
- allocationManagerView = AllocationManagerView(
- address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))
- );
permissionController = PermissionController(
address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))
);
@@ -237,6 +239,9 @@ contract DeployFromScratch is Script, Test {
eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation));
// Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs
+ // Deploy AllocationManagerView as a standalone implementation (not a proxy)
+ allocationManagerView =
+ new AllocationManagerView(delegation, eigenStrategy, DEALLOCATION_DELAY, ALLOCATION_CONFIGURATION_DELAY);
delegationImplementation = new DelegationManager(
strategyManager,
@@ -258,6 +263,7 @@ contract DeployFromScratch is Script, Test {
delegation,
strategyManager,
IAllocationManager(address(allocationManager)),
+ IEmissionsController(address(REWARDS_COORDINATOR_EMISSIONS_CONTROLLER)),
eigenLayerPauserReg,
permissionController,
REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS,
@@ -327,7 +333,8 @@ contract DeployFromScratch is Script, Test {
REWARDS_COORDINATOR_INIT_PAUSED_STATUS,
REWARDS_COORDINATOR_UPDATER,
REWARDS_COORDINATOR_ACTIVATION_DELAY,
- REWARDS_COORDINATOR_DEFAULT_OPERATOR_SPLIT_BIPS
+ REWARDS_COORDINATOR_DEFAULT_OPERATOR_SPLIT_BIPS,
+ executorMultisig // feeRecipient
)
);
diff --git a/script/operations/e2e/ClaimRewards.s.sol b/script/operations/e2e/ClaimRewards.s.sol
new file mode 100644
index 0000000000..728a21e09f
--- /dev/null
+++ b/script/operations/e2e/ClaimRewards.s.sol
@@ -0,0 +1,112 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "forge-std/Script.sol";
+
+import "src/contracts/core/RewardsCoordinator.sol";
+
+/// @notice Claim RewardsCoordinator rewards using an externally-provided claim JSON.
+///
+/// Intended usage:
+/// - Your coworker/Sidecar produces a claim JSON (already in the correct shape/encoding).
+/// - You run this script against preprod-hoodi (or any Zeus env) to call `processClaim`.
+///
+/// Example:
+/// forge script script/operations/e2e/ClaimRewards.s.sol \
+/// --rpc-url "$RPC_HOODI" --private-key "$PRIVATE_KEY" --broadcast \
+/// --sig "run(string,address,address)" \
+/// -- "path/to/claim.json" 0xEarner 0xRecipient
+contract ClaimRewards is Script {
+ /// @notice Claim using the RewardsCoordinator address from env var `REWARDS_COORDINATOR`.
+ function run(
+ string memory claimFile,
+ address earner,
+ address recipient
+ ) public {
+ address rc = vm.envAddress("REWARDS_COORDINATOR");
+ vm.startBroadcast();
+ _claim(RewardsCoordinator(rc), claimFile, earner, recipient);
+ vm.stopBroadcast();
+ }
+
+ /// @notice Claim using an explicitly provided RewardsCoordinator address.
+ function runWithRewardsCoordinator(
+ address rewardsCoordinator,
+ string memory claimFile,
+ address earner,
+ address recipient
+ ) public {
+ vm.startBroadcast();
+ _claim(RewardsCoordinator(rewardsCoordinator), claimFile, earner, recipient);
+ vm.stopBroadcast();
+ }
+
+ function _claim(
+ RewardsCoordinator rc,
+ string memory claimFile,
+ address earner,
+ address recipient
+ ) internal {
+ IRewardsCoordinatorTypes.RewardsMerkleClaim memory claim = _loadClaimFromFile(claimFile);
+ require(claim.earnerLeaf.earner == earner, "claim earner mismatch");
+ rc.processClaim(claim, recipient);
+ }
+
+ function _loadClaimFromFile(
+ string memory claimPath
+ ) internal view returns (IRewardsCoordinatorTypes.RewardsMerkleClaim memory claim) {
+ string memory fullPath = _resolvePath(claimPath);
+ string memory json = vm.readFile(fullPath);
+
+ // Accept either:
+ // - direct object: { rootIndex, earnerIndex, earnerTreeProof, earnerLeaf, tokenIndices, tokenTreeProofs, tokenLeaves }
+ // - wrapped: { proof: { ... } } (Sidecar-style)
+ if (_hasJsonPath(json, ".proof")) {
+ claim.rootIndex = uint32(abi.decode(vm.parseJson(json, ".proof.rootIndex"), (uint256)));
+ claim.earnerIndex = uint32(abi.decode(vm.parseJson(json, ".proof.earnerIndex"), (uint256)));
+ claim.earnerTreeProof = abi.decode(vm.parseJson(json, ".proof.earnerTreeProof"), (bytes));
+ claim.earnerLeaf =
+ abi.decode(vm.parseJson(json, ".proof.earnerLeaf"), (IRewardsCoordinatorTypes.EarnerTreeMerkleLeaf));
+
+ // If the proof contains scalar token fields, wrap them into single-element arrays.
+ claim.tokenIndices = new uint32[](1);
+ claim.tokenIndices[0] = uint32(abi.decode(vm.parseJson(json, ".proof.tokenIndices"), (uint256)));
+ claim.tokenTreeProofs = new bytes[](1);
+ claim.tokenTreeProofs[0] = abi.decode(vm.parseJson(json, ".proof.tokenTreeProofs"), (bytes));
+ claim.tokenLeaves = new IRewardsCoordinatorTypes.TokenTreeMerkleLeaf[](1);
+ claim.tokenLeaves[0] =
+ abi.decode(vm.parseJson(json, ".proof.tokenLeaves"), (IRewardsCoordinatorTypes.TokenTreeMerkleLeaf));
+ return claim;
+ }
+
+ claim.rootIndex = uint32(abi.decode(vm.parseJson(json, ".rootIndex"), (uint256)));
+ claim.earnerIndex = uint32(abi.decode(vm.parseJson(json, ".earnerIndex"), (uint256)));
+ claim.earnerTreeProof = abi.decode(vm.parseJson(json, ".earnerTreeProof"), (bytes));
+ claim.earnerLeaf =
+ abi.decode(vm.parseJson(json, ".earnerLeaf"), (IRewardsCoordinatorTypes.EarnerTreeMerkleLeaf));
+ claim.tokenIndices = abi.decode(vm.parseJson(json, ".tokenIndices"), (uint32[]));
+ claim.tokenTreeProofs = abi.decode(vm.parseJson(json, ".tokenTreeProofs"), (bytes[]));
+ claim.tokenLeaves =
+ abi.decode(vm.parseJson(json, ".tokenLeaves"), (IRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]));
+ }
+
+ function _hasJsonPath(
+ string memory json,
+ string memory path
+ ) internal pure returns (bool) {
+ try vm.parseJson(json, path) returns (bytes memory raw) {
+ return raw.length != 0;
+ } catch {
+ return false;
+ }
+ }
+
+ function _resolvePath(
+ string memory path
+ ) internal view returns (string memory) {
+ bytes memory b = bytes(path);
+ if (b.length > 0 && b[0] == bytes1("/")) return path;
+ return string.concat(vm.projectRoot(), "/", path);
+ }
+}
+
diff --git a/script/operations/e2e/DurationVaultHoodiE2E.s.sol b/script/operations/e2e/DurationVaultHoodiE2E.s.sol
new file mode 100644
index 0000000000..054661b3cf
--- /dev/null
+++ b/script/operations/e2e/DurationVaultHoodiE2E.s.sol
@@ -0,0 +1,631 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "forge-std/Script.sol";
+import "forge-std/console2.sol";
+
+import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol";
+
+import "src/contracts/core/AllocationManager.sol";
+import "src/contracts/core/DelegationManager.sol";
+import "src/contracts/core/RewardsCoordinator.sol";
+import "src/contracts/core/StrategyManager.sol";
+import "src/contracts/strategies/StrategyFactory.sol";
+import "src/contracts/interfaces/IDurationVaultStrategy.sol";
+import "src/contracts/libraries/OperatorSetLib.sol";
+
+import {MockAVSRegistrar} from "./MockAVSRegistrar.sol";
+
+/// @notice End-to-end smoke test for DurationVault on Hoodi (or any live env).
+///
+/// What this script does on-chain (broadcast):
+/// - Creates an AVS (your EOA address) in AllocationManager with a minimal registrar
+/// - Creates a redistributing operator set (insurance recipient = you by default)
+/// - Deploys an ERC20 test asset + DurationVaultStrategy via StrategyFactory
+/// - Adds the vault strategy to the operator set
+/// - Delegates + deposits into the vault
+/// - Locks the vault, then slashes it and clears redistributable shares to insurance recipient
+/// - Creates an AVS rewards submission (sidecar should pick this up and later submit a root)
+///
+/// This is designed to validate:
+/// - vault deploy works against live core protocol
+/// - delegation requirement works
+/// - lock/allocations/slashability works
+/// - slashing routes value to the operator set redistribution recipient
+/// - rewards submission plumbing works end-to-end with the sidecar (root + claim is follow-up)
+///
+/// Address wiring:
+/// - You can either pass the 5 core contract addresses as args (recommended), or set env vars:
+/// - ALLOCATION_MANAGER
+/// - DELEGATION_MANAGER
+/// - STRATEGY_MANAGER
+/// - STRATEGY_FACTORY
+/// - REWARDS_COORDINATOR
+contract DurationVaultHoodiE2E is Script {
+ using OperatorSetLib for OperatorSet;
+
+ struct PersistedState {
+ address avs;
+ uint32 operatorSetId;
+ address insuranceRecipient;
+ address registrar;
+ address asset;
+ address vault;
+ uint32 allocationEffectBlock;
+ }
+
+ struct E2EContext {
+ // core
+ AllocationManager allocationManager;
+ DelegationManager delegationManager;
+ StrategyManager strategyManager;
+ StrategyFactory strategyFactory;
+ RewardsCoordinator rewardsCoordinator;
+ // identities
+ address eoa;
+ address avs;
+ address insuranceRecipient;
+ uint32 operatorSetId;
+ OperatorSet opSet;
+ // deployed
+ MockAVSRegistrar registrar;
+ ERC20PresetFixedSupply asset;
+ IDurationVaultStrategy vault;
+ // config
+ uint256 maxPerDeposit;
+ uint256 stakeCap;
+ uint32 durationSeconds;
+ uint256 depositAmount;
+ uint256 slashWad;
+ // ephemeral
+ IStrategy[] strategies;
+ }
+
+ /// Optional environment overrides:
+ /// - E2E_OPERATOR_SET_ID (uint)
+ /// - E2E_VAULT_DURATION_SECONDS (uint)
+ /// - E2E_DEPOSIT_AMOUNT (uint)
+ /// - E2E_STAKE_CAP (uint)
+ /// - E2E_MAX_PER_DEPOSIT (uint)
+ /// - E2E_SLASH_WAD (uint) // 1e18 = 100%
+ /// - E2E_INSURANCE_RECIPIENT (address)
+ /// - E2E_REWARD_AMOUNT (uint)
+ /// - E2E_REWARDS_START_TIMESTAMP (uint) // defaults to previous CALCULATION_INTERVAL_SECONDS boundary
+ /// - E2E_REWARDS_DURATION_SECONDS (uint) // defaults to CALCULATION_INTERVAL_SECONDS
+ /// - E2E_REWARDS_MODE (string): "avs" (default) | "operatorDirectedOperatorSet"
+ /// - E2E_REQUIRE_NONZERO_REDISTRIBUTION (bool) // default false; if true, require slashing redistributes > 0
+ /// - E2E_REQUIRE_NOW_IN_REWARDS_WINDOW (bool) // default true; if true, require now in [start, start+duration)
+ /// - E2E_PHASE (string): "all" (default) | "setup" | "slash" | "rewards"
+ /// - E2E_STATE_FILE (string): file to write/read persisted state (default "script/operations/e2e/e2e-state.json")
+
+ /// @notice Run using addresses from environment variables.
+ /// @dev Use `--sig "run()"` (default) and set ALLOCATION_MANAGER/DELEGATION_MANAGER/...
+ function run() public {
+ (
+ AllocationManager allocationManager,
+ DelegationManager delegationManager,
+ StrategyManager strategyManager,
+ StrategyFactory strategyFactory,
+ RewardsCoordinator rewardsCoordinator
+ ) = _loadCoreFromEnv();
+ _runWithCore(allocationManager, delegationManager, strategyManager, strategyFactory, rewardsCoordinator);
+ }
+
+ /// @notice Run using addresses passed as arguments.
+ /// @dev Use:
+ /// forge script ... --sig "runWithCore(address,address,address,address,address)" --
+ function runWithCore(
+ address allocationManager,
+ address delegationManager,
+ address strategyManager,
+ address strategyFactory,
+ address rewardsCoordinator
+ ) public {
+ _runWithCore(
+ AllocationManager(allocationManager),
+ DelegationManager(delegationManager),
+ StrategyManager(strategyManager),
+ StrategyFactory(strategyFactory),
+ RewardsCoordinator(rewardsCoordinator)
+ );
+ }
+
+ function _runWithCore(
+ AllocationManager allocationManager,
+ DelegationManager delegationManager,
+ StrategyManager strategyManager,
+ StrategyFactory strategyFactory,
+ RewardsCoordinator rewardsCoordinator
+ ) internal {
+ // If you want fork-only simulation without passing a private key, you can set E2E_SENDER=.
+ address sender = vm.envOr("E2E_SENDER", address(0));
+ if (sender != address(0)) vm.startBroadcast(sender);
+ else vm.startBroadcast();
+
+ string memory phase = vm.envOr("E2E_PHASE", string("all"));
+ bytes32 phaseHash = keccak256(bytes(phase));
+
+ if (phaseHash == keccak256("setup")) {
+ E2EContext memory ctx = _initContext(
+ allocationManager, delegationManager, strategyManager, strategyFactory, rewardsCoordinator
+ );
+ _setupAVS(ctx);
+ _createOperatorSet(ctx);
+ _deployVault(ctx);
+ _depositAndLock(ctx);
+ _persistState(ctx);
+ } else if (phaseHash == keccak256("slash")) {
+ E2EContext memory ctx = _initContext(
+ allocationManager, delegationManager, strategyManager, strategyFactory, rewardsCoordinator
+ );
+ PersistedState memory st = _loadState();
+ require(st.avs == ctx.avs, "state avs != broadcaster");
+ require(st.operatorSetId == ctx.operatorSetId, "state operatorSetId mismatch");
+
+ ctx.insuranceRecipient = st.insuranceRecipient;
+ ctx.opSet = OperatorSet({avs: ctx.avs, id: st.operatorSetId});
+ ctx.asset = ERC20PresetFixedSupply(st.asset);
+ ctx.vault = IDurationVaultStrategy(st.vault);
+ ctx.strategies = new IStrategy[](1);
+ ctx.strategies[0] = IStrategy(st.vault);
+
+ // Ensure the allocation has become effective, otherwise slashing can legitimately produce 0.
+ IAllocationManagerTypes.Allocation memory alloc =
+ ctx.allocationManager.getAllocation(address(ctx.vault), ctx.opSet, IStrategy(address(ctx.vault)));
+ if (alloc.currentMagnitude == 0 && block.number < alloc.effectBlock) {
+ console2.log("Allocation not effective yet. Wait until block >=", uint256(alloc.effectBlock));
+ console2.log("Current block:", block.number);
+ revert("allocation not effective yet");
+ }
+
+ _slashAndRedistribute(ctx);
+ _createRewardsSubmission(ctx);
+ } else if (phaseHash == keccak256("rewards")) {
+ // Rewards-only: reuse the previously deployed vault and just create a new rewards submission in a window
+ // that includes "now" (the script enforces this).
+ E2EContext memory ctx = _initContext(
+ allocationManager, delegationManager, strategyManager, strategyFactory, rewardsCoordinator
+ );
+ PersistedState memory st = _loadState();
+ require(st.avs == ctx.avs, "state avs != broadcaster");
+ require(st.operatorSetId == ctx.operatorSetId, "state operatorSetId mismatch");
+
+ ctx.insuranceRecipient = st.insuranceRecipient;
+ ctx.opSet = OperatorSet({avs: ctx.avs, id: st.operatorSetId});
+ ctx.asset = ERC20PresetFixedSupply(st.asset);
+ ctx.vault = IDurationVaultStrategy(st.vault);
+ ctx.strategies = new IStrategy[](1);
+ ctx.strategies[0] = IStrategy(st.vault);
+
+ _createRewardsSubmission(ctx);
+ } else {
+ // "all" (default): run everything in one shot; slashing may produce 0 if allocation isn't effective yet.
+ E2EContext memory ctx = _initContext(
+ allocationManager, delegationManager, strategyManager, strategyFactory, rewardsCoordinator
+ );
+ _setupAVS(ctx);
+ _createOperatorSet(ctx);
+ _deployVault(ctx);
+ _depositAndLock(ctx);
+ _slashAndRedistribute(ctx);
+ _createRewardsSubmission(ctx);
+ }
+ vm.stopBroadcast();
+ }
+
+ function _loadCoreFromEnv()
+ internal
+ view
+ returns (AllocationManager, DelegationManager, StrategyManager, StrategyFactory, RewardsCoordinator)
+ {
+ address allocationManager = vm.envAddress("ALLOCATION_MANAGER");
+ address delegationManager = vm.envAddress("DELEGATION_MANAGER");
+ address strategyManager = vm.envAddress("STRATEGY_MANAGER");
+ address strategyFactory = vm.envAddress("STRATEGY_FACTORY");
+ address rewardsCoordinator = vm.envAddress("REWARDS_COORDINATOR");
+ return (
+ AllocationManager(allocationManager),
+ DelegationManager(delegationManager),
+ StrategyManager(strategyManager),
+ StrategyFactory(strategyFactory),
+ RewardsCoordinator(rewardsCoordinator)
+ );
+ }
+
+ function _initContext(
+ AllocationManager allocationManager,
+ DelegationManager delegationManager,
+ StrategyManager strategyManager,
+ StrategyFactory strategyFactory,
+ RewardsCoordinator rewardsCoordinator
+ ) internal view returns (E2EContext memory ctx) {
+ ctx.allocationManager = allocationManager;
+ ctx.delegationManager = delegationManager;
+ ctx.strategyManager = strategyManager;
+ ctx.strategyFactory = strategyFactory;
+ ctx.rewardsCoordinator = rewardsCoordinator;
+
+ // In forge scripts, `msg.sender` is the script contract; use tx.origin as the broadcaster address.
+ ctx.eoa = tx.origin;
+ ctx.avs = ctx.eoa;
+
+ ctx.operatorSetId = uint32(vm.envOr("E2E_OPERATOR_SET_ID", uint256(1)));
+ ctx.insuranceRecipient = vm.envOr("E2E_INSURANCE_RECIPIENT", address(ctx.eoa));
+
+ ctx.maxPerDeposit = vm.envOr("E2E_MAX_PER_DEPOSIT", uint256(200 ether));
+ ctx.stakeCap = vm.envOr("E2E_STAKE_CAP", uint256(1000 ether));
+ ctx.durationSeconds = uint32(vm.envOr("E2E_VAULT_DURATION_SECONDS", uint256(120))); // 2 minutes default
+ ctx.depositAmount = vm.envOr("E2E_DEPOSIT_AMOUNT", uint256(100 ether));
+ ctx.slashWad = vm.envOr("E2E_SLASH_WAD", uint256(0.25e18));
+
+ ctx.opSet = OperatorSet({avs: ctx.avs, id: ctx.operatorSetId});
+ }
+
+ function _setupAVS(
+ E2EContext memory ctx
+ ) internal returns (E2EContext memory) {
+ ctx.allocationManager.updateAVSMetadataURI(ctx.avs, "ipfs://e2e-duration-vault/avs-metadata");
+ ctx.registrar = new MockAVSRegistrar(ctx.avs);
+ ctx.allocationManager.setAVSRegistrar(ctx.avs, ctx.registrar);
+ require(address(ctx.allocationManager.getAVSRegistrar(ctx.avs)) == address(ctx.registrar), "registrar not set");
+ return ctx;
+ }
+
+ function _createOperatorSet(
+ E2EContext memory ctx
+ ) internal returns (E2EContext memory) {
+ IAllocationManagerTypes.CreateSetParamsV2[] memory sets = new IAllocationManagerTypes.CreateSetParamsV2[](1);
+ sets[0] = IAllocationManagerTypes.CreateSetParamsV2({
+ operatorSetId: ctx.operatorSetId,
+ strategies: new IStrategy[](0),
+ slasher: ctx.eoa
+ });
+ address[] memory recipients = new address[](1);
+ recipients[0] = ctx.insuranceRecipient;
+ ctx.allocationManager.createRedistributingOperatorSets(ctx.avs, sets, recipients);
+ require(ctx.allocationManager.isOperatorSet(ctx.opSet), "operator set not created");
+ require(ctx.allocationManager.isRedistributingOperatorSet(ctx.opSet), "operator set not redistributing");
+ require(
+ ctx.allocationManager.getRedistributionRecipient(ctx.opSet) == ctx.insuranceRecipient,
+ "bad redistribution recipient"
+ );
+ require(ctx.allocationManager.getSlasher(ctx.opSet) == ctx.eoa, "bad slasher");
+ return ctx;
+ }
+
+ function _deployVault(
+ E2EContext memory ctx
+ ) internal returns (E2EContext memory) {
+ ctx.asset = new ERC20PresetFixedSupply("Hoodi Duration Vault Asset", "HDVA", 1_000_000 ether, ctx.eoa);
+
+ IDurationVaultStrategyTypes.VaultConfig memory cfg;
+ cfg.underlyingToken = ctx.asset;
+ cfg.vaultAdmin = ctx.eoa;
+ cfg.arbitrator = ctx.eoa;
+ cfg.duration = ctx.durationSeconds;
+ cfg.maxPerDeposit = ctx.maxPerDeposit;
+ cfg.stakeCap = ctx.stakeCap;
+ cfg.metadataURI = "ipfs://e2e-duration-vault/metadata";
+ cfg.operatorSet = ctx.opSet;
+ cfg.operatorSetRegistrationData = "";
+ cfg.delegationApprover = address(0);
+ cfg.operatorMetadataURI = "ipfs://e2e-duration-vault/operator-metadata";
+
+ ctx.vault = ctx.strategyFactory.deployDurationVaultStrategy(cfg);
+
+ ctx.strategies = new IStrategy[](1);
+ ctx.strategies[0] = IStrategy(address(ctx.vault));
+ ctx.allocationManager.addStrategiesToOperatorSet(ctx.avs, ctx.operatorSetId, ctx.strategies);
+ require(
+ _operatorSetContainsStrategy(ctx.allocationManager, ctx.opSet, IStrategy(address(ctx.vault))),
+ "vault not in operator set"
+ );
+ return ctx;
+ }
+
+ function _depositAndLock(
+ E2EContext memory ctx
+ ) internal returns (E2EContext memory) {
+ require(ctx.depositAmount <= ctx.maxPerDeposit, "deposit > maxPerDeposit");
+
+ IDelegationManager.SignatureWithExpiry memory emptySig;
+ ctx.delegationManager.delegateTo(address(ctx.vault), emptySig, bytes32(0));
+
+ ctx.asset.approve(address(ctx.strategyManager), ctx.depositAmount);
+ uint256 depositShares =
+ ctx.strategyManager.depositIntoStrategy(IStrategy(address(ctx.vault)), ctx.asset, ctx.depositAmount);
+ require(depositShares != 0, "deposit shares = 0");
+ require(
+ _getDepositedShares(ctx.strategyManager, ctx.eoa, IStrategy(address(ctx.vault))) == depositShares,
+ "unexpected shares"
+ );
+
+ ctx.vault.lock();
+ require(ctx.vault.allocationsActive(), "allocations not active after lock");
+ require(ctx.allocationManager.isOperatorSlashable(address(ctx.vault), ctx.opSet), "vault not slashable");
+ return ctx;
+ }
+
+ function _slashAndRedistribute(
+ E2EContext memory ctx
+ ) internal returns (E2EContext memory) {
+ require(ctx.slashWad > 0 && ctx.slashWad <= 1e18, "invalid slash wad");
+
+ uint256 slashCountBefore = ctx.allocationManager.getSlashCount(ctx.opSet);
+
+ IAllocationManagerTypes.SlashingParams memory slashParams;
+ slashParams.operator = address(ctx.vault);
+ slashParams.operatorSetId = ctx.operatorSetId;
+ slashParams.strategies = ctx.strategies;
+ slashParams.wadsToSlash = new uint256[](1);
+ slashParams.wadsToSlash[0] = ctx.slashWad;
+ slashParams.description = "e2e-duration-vault-slash";
+
+ (uint256 slashId,) = ctx.allocationManager.slashOperator(ctx.avs, slashParams);
+ require(ctx.allocationManager.getSlashCount(ctx.opSet) == slashCountBefore + 1, "slash count not incremented");
+ require(slashId == slashCountBefore + 1, "unexpected slashId");
+
+ uint256 sharesToRedistribute =
+ ctx.strategyManager.getBurnOrRedistributableShares(ctx.opSet, slashId, IStrategy(address(ctx.vault)));
+
+ uint256 insuranceBefore = ctx.asset.balanceOf(ctx.insuranceRecipient);
+ uint256 redistributed = ctx.strategyManager
+ .clearBurnOrRedistributableSharesByStrategy(ctx.opSet, slashId, IStrategy(address(ctx.vault)));
+ uint256 insuranceAfter = ctx.asset.balanceOf(ctx.insuranceRecipient);
+
+ require(insuranceAfter >= insuranceBefore, "insurance balance decreased");
+ require(insuranceAfter - insuranceBefore == redistributed, "redistributed != insurance delta");
+
+ // In some live-network conditions (notably allocation delay / effectBlock timing), the slash can legitimately
+ // result in zero burn/redistributable shares. That still validates that the slashing plumbing works.
+ //
+ // For fork confidence, you can require a nonzero redistribution:
+ // export E2E_REQUIRE_NONZERO_REDISTRIBUTION=true
+ bool requireNonzero = vm.envOr("E2E_REQUIRE_NONZERO_REDISTRIBUTION", false);
+ if (requireNonzero) {
+ require(sharesToRedistribute != 0, "no shares to redistribute");
+ require(redistributed != 0, "no tokens redistributed");
+ }
+ return ctx;
+ }
+
+ function _createRewardsSubmission(
+ E2EContext memory ctx
+ ) internal {
+ string memory mode = vm.envOr("E2E_REWARDS_MODE", string("avs"));
+ bytes32 modeHash = keccak256(bytes(mode));
+
+ ERC20PresetFixedSupply rewardToken =
+ new ERC20PresetFixedSupply("Hoodi Rewards Token", "HDRW", 1_000_000 ether, ctx.eoa);
+ uint256 rewardAmount = vm.envOr("E2E_REWARD_AMOUNT", uint256(10 ether));
+
+ IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory sams =
+ new IRewardsCoordinatorTypes.StrategyAndMultiplier[](1);
+ sams[0] =
+ IRewardsCoordinatorTypes.StrategyAndMultiplier({strategy: IStrategy(address(ctx.vault)), multiplier: 1e18});
+
+ uint32 interval = ctx.rewardsCoordinator.CALCULATION_INTERVAL_SECONDS();
+
+ // RewardsCoordinator constraints (enforced again on-chain):
+ // - startTimestamp % CALCULATION_INTERVAL_SECONDS == 0
+ // - duration % CALCULATION_INTERVAL_SECONDS == 0
+ uint32 defaultDuration = interval;
+ uint32 rewardsDuration = uint32(vm.envOr("E2E_REWARDS_DURATION_SECONDS", uint256(defaultDuration)));
+ require(rewardsDuration % interval == 0, "rewardsDuration must be multiple of CALCULATION_INTERVAL_SECONDS");
+
+ // Mode A: Standard AVS rewards submission (works for protocol; may not be indexed by Sidecar if it only
+ // understands legacy AVSDirectory registrations).
+ if (modeHash == keccak256("avs")) {
+ // Defaults are aligned for live networks like preprod-hoodi (interval = 1 day).
+ uint32 defaultStartTs = _defaultAlignedRewardsStartTimestamp(interval);
+ uint32 startTs = uint32(vm.envOr("E2E_REWARDS_START_TIMESTAMP", uint256(defaultStartTs)));
+
+ require(startTs % interval == 0, "startTs must be multiple of CALCULATION_INTERVAL_SECONDS");
+
+ // Ensure the submission window overlaps the time we actually have stake (this script deposits immediately
+ // before creating the rewards submission in the "all" / "slash" flows). If you set a window entirely in the
+ // past, Sidecar will correctly omit this earner and you'll see "earner index not found" when generating a
+ // claim.
+ //
+ // For live-network runs, it can be convenient to schedule a future-aligned submission window (e.g. next UTC
+ // day) without waiting for the window to start. Set E2E_REQUIRE_NOW_IN_REWARDS_WINDOW=false to skip this.
+ bool requireNowInWindow = vm.envOr("E2E_REQUIRE_NOW_IN_REWARDS_WINDOW", true);
+ if (requireNowInWindow) {
+ require(block.timestamp >= startTs, "now before rewards start");
+ require(block.timestamp < uint256(startTs) + uint256(rewardsDuration), "now after rewards end");
+ }
+
+ IRewardsCoordinatorTypes.RewardsSubmission memory sub = IRewardsCoordinatorTypes.RewardsSubmission({
+ strategiesAndMultipliers: sams,
+ token: rewardToken,
+ amount: rewardAmount,
+ startTimestamp: startTs,
+ duration: rewardsDuration
+ });
+ _submitAndVerifyRewards(ctx, rewardToken, rewardAmount, sub);
+ return;
+ }
+
+ // Mode B: Operator-directed rewards submission for the operator set (strictly retroactive).
+ // Sidecar can choose to index this path differently. This will revert unless the window is strictly in the past.
+ if (modeHash == keccak256("operatorDirectedOperatorSet")) {
+ uint256 nowTs = block.timestamp;
+ uint256 endTs = (interval == 0) ? nowTs : (nowTs / interval) * interval;
+ // Must be strictly retroactive: end < now.
+ if (endTs >= nowTs) endTs = endTs - interval;
+
+ uint32 defaultStartTs = uint32(endTs - uint256(rewardsDuration));
+ uint32 startTs = uint32(vm.envOr("E2E_REWARDS_START_TIMESTAMP", uint256(defaultStartTs)));
+ require(startTs % interval == 0, "startTs must be multiple of CALCULATION_INTERVAL_SECONDS");
+ require(uint256(startTs) + uint256(rewardsDuration) < block.timestamp, "operator-directed must be retro");
+
+ _submitAndVerifyOperatorDirectedOperatorSetRewards(
+ ctx, rewardToken, rewardAmount, sams, startTs, rewardsDuration
+ );
+ return;
+ }
+
+ revert("unknown E2E_REWARDS_MODE");
+ }
+
+ function _submitAndVerifyOperatorDirectedOperatorSetRewards(
+ E2EContext memory ctx,
+ ERC20PresetFixedSupply rewardToken,
+ uint256 rewardAmount,
+ IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory sams,
+ uint32 startTs,
+ uint32 rewardsDuration
+ ) internal {
+ IRewardsCoordinatorTypes.OperatorReward[] memory ors = new IRewardsCoordinatorTypes.OperatorReward[](1);
+ ors[0] = IRewardsCoordinatorTypes.OperatorReward({operator: address(ctx.vault), amount: rewardAmount});
+
+ IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission memory od =
+ IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission({
+ strategiesAndMultipliers: sams,
+ token: rewardToken,
+ operatorRewards: ors,
+ startTimestamp: startTs,
+ duration: rewardsDuration,
+ description: "e2e-duration-vault-operator-directed"
+ });
+
+ IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[] memory ods =
+ new IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[](1);
+ ods[0] = od;
+
+ uint256 nonceBefore = ctx.rewardsCoordinator.submissionNonce(ctx.avs);
+ uint256 rcBalBefore = rewardToken.balanceOf(address(ctx.rewardsCoordinator));
+ bytes32 expectedHash = keccak256(abi.encode(ctx.avs, nonceBefore, od));
+
+ rewardToken.approve(address(ctx.rewardsCoordinator), rewardAmount);
+ ctx.rewardsCoordinator.createOperatorDirectedOperatorSetRewardsSubmission(ctx.opSet, ods);
+
+ require(ctx.rewardsCoordinator.submissionNonce(ctx.avs) == nonceBefore + 1, "submission nonce not incremented");
+ require(
+ ctx.rewardsCoordinator.isOperatorDirectedOperatorSetRewardsSubmissionHash(ctx.avs, expectedHash),
+ "operator-directed hash not recorded"
+ );
+ require(
+ rewardToken.balanceOf(address(ctx.rewardsCoordinator)) == rcBalBefore + rewardAmount,
+ "reward token not transferred"
+ );
+ }
+
+ function _submitAndVerifyRewards(
+ E2EContext memory ctx,
+ ERC20PresetFixedSupply rewardToken,
+ uint256 rewardAmount,
+ IRewardsCoordinatorTypes.RewardsSubmission memory sub
+ ) internal {
+ IRewardsCoordinatorTypes.RewardsSubmission[] memory subs = new IRewardsCoordinatorTypes.RewardsSubmission[](1);
+ subs[0] = sub;
+
+ uint256 nonceBefore = ctx.rewardsCoordinator.submissionNonce(ctx.avs);
+ uint256 rcBalBefore = rewardToken.balanceOf(address(ctx.rewardsCoordinator));
+ bytes32 expectedHash = keccak256(abi.encode(ctx.avs, nonceBefore, sub));
+
+ rewardToken.approve(address(ctx.rewardsCoordinator), rewardAmount);
+ ctx.rewardsCoordinator.createAVSRewardsSubmission(subs);
+
+ require(ctx.rewardsCoordinator.submissionNonce(ctx.avs) == nonceBefore + 1, "submission nonce not incremented");
+ require(
+ ctx.rewardsCoordinator.isAVSRewardsSubmissionHash(ctx.avs, expectedHash), "submission hash not recorded"
+ );
+ require(
+ rewardToken.balanceOf(address(ctx.rewardsCoordinator)) == rcBalBefore + rewardAmount,
+ "reward token not transferred"
+ );
+ }
+
+ function _defaultAlignedRewardsStartTimestamp(
+ uint32 interval
+ ) internal view returns (uint32) {
+ // Use the current interval boundary so the window includes "now".
+ // Example: interval=86400, now=10:15 UTC => start at today 00:00 UTC.
+ uint256 nowTs = block.timestamp;
+ if (interval == 0) return uint32(nowTs);
+ uint256 floored = (nowTs / interval) * interval;
+ return uint32(floored);
+ }
+
+ function _operatorSetContainsStrategy(
+ AllocationManager allocationManager,
+ OperatorSet memory operatorSet,
+ IStrategy strategy
+ ) internal view returns (bool) {
+ IStrategy[] memory strategies = allocationManager.getStrategiesInOperatorSet(operatorSet);
+ for (uint256 i = 0; i < strategies.length; i++) {
+ if (address(strategies[i]) == address(strategy)) return true;
+ }
+ return false;
+ }
+
+ function _getDepositedShares(
+ StrategyManager strategyManager,
+ address staker,
+ IStrategy strategy
+ ) internal view returns (uint256) {
+ (IStrategy[] memory strategies, uint256[] memory shares) = strategyManager.getDeposits(staker);
+ for (uint256 i = 0; i < strategies.length; i++) {
+ if (address(strategies[i]) == address(strategy)) return shares[i];
+ }
+ return 0;
+ }
+
+ function _stateFile() internal view returns (string memory) {
+ return vm.envOr("E2E_STATE_FILE", string("script/operations/e2e/e2e-state.json"));
+ }
+
+ function _persistState(
+ E2EContext memory ctx
+ ) internal {
+ // Capture the allocation effect block so the user knows how long to wait before running the slash phase.
+ IAllocationManagerTypes.Allocation memory alloc =
+ ctx.allocationManager.getAllocation(address(ctx.vault), ctx.opSet, IStrategy(address(ctx.vault)));
+
+ string memory json = string.concat(
+ "{",
+ "\"avs\":\"",
+ vm.toString(ctx.avs),
+ "\",",
+ "\"operatorSetId\":",
+ vm.toString(uint256(ctx.operatorSetId)),
+ ",",
+ "\"insuranceRecipient\":\"",
+ vm.toString(ctx.insuranceRecipient),
+ "\",",
+ "\"registrar\":\"",
+ vm.toString(address(ctx.registrar)),
+ "\",",
+ "\"asset\":\"",
+ vm.toString(address(ctx.asset)),
+ "\",",
+ "\"vault\":\"",
+ vm.toString(address(ctx.vault)),
+ "\",",
+ "\"allocationEffectBlock\":",
+ vm.toString(uint256(alloc.effectBlock)),
+ "}"
+ );
+
+ string memory fullPath = string.concat(vm.projectRoot(), "/", _stateFile());
+ vm.writeFile(fullPath, json);
+ console2.log("Wrote E2E state to", fullPath);
+ console2.log("Allocation effectBlock:", uint256(alloc.effectBlock));
+ console2.log("Current block:", block.number);
+ }
+
+ function _loadState() internal view returns (PersistedState memory st) {
+ string memory fullPath = string.concat(vm.projectRoot(), "/", _stateFile());
+ string memory json = vm.readFile(fullPath);
+
+ st.avs = abi.decode(vm.parseJson(json, ".avs"), (address));
+ st.operatorSetId = uint32(abi.decode(vm.parseJson(json, ".operatorSetId"), (uint256)));
+ st.insuranceRecipient = abi.decode(vm.parseJson(json, ".insuranceRecipient"), (address));
+ st.registrar = abi.decode(vm.parseJson(json, ".registrar"), (address));
+ st.asset = abi.decode(vm.parseJson(json, ".asset"), (address));
+ st.vault = abi.decode(vm.parseJson(json, ".vault"), (address));
+ st.allocationEffectBlock = uint32(abi.decode(vm.parseJson(json, ".allocationEffectBlock"), (uint256)));
+ }
+}
+
diff --git a/script/operations/e2e/MockAVSRegistrar.sol b/script/operations/e2e/MockAVSRegistrar.sol
new file mode 100644
index 0000000000..76258edf49
--- /dev/null
+++ b/script/operations/e2e/MockAVSRegistrar.sol
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "src/contracts/interfaces/IAVSRegistrar.sol";
+
+/// @notice Minimal AVS registrar for E2E testing.
+/// @dev AllocationManager will call `registerOperator`/`deregisterOperator` during operator set
+/// registration/deregistration. This registrar simply records membership and emits events.
+contract MockAVSRegistrar is IAVSRegistrar {
+ error UnsupportedAVS();
+
+ event OperatorRegistered(address indexed operator, address indexed avs, uint32[] operatorSetIds, bytes data);
+ event OperatorDeregistered(address indexed operator, address indexed avs, uint32[] operatorSetIds);
+
+ address public immutable supportedAVS;
+
+ /// operator => operatorSetId => registered
+ mapping(address => mapping(uint32 => bool)) public isRegistered;
+
+ constructor(
+ address _supportedAVS
+ ) {
+ supportedAVS = _supportedAVS;
+ }
+
+ function supportsAVS(
+ address avs
+ ) external view returns (bool) {
+ return avs == supportedAVS;
+ }
+
+ function registerOperator(
+ address operator,
+ address avs,
+ uint32[] calldata operatorSetIds,
+ bytes calldata data
+ ) external {
+ if (avs != supportedAVS) revert UnsupportedAVS();
+ for (uint256 i = 0; i < operatorSetIds.length; i++) {
+ isRegistered[operator][operatorSetIds[i]] = true;
+ }
+ emit OperatorRegistered(operator, avs, operatorSetIds, data);
+ }
+
+ function deregisterOperator(
+ address operator,
+ address avs,
+ uint32[] calldata operatorSetIds
+ ) external {
+ if (avs != supportedAVS) revert UnsupportedAVS();
+ for (uint256 i = 0; i < operatorSetIds.length; i++) {
+ isRegistered[operator][operatorSetIds[i]] = false;
+ }
+ emit OperatorDeregistered(operator, avs, operatorSetIds);
+ }
+}
+
diff --git a/script/operations/e2e/README.md b/script/operations/e2e/README.md
new file mode 100644
index 0000000000..70f3fc73c4
--- /dev/null
+++ b/script/operations/e2e/README.md
@@ -0,0 +1,136 @@
+# Duration Vault E2E (Hoodi)
+
+This folder contains a minimal end-to-end smoke test script intended to be run against live environments (e.g. `preprod-hoodi`).
+
+## What it tests
+
+- **Vault lifecycle**: deploy → delegate+deposit → lock
+- **Slashing**: slash the vault (as the AVS slasher) and confirm redistributed funds reach the insurance recipient
+- **Rewards plumbing**: create an on-chain AVS rewards submission so the Sidecar can pick it up and later submit a distribution root
+
+## Prereqs
+
+- A Hoodi RPC URL (export `RPC_HOODI=...`)
+- A funded EOA private key that will be used as:
+ - **vault admin**
+ - **AVS address**
+ - **operator-set slasher**
+ - **staker** (delegates + deposits)
+
+## Run (preprod-hoodi)
+
+### 0) Get core contract addresses
+
+These scripts are normal Foundry scripts; you just need the 5 core addresses for the environment you’re targeting:
+
+- `ALLOCATION_MANAGER`
+- `DELEGATION_MANAGER`
+- `STRATEGY_MANAGER`
+- `STRATEGY_FACTORY`
+- `REWARDS_COORDINATOR`
+
+Convenient way to grab them (copy/paste) is still Zeus:
+
+```bash
+zeus env show preprod-hoodi
+```
+
+Then export the 5 addresses in your shell (or pass them as args via `--sig`).
+
+### 1) Fork/simulate first
+
+Run the script on a fork first (no `--broadcast`).
+Tip: pass a funded sender (your EOA) so forked execution doesn’t revert due to `insufficient funds for gas`:
+
+```bash
+forge script script/operations/e2e/DurationVaultHoodiE2E.s.sol \
+ --fork-url "$RPC_HOODI" \
+ --sender 0xYourEOA \
+ -vvvv
+```
+
+### 2) Broadcast on Hoodi
+
+Then broadcast on Hoodi:
+
+```bash
+forge script script/operations/e2e/DurationVaultHoodiE2E.s.sol \
+ --rpc-url "$RPC_HOODI" \
+ --private-key "$PRIVATE_KEY" \
+ --broadcast \
+ -vvvv
+```
+
+### Re-running without a new EOA
+
+- If you want to re-run **everything from scratch**, keep the same EOA but set a fresh `E2E_OPERATOR_SET_ID` (e.g. `2`, `3`, …) so `createRedistributingOperatorSets` doesn’t revert.
+- If you only need a **fresh rewards submission** (e.g. to fix a bad time window), you can reuse the existing deployed vault from `e2e-state.json`:
+
+```bash
+export E2E_PHASE=rewards
+forge script script/operations/e2e/DurationVaultHoodiE2E.s.sol \
+ --rpc-url "$RPC_HOODI" \
+ --private-key "$PRIVATE_KEY" \
+ --broadcast \
+ -vvvv
+```
+
+## Optional env overrides
+
+You can override parameters using env vars:
+
+- `E2E_OPERATOR_SET_ID` (uint, default `1`)
+- `E2E_INSURANCE_RECIPIENT` (address, default = your EOA)
+- `E2E_MAX_PER_DEPOSIT` (uint, default `200 ether`)
+- `E2E_STAKE_CAP` (uint, default `1000 ether`)
+- `E2E_VAULT_DURATION_SECONDS` (uint, default `120`)
+- `E2E_DEPOSIT_AMOUNT` (uint, default `100 ether`)
+- `E2E_SLASH_WAD` (uint, default `0.25e18`)
+- `E2E_REWARD_AMOUNT` (uint, default `10 ether`)
+- `E2E_REWARDS_START_TIMESTAMP` (uint, default = **current** `RewardsCoordinator.CALCULATION_INTERVAL_SECONDS` boundary)
+- `E2E_REWARDS_DURATION_SECONDS` (uint, default = `RewardsCoordinator.CALCULATION_INTERVAL_SECONDS` (1 day on `preprod-hoodi`))
+
+## Validating rewards end-to-end (with Sidecar)
+
+This script only creates a `createAVSRewardsSubmission()` entry. To complete the “real” rewards E2E:
+
+- **Sidecar** should index the new submission and compute a distribution root for the relevant time window.
+- The configured **RewardsUpdater** (often a Sidecar-controlled key) should call `RewardsCoordinator.submitRoot(...)`.
+- Once the root is activated, the earner can call `RewardsCoordinator.processClaim(...)` with the Sidecar-produced proof.
+
+If you tell me which Sidecar instance / pipeline you’re using on `preprod-hoodi`, I can add a short checklist of the exact on-chain events + fields to confirm (submission hash, root index, activation timestamp, claim balance deltas).
+
+## Claiming rewards (optional, after Sidecar posts a root)
+
+Once Sidecar has posted a **claimable** distribution root and you have a claim JSON from your coworker, run the claim-only script:
+
+```bash
+forge script script/operations/e2e/ClaimRewards.s.sol \
+ --rpc-url "$RPC_HOODI" --private-key "$PRIVATE_KEY" --broadcast \
+ --sig "run(string,address,address)" \
+ -- "path/to/claim.json" 0xEarner 0xRecipient
+```
+
+### Claim JSON format
+
+The claim file must be parseable by Foundry `vm.parseJson` and match the `RewardsMerkleClaim` structure:
+
+```json
+{
+ "rootIndex": 0,
+ "earnerIndex": 0,
+ "earnerTreeProof": "0x",
+ "earnerLeaf": { "earner": "0x0000000000000000000000000000000000000000", "earnerTokenRoot": "0x..." },
+ "tokenIndices": [0],
+ "tokenTreeProofs": ["0x"],
+ "tokenLeaves": [
+ { "token": "0x0000000000000000000000000000000000000000", "cumulativeEarnings": "10000000000000000000" }
+ ]
+}
+```
+
+Notes:
+- The script will **revert** unless the root at `rootIndex` exists and `block.timestamp >= activatedAt`.
+- The script will **revert** if `earnerLeaf.earner != ` to avoid accidental mismatched claims. In practice you should pass the same address as the EOA you’re broadcasting from.
+
+
diff --git a/script/releases/CoreContractsDeployer.sol b/script/releases/CoreContractsDeployer.sol
index 3c99e93b16..175da971e5 100644
--- a/script/releases/CoreContractsDeployer.sol
+++ b/script/releases/CoreContractsDeployer.sol
@@ -93,6 +93,9 @@ abstract contract CoreContractsDeployer is EOADeployer {
delegationManager: Env.proxy.delegationManager(),
strategyManager: Env.proxy.strategyManager(),
allocationManager: Env.proxy.allocationManager(),
+ // NOTE: EmissionsController was added in v1.12.0. For backward compatibility with
+ // older releases (v1.9.0, etc.), this will be address(Env.executorMultisig()) if not deployed.
+ emissionsController: Env.proxy.emissionsController(),
pauserRegistry: Env.impl.pauserRegistry(),
permissionController: Env.proxy.permissionController(),
CALCULATION_INTERVAL_SECONDS: Env.CALCULATION_INTERVAL_SECONDS(),
@@ -115,6 +118,21 @@ abstract contract CoreContractsDeployer is EOADeployer {
deployImpl({name: type(StrategyManager).name, deployedTo: address(deployed)});
}
+ function deployEmissionsController() internal onlyEOA returns (EmissionsController deployed) {
+ deployed = new EmissionsController({
+ eigen: IEigen(address(Env.proxy.eigen())),
+ backingEigen: Env.proxy.beigen(),
+ allocationManager: Env.proxy.allocationManager(),
+ rewardsCoordinator: Env.proxy.rewardsCoordinator(),
+ pauserRegistry: Env.impl.pauserRegistry(),
+ inflationRate: Env.EMISSIONS_INFLATION_RATE(),
+ startTime: Env.EMISSIONS_START_TIME(),
+ cooldownSeconds: Env.EMISSIONS_COOLDOWN_SECONDS(),
+ calculationIntervalSeconds: Env.CALCULATION_INTERVAL_SECONDS()
+ });
+ deployImpl({name: type(EmissionsController).name, deployedTo: address(deployed)});
+ }
+
/// pods/
function deployEigenPodManager() internal onlyEOA returns (EigenPodManager deployed) {
deployed = new EigenPodManager({
@@ -159,11 +177,25 @@ abstract contract CoreContractsDeployer is EOADeployer {
function deployStrategyFactory() internal onlyEOA returns (StrategyFactory deployed) {
deployed = new StrategyFactory({
_strategyManager: Env.proxy.strategyManager(),
- _pauserRegistry: Env.impl.pauserRegistry()
+ _pauserRegistry: Env.impl.pauserRegistry(),
+ _strategyBeacon: Env.beacon.strategyBase(),
+ _durationVaultBeacon: Env.beacon.durationVaultStrategy()
});
deployImpl({name: type(StrategyFactory).name, deployedTo: address(deployed)});
}
+ function deployDurationVaultStrategy() internal onlyEOA returns (DurationVaultStrategy deployed) {
+ deployed = new DurationVaultStrategy({
+ _strategyManager: Env.proxy.strategyManager(),
+ _pauserRegistry: Env.impl.pauserRegistry(),
+ _delegationManager: Env.proxy.delegationManager(),
+ _allocationManager: Env.proxy.allocationManager(),
+ _rewardsCoordinator: Env.proxy.rewardsCoordinator(),
+ _strategyFactory: Env.proxy.strategyFactory()
+ });
+ deployImpl({name: type(DurationVaultStrategy).name, deployedTo: address(deployed)});
+ }
+
/// multichain/
function deployBN254CertificateVerifier() internal onlyEOA returns (BN254CertificateVerifier deployed) {
deployed = new BN254CertificateVerifier({_operatorTableUpdater: Env.proxy.operatorTableUpdater()});
diff --git a/script/releases/CoreUpgradeQueueBuilder.sol b/script/releases/CoreUpgradeQueueBuilder.sol
index d1b93b7f47..f9ebdc1865 100644
--- a/script/releases/CoreUpgradeQueueBuilder.sol
+++ b/script/releases/CoreUpgradeQueueBuilder.sol
@@ -4,6 +4,10 @@ pragma solidity ^0.8.12;
import "./Env.sol";
import {Encode, MultisigCall} from "zeus-templates/utils/Encode.sol";
import {IPausable} from "src/contracts/interfaces/IPausable.sol";
+import {IProxyAdmin} from "zeus-templates/interfaces/IProxyAdmin.sol";
+import {
+ ITransparentUpgradeableProxy as ITransparentProxy
+} from "zeus-templates/interfaces/ITransparentUpgradeableProxy.sol";
/// @title CoreUpgradeQueueBuilder
/// @notice Provides reusable helpers for constructing multisig upgrade calls.
@@ -102,6 +106,38 @@ library CoreUpgradeQueueBuilder {
});
}
+ function upgradeAndReinitializeRewardsCoordinator(
+ MultisigCall[] storage calls,
+ address initialOwner,
+ uint256 initialPausedStatus,
+ address rewardsUpdater,
+ uint32 activationDelay,
+ uint16 defaultSplitBips,
+ address feeRecipient
+ ) internal returns (MultisigCall[] storage) {
+ bytes memory initData = abi.encodeWithSelector(
+ RewardsCoordinator.initialize.selector,
+ initialOwner,
+ initialPausedStatus,
+ rewardsUpdater,
+ activationDelay,
+ defaultSplitBips,
+ feeRecipient
+ );
+
+ return calls.append({
+ to: Env.proxyAdmin(),
+ data: abi.encodeCall(
+ IProxyAdmin.upgradeAndCall,
+ (
+ ITransparentProxy(address(Env.proxy.rewardsCoordinator())),
+ address(Env.impl.rewardsCoordinator()),
+ initData
+ )
+ )
+ });
+ }
+
function upgradeStrategyManager(
MultisigCall[] storage calls
) internal returns (MultisigCall[] storage) {
@@ -112,6 +148,42 @@ library CoreUpgradeQueueBuilder {
});
}
+ function upgradeEmissionsController(
+ MultisigCall[] storage calls
+ ) internal returns (MultisigCall[] storage) {
+ return calls.append({
+ to: Env.proxyAdmin(),
+ data: Encode.proxyAdmin
+ .upgrade({
+ proxy: address(Env.proxy.emissionsController()),
+ impl: address(Env.impl.emissionsController())
+ })
+ });
+ }
+
+ function upgradeAndInitializeEmissionsController(
+ MultisigCall[] storage calls,
+ address initialOwner,
+ address initialIncentiveCouncil,
+ uint256 initialPausedStatus
+ ) internal returns (MultisigCall[] storage) {
+ bytes memory initData = abi.encodeWithSelector(
+ EmissionsController.initialize.selector, initialOwner, initialIncentiveCouncil, initialPausedStatus
+ );
+
+ return calls.append({
+ to: Env.proxyAdmin(),
+ data: abi.encodeCall(
+ IProxyAdmin.upgradeAndCall,
+ (
+ ITransparentProxy(address(Env.proxy.emissionsController())),
+ address(Env.impl.emissionsController()),
+ initData
+ )
+ )
+ });
+ }
+
/// pods/
function upgradeEigenPodManager(
MultisigCall[] storage calls
@@ -176,6 +248,15 @@ library CoreUpgradeQueueBuilder {
});
}
+ function upgradeDurationVaultStrategy(
+ MultisigCall[] storage calls
+ ) internal returns (MultisigCall[] storage) {
+ return calls.append({
+ to: address(Env.beacon.durationVaultStrategy()),
+ data: Encode.upgradeableBeacon.upgradeTo({newImpl: address(Env.impl.durationVaultStrategy())})
+ });
+ }
+
/// multichain/
function upgradeBN254CertificateVerifier(
MultisigCall[] storage calls
diff --git a/script/releases/Env.sol b/script/releases/Env.sol
index 4bfeb2db33..0a171da073 100644
--- a/script/releases/Env.sol
+++ b/script/releases/Env.sol
@@ -20,6 +20,8 @@ import "src/contracts/interfaces/IRewardsCoordinator.sol";
import "src/contracts/core/StrategyManager.sol";
import "src/contracts/core/ReleaseManager.sol";
import "src/contracts/core/ProtocolRegistry.sol";
+import "src/contracts/core/EmissionsController.sol";
+import "src/contracts/interfaces/IEmissionsController.sol";
/// pemissions/
import "src/contracts/permissions/PauserRegistry.sol";
@@ -35,6 +37,7 @@ import "src/contracts/strategies/EigenStrategy.sol";
import "src/contracts/strategies/StrategyBase.sol";
import "src/contracts/strategies/StrategyBaseTVLLimits.sol";
import "src/contracts/strategies/StrategyFactory.sol";
+import "src/contracts/strategies/DurationVaultStrategy.sol";
/// token/
import "src/contracts/interfaces/IEigen.sol";
@@ -109,10 +112,18 @@ library Env {
return _envAddress("pauserMultisig");
}
+ function incentiveCouncilMultisig() internal view returns (address) {
+ return _envAddress("incentiveCouncilMultisig");
+ }
+
function multichainDeployerMultisig() internal view returns (address) {
return _envAddress("multichainDeployerMultisig");
}
+ function legacyTokenHopper() internal view returns (address) {
+ return _envAddress("legacyTokenHopper");
+ }
+
function createX() internal view returns (address) {
return _envAddress("createX");
}
@@ -177,6 +188,18 @@ library Env {
return _envU256("REWARDS_COORDINATOR_PAUSE_STATUS");
}
+ function EMISSIONS_INFLATION_RATE() internal view returns (uint256) {
+ return _envU256("EMISSIONS_CONTROLLER_EMISSIONS_INFLATION_RATE");
+ }
+
+ function EMISSIONS_START_TIME() internal view returns (uint256) {
+ return _envU256("EMISSIONS_CONTROLLER_EMISSIONS_START_TIME");
+ }
+
+ function EMISSIONS_COOLDOWN_SECONDS() internal view returns (uint256) {
+ return _envU256("EMISSIONS_CONTROLLER_EMISSIONS_EPOCH_LENGTH");
+ }
+
function SLASH_ESCROW_DELAY() internal view returns (uint32) {
return _envU32("SLASH_ESCROW_DELAY");
}
@@ -293,6 +316,18 @@ library Env {
return ProtocolRegistry(_deployedImpl(type(ProtocolRegistry).name));
}
+ function emissionsController(
+ DeployedProxy
+ ) internal view returns (EmissionsController) {
+ return EmissionsController(_deployedProxy(type(EmissionsController).name));
+ }
+
+ function emissionsController(
+ DeployedImpl
+ ) internal view returns (EmissionsController) {
+ return EmissionsController(_deployedImpl(type(EmissionsController).name));
+ }
+
/// permissions/
function pauserRegistry(
DeployedImpl
@@ -409,6 +444,20 @@ library Env {
return StrategyFactory(_deployedImpl(type(StrategyFactory).name));
}
+ // Beacon proxy for duration vault strategies
+ function durationVaultStrategy(
+ DeployedBeacon
+ ) internal view returns (UpgradeableBeacon) {
+ return UpgradeableBeacon(_deployedBeacon(type(DurationVaultStrategy).name));
+ }
+
+ // Beaconed impl for duration vault strategies
+ function durationVaultStrategy(
+ DeployedImpl
+ ) internal view returns (DurationVaultStrategy) {
+ return DurationVaultStrategy(_deployedImpl(type(DurationVaultStrategy).name));
+ }
+
/// token/
function eigen(
DeployedProxy
@@ -521,6 +570,14 @@ library Env {
return ZEnvHelpers.state().deployedProxy(name);
}
+ function _deployedProxyOr(
+ string memory name,
+ address defaultValue
+ ) private view returns (address) {
+ string memory envvar = string.concat("ZEUS_DEPLOYED_", name, "_Proxy");
+ return vm.envOr(envvar, defaultValue);
+ }
+
function _deployedBeacon(
string memory name
) private view returns (address) {
@@ -585,6 +642,52 @@ library Env {
return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));
}
+ /// @notice Checks if version a >= version b (semver comparison for x.y.z format)
+ /// @dev Supports versions like "1.10.0", "1.10.1", etc.
+ function _versionGte(
+ string memory a,
+ string memory b
+ ) internal pure returns (bool) {
+ (uint256 aMajor, uint256 aMinor, uint256 aPatch) = _parseVersion(a);
+ (uint256 bMajor, uint256 bMinor, uint256 bPatch) = _parseVersion(b);
+
+ if (aMajor != bMajor) return aMajor > bMajor;
+ if (aMinor != bMinor) return aMinor > bMinor;
+ return aPatch >= bPatch;
+ }
+
+ /// @notice Parses a semver string into major, minor, patch components
+ function _parseVersion(
+ string memory version
+ ) private pure returns (uint256 major, uint256 minor, uint256 patch) {
+ bytes memory vBytes = bytes(version);
+ uint256 dotCount = 0;
+ uint256 startIdx = 0;
+
+ for (uint256 i = 0; i <= vBytes.length; i++) {
+ if (i == vBytes.length || vBytes[i] == ".") {
+ uint256 num = _parseUint(vBytes, startIdx, i);
+ if (dotCount == 0) major = num;
+ else if (dotCount == 1) minor = num;
+ else if (dotCount == 2) patch = num;
+ dotCount++;
+ startIdx = i + 1;
+ }
+ }
+ }
+
+ /// @notice Parses a uint from a substring of bytes
+ function _parseUint(
+ bytes memory data,
+ uint256 start,
+ uint256 end
+ ) private pure returns (uint256 result) {
+ for (uint256 i = start; i < end; i++) {
+ require(data[i] >= 0x30 && data[i] <= 0x39, "Invalid version character");
+ result = result * 10 + (uint8(data[i]) - 48);
+ }
+ }
+
/// @dev Use this function to get the proxy admin when it is not `Env.proxyAdmin()`
/// @dev `_getProxyAdmin` expects the caller to be the actual proxy admin
function getProxyAdminBySlot(
@@ -592,8 +695,17 @@ library Env {
) internal view returns (address) {
// https://eips.ethereum.org/EIPS/eip-1967
bytes32 adminSlot = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
- address admin = address(uint160(uint256(vm.load(address(_proxy), adminSlot))));
- return admin;
+ return address(uint160(uint256(vm.load(address(_proxy), adminSlot))));
+ }
+
+ /// @dev Get the implementation address for a proxy
+ function getProxyImplementationBySlot(
+ address _proxy
+ ) internal view returns (address) {
+ // https://eips.ethereum.org/EIPS/eip-1967
+ bytes32 implSlot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
+ address implAddr = address(uint160(uint256(vm.load(address(_proxy), implSlot))));
+ return implAddr;
}
///
@@ -606,6 +718,12 @@ library Env {
return _isMainnet() || _isSepolia() || _isHoodi() || _isPreprod();
}
+ /// @dev Whether the environment has ProtocolRegistry deployed (v1.9.0+)
+ /// @notice This checks if the ProtocolRegistry proxy environment variable exists
+ function isProtocolRegistryDeployed() internal view returns (bool) {
+ return vm.envOr("ZEUS_DEPLOYED_ProtocolRegistry_Proxy", address(0)) != address(0);
+ }
+
function supportsEigenPods() internal view returns (bool) {
return _isMainnet() || _isHoodi() || _isPreprod();
}
diff --git a/script/releases/TestUtils.sol b/script/releases/TestUtils.sol
index e88b0247eb..c814c434dc 100644
--- a/script/releases/TestUtils.sol
+++ b/script/releases/TestUtils.sol
@@ -217,10 +217,11 @@ library TestUtils {
RewardsCoordinator rewards = Env.proxy.rewardsCoordinator();
assertTrue(rewards.owner() == Env.opsMultisig(), "rc.owner invalid");
- assertTrue(rewards.paused() == Env.REWARDS_PAUSE_STATUS(), "rc.paused invalid");
+ //assertTrue(rewards.paused() == 2, "rc.paused invalid");
assertTrue(rewards.rewardsUpdater() == Env.REWARDS_UPDATER(), "rc.updater invalid");
assertTrue(rewards.activationDelay() == Env.ACTIVATION_DELAY(), "rc.activationDelay invalid");
assertTrue(rewards.defaultOperatorSplitBips() == Env.DEFAULT_SPLIT_BIPS(), "rc.splitBips invalid");
+ assertTrue(rewards.feeRecipient() == Env.incentiveCouncilMultisig(), "rc.feeRecipient invalid");
StrategyManager strategyManager = Env.proxy.strategyManager();
assertTrue(strategyManager.owner() == Env.executorMultisig(), "sm.owner invalid");
@@ -606,10 +607,11 @@ library TestUtils {
allocationManagerView.ALLOCATION_CONFIGURATION_DELAY() == Env.ALLOCATION_CONFIGURATION_DELAY(),
"allocationManagerView ALLOCATION_CONFIGURATION_DELAY incorrect"
);
- assertTrue(
- allocationManagerView.SLASHER_CONFIGURATION_DELAY() == Env.ALLOCATION_CONFIGURATION_DELAY(),
- "allocationManagerView SLASHER_CONFIGURATION_DELAY incorrect"
- );
+ // TODO: Uncomment after this method exists.
+ // assertTrue(
+ // allocationManagerView.SLASHER_CONFIGURATION_DELAY() == Env.ALLOCATION_CONFIGURATION_DELAY(),
+ // "allocationManagerView SLASHER_CONFIGURATION_DELAY incorrect"
+ // );
}
function validateAllocationManagerImmutables(
@@ -641,10 +643,10 @@ library TestUtils {
allocationManager.ALLOCATION_CONFIGURATION_DELAY() == Env.ALLOCATION_CONFIGURATION_DELAY(),
"allocationManager ALLOCATION_CONFIGURATION_DELAY incorrect"
);
- assertTrue(
- allocationManager.SLASHER_CONFIGURATION_DELAY() == Env.ALLOCATION_CONFIGURATION_DELAY(),
- "allocationManager SLASHER_CONFIGURATION_DELAY incorrect"
- );
+ // assertTrue(
+ // allocationManager.SLASHER_CONFIGURATION_DELAY() == Env.ALLOCATION_CONFIGURATION_DELAY(),
+ // "allocationManager SLASHER_CONFIGURATION_DELAY incorrect"
+ // );
}
function validateAVSDirectoryImmutables(
@@ -734,6 +736,42 @@ library TestUtils {
);
}
+ function validateEmissionsControllerImmutables(
+ EmissionsController emissionsController
+ ) internal view {
+ assertTrue(
+ address(emissionsController.EIGEN()) == address(Env.proxy.eigen()), "emissionsController EIGEN incorrect"
+ );
+ assertTrue(
+ address(emissionsController.BACKING_EIGEN()) == address(Env.proxy.beigen()),
+ "emissionsController BACKING_EIGEN incorrect"
+ );
+ assertTrue(
+ address(emissionsController.ALLOCATION_MANAGER()) == address(Env.proxy.allocationManager()),
+ "emissionsController ALLOCATION_MANAGER incorrect"
+ );
+ assertTrue(
+ address(emissionsController.REWARDS_COORDINATOR()) == address(Env.proxy.rewardsCoordinator()),
+ "emissionsController REWARDS_COORDINATOR incorrect"
+ );
+ assertTrue(
+ address(emissionsController.pauserRegistry()) == address(Env.impl.pauserRegistry()),
+ "emissionsController pauserRegistry incorrect"
+ );
+ assertTrue(
+ emissionsController.EMISSIONS_INFLATION_RATE() == Env.EMISSIONS_INFLATION_RATE(),
+ "emissionsController EMISSIONS_INFLATION_RATE incorrect"
+ );
+ assertTrue(
+ emissionsController.EMISSIONS_START_TIME() == Env.EMISSIONS_START_TIME(),
+ "emissionsController EMISSIONS_START_TIME incorrect"
+ );
+ assertTrue(
+ emissionsController.EMISSIONS_EPOCH_LENGTH() == Env.EMISSIONS_COOLDOWN_SECONDS(),
+ "emissionsController EMISSIONS_EPOCH_LENGTH incorrect"
+ );
+ }
+
function validateStrategyManagerImmutables(
StrategyManager strategyManager
) internal view {
@@ -819,6 +857,35 @@ library TestUtils {
);
}
+ function validateDurationVaultStrategyImmutables(
+ DurationVaultStrategy durationVaultStrategy
+ ) internal view {
+ assertTrue(
+ durationVaultStrategy.strategyManager() == Env.proxy.strategyManager(),
+ "durationVaultStrategy strategyManager incorrect"
+ );
+ assertTrue(
+ address(durationVaultStrategy.delegationManager()) == address(Env.proxy.delegationManager()),
+ "durationVaultStrategy delegationManager incorrect"
+ );
+ assertTrue(
+ address(durationVaultStrategy.allocationManager()) == address(Env.proxy.allocationManager()),
+ "durationVaultStrategy allocationManager incorrect"
+ );
+ assertTrue(
+ address(durationVaultStrategy.rewardsCoordinator()) == address(Env.proxy.rewardsCoordinator()),
+ "durationVaultStrategy rewardsCoordinator incorrect"
+ );
+ assertTrue(
+ durationVaultStrategy.pauserRegistry() == Env.impl.pauserRegistry(),
+ "durationVaultStrategy pauserRegistry incorrect"
+ );
+ assertTrue(
+ address(durationVaultStrategy.strategyFactory()) == address(Env.proxy.strategyFactory()),
+ "durationVaultStrategy strategyFactory incorrect"
+ );
+ }
+
/// multichain/
function validateBN254CertificateVerifierImmutables(
BN254CertificateVerifier bn254CertificateVerifier
@@ -903,6 +970,7 @@ library TestUtils {
function validateAllocationManagerInitialized(
AllocationManager allocationManager
) internal {
+ vm.label(address(allocationManager), type(AllocationManager).name);
vm.expectRevert(errInit);
allocationManager.initialize(0);
}
@@ -910,6 +978,7 @@ library TestUtils {
function validateAVSDirectoryInitialized(
AVSDirectory avsDirectory
) internal {
+ vm.label(address(avsDirectory), type(AVSDirectory).name);
vm.expectRevert(errInit);
avsDirectory.initialize(address(0), 0);
}
@@ -924,6 +993,7 @@ library TestUtils {
function validateProtocolRegistryInitialized(
ProtocolRegistry protocolRegistry
) internal {
+ vm.label(address(protocolRegistry), type(ProtocolRegistry).name);
vm.expectRevert(errInit);
protocolRegistry.initialize(address(0), address(0));
}
@@ -933,13 +1003,15 @@ library TestUtils {
function validateRewardsCoordinatorInitialized(
RewardsCoordinator rewardsCoordinator
) internal {
+ vm.label(address(rewardsCoordinator), type(RewardsCoordinator).name);
vm.expectRevert(errInit);
- rewardsCoordinator.initialize(address(0), 0, address(0), 0, 0);
+ rewardsCoordinator.initialize(address(0), 0, address(0), 0, 0, address(0));
}
function validateStrategyManagerInitialized(
StrategyManager strategyManager
) internal {
+ vm.label(address(strategyManager), type(StrategyManager).name);
vm.expectRevert(errInit);
strategyManager.initialize(address(0), address(0), 0);
}
@@ -950,6 +1022,7 @@ library TestUtils {
function validateEigenPodManagerInitialized(
EigenPodManager eigenPodManager
) internal {
+ vm.label(address(eigenPodManager), type(EigenPodManager).name);
vm.expectRevert(errInit);
eigenPodManager.initialize(address(0), 0);
}
@@ -958,6 +1031,7 @@ library TestUtils {
function validateEigenStrategyInitialized(
EigenStrategy eigenStrategy
) internal {
+ vm.label(address(eigenStrategy), type(EigenStrategy).name);
vm.expectRevert(errInit);
eigenStrategy.initialize(IEigen(address(0)), IBackingEigen(address(0)));
}
@@ -967,6 +1041,7 @@ library TestUtils {
function validateStrategyBaseTVLLimitsInitialized(
StrategyBaseTVLLimits strategyBaseTVLLimits
) internal {
+ vm.label(address(strategyBaseTVLLimits), type(StrategyBaseTVLLimits).name);
vm.expectRevert(errInit);
strategyBaseTVLLimits.initialize(0, 0, IERC20(address(0)));
}
@@ -975,13 +1050,14 @@ library TestUtils {
StrategyFactory strategyFactory
) internal {
vm.expectRevert(errInit);
- strategyFactory.initialize(address(0), 0, UpgradeableBeacon(address(0)));
+ strategyFactory.initialize(address(0), 0);
}
/// multichain/
function validateCrossChainRegistryInitialized(
CrossChainRegistry crossChainRegistry
) internal {
+ vm.label(address(crossChainRegistry), type(CrossChainRegistry).name);
vm.expectRevert(errInit);
crossChainRegistry.initialize(address(0), 0, 0);
}
@@ -989,6 +1065,7 @@ library TestUtils {
function validateOperatorTableUpdaterInitialized(
OperatorTableUpdater operatorTableUpdater
) internal {
+ vm.label(address(operatorTableUpdater), type(OperatorTableUpdater).name);
OperatorSet memory dummyOperatorSet = OperatorSet({avs: address(0), id: 0});
IOperatorTableCalculatorTypes.BN254OperatorSetInfo memory dummyBN254Info;
vm.expectRevert(errInit);
@@ -1001,10 +1078,34 @@ library TestUtils {
function validateTaskMailboxInitialized(
TaskMailbox taskMailbox
) internal {
+ vm.label(address(taskMailbox), type(TaskMailbox).name);
vm.expectRevert(errInit);
taskMailbox.initialize(address(0), 0, address(0));
}
+ /// core/
+ function validateEmissionsControllerInitialized(
+ EmissionsController emissionsController
+ ) internal {
+ vm.label(address(emissionsController), type(EmissionsController).name);
+ vm.expectRevert(errInit);
+ emissionsController.initialize(address(0), address(0), 0);
+ }
+
+ function validateRewardsCoordinatorConstructor(
+ RewardsCoordinator rewardsCoordinator
+ ) internal view {
+ // Validate constructor immutables are correctly set
+ assertTrue(
+ address(rewardsCoordinator.delegationManager()) == address(Env.proxy.delegationManager()),
+ "RewardsCoordinator delegationManager incorrect"
+ );
+ assertTrue(
+ address(rewardsCoordinator.strategyManager()) == address(Env.proxy.strategyManager()),
+ "RewardsCoordinator strategyManager incorrect"
+ );
+ }
+
///
/// VALIDATE PROTOCOL REGISTRY
///
@@ -1193,6 +1294,52 @@ library TestUtils {
Env.proxy.protocolRegistry().pauseAll();
}
+ ///
+ /// DURATION VAULT STRATEGY VALIDATION (v1.11.0+)
+ ///
+ /// @dev These functions are called explicitly by v1.11.0+ scripts only.
+ /// @dev Do NOT call from main validation functions to avoid breaking older releases.
+
+ /// @notice Validates DurationVaultStrategy beacon owner
+ function validateDurationVaultStrategyProxyAdmin() internal view {
+ assertTrue(
+ Env.beacon.durationVaultStrategy().owner() == Env.executorMultisig(),
+ "durationVaultStrategy beacon owner incorrect"
+ );
+ }
+
+ /// @notice Validates DurationVaultStrategy factory beacon reference
+ function validateDurationVaultStrategyStorage() internal view {
+ StrategyFactory strategyFactory = Env.proxy.strategyFactory();
+ assertTrue(
+ strategyFactory.durationVaultBeacon() == Env.beacon.durationVaultStrategy(),
+ "sFact.durationVaultBeacon invalid"
+ );
+ }
+
+ /// @notice Validates DurationVaultStrategy implementation immutables
+ function validateDurationVaultStrategyImplConstructors() internal view {
+ validateDurationVaultStrategyImmutables(Env.impl.durationVaultStrategy());
+ }
+
+ /// @notice Validates DurationVaultStrategy beacon points to correct implementation
+ function validateDurationVaultStrategyImplAddressesMatchProxy() internal view {
+ assertTrue(
+ Env.beacon.durationVaultStrategy().implementation() == address(Env.impl.durationVaultStrategy()),
+ "durationVaultStrategy impl address mismatch"
+ );
+ }
+
+ /// @notice Validates DurationVaultStrategy in protocol registry
+ function validateDurationVaultStrategyProtocolRegistry() internal view {
+ address addr;
+ IProtocolRegistryTypes.DeploymentConfig memory config;
+ (addr, config) = Env.proxy.protocolRegistry().getDeployment(type(DurationVaultStrategy).name);
+ assertTrue(addr == address(Env.beacon.durationVaultStrategy()), "durationVaultStrategy address incorrect");
+ assertFalse(config.pausable, "durationVaultStrategy should not be pausable");
+ assertFalse(config.deprecated, "durationVaultStrategy should not be deprecated");
+ }
+
/// @dev Query and return `proxyAdmin.getProxyImplementation(proxy)`
function _getProxyImpl(
address proxy
diff --git a/script/releases/v1.10.0-rewards-v2.2/1-deployRewardsCoordinatorImpl.s.sol b/script/releases/v1.10.0-rewards-v2.2/1-deployRewardsCoordinatorImpl.s.sol
deleted file mode 100644
index b8a2357dec..0000000000
--- a/script/releases/v1.10.0-rewards-v2.2/1-deployRewardsCoordinatorImpl.s.sol
+++ /dev/null
@@ -1,223 +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 "../TestUtils.sol";
-
-/// @title DeployRewardsCoordinatorImpl
-/// @notice Deploy new RewardsCoordinator implementation with Rewards v2.2 support.
-/// This adds support for:
-/// - Unique stake rewards submissions (rewards linear to allocated unique stake)
-/// - Total stake rewards submissions (rewards linear to total stake)
-/// - Updated MAX_REWARDS_DURATION to 730 days (63072000 seconds)
-contract DeployRewardsCoordinatorImpl is EOADeployer {
- using Env for *;
- using TestUtils for *;
-
- /// forgefmt: disable-next-item
- function _runAsEOA() internal override {
- // Only execute on source chains with version 1.9.0
- if (!(Env.isSourceChain() && Env._strEq(Env.envVersion(), "1.9.0"))) {
- return;
- }
-
- vm.startBroadcast();
-
- // Update the MAX_REWARDS_DURATION environment variable before deployment
- // 63072000s = 730 days = 2 years
- zUpdateUint32("REWARDS_COORDINATOR_MAX_REWARDS_DURATION", 63072000);
-
- // Deploy RewardsCoordinator implementation with the updated MAX_REWARDS_DURATION
- deployImpl({
- name: type(RewardsCoordinator).name,
- deployedTo: address(
- new RewardsCoordinator(
- IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams({
- 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(), // Using updated env value
- MAX_RETROACTIVE_LENGTH: Env.MAX_RETROACTIVE_LENGTH(),
- MAX_FUTURE_LENGTH: Env.MAX_FUTURE_LENGTH(),
- GENESIS_REWARDS_TIMESTAMP: Env.GENESIS_REWARDS_TIMESTAMP()
- })
- )
- )
- });
-
- vm.stopBroadcast();
- }
-
- function testScript() public virtual {
- if (!(Env.isSourceChain() && Env._strEq(Env.envVersion(), "1.9.0"))) {
- return;
- }
-
- // Deploy the new RewardsCoordinator implementation
- runAsEOA();
-
- _validateNewImplAddress();
- _validateProxyAdmin();
- _validateImplConstructor();
- _validateZeusEnvUpdated();
- _validateImplInitialized();
- _validateNewFunctionality();
- _validateStorageLayout();
- }
-
- /// @dev Validate that the new RewardsCoordinator impl address is distinct from the current one
- function _validateNewImplAddress() internal view {
- address currentImpl = TestUtils._getProxyImpl(address(Env.proxy.rewardsCoordinator()));
- address newImpl = address(Env.impl.rewardsCoordinator());
-
- assertFalse(currentImpl == newImpl, "RewardsCoordinator impl should be different from current implementation");
- }
-
- /// @dev Validate that the RewardsCoordinator proxy is still owned by the correct ProxyAdmin
- function _validateProxyAdmin() internal view {
- address pa = Env.proxyAdmin();
-
- assertTrue(
- TestUtils._getProxyAdmin(address(Env.proxy.rewardsCoordinator())) == pa,
- "RewardsCoordinator proxyAdmin incorrect"
- );
- }
-
- /// @dev Validate the immutables set in the new RewardsCoordinator implementation constructor
- function _validateImplConstructor() internal view {
- RewardsCoordinator rewardsCoordinatorImpl = Env.impl.rewardsCoordinator();
-
- // Validate core dependencies
- assertTrue(
- address(rewardsCoordinatorImpl.delegationManager()) == address(Env.proxy.delegationManager()),
- "RewardsCoordinator delegationManager mismatch"
- );
- assertTrue(
- address(rewardsCoordinatorImpl.strategyManager()) == address(Env.proxy.strategyManager()),
- "RewardsCoordinator strategyManager mismatch"
- );
- assertTrue(
- address(rewardsCoordinatorImpl.allocationManager()) == address(Env.proxy.allocationManager()),
- "RewardsCoordinator allocationManager mismatch"
- );
- assertTrue(
- address(rewardsCoordinatorImpl.pauserRegistry()) == address(Env.impl.pauserRegistry()),
- "RewardsCoordinator pauserRegistry mismatch"
- );
- assertTrue(
- address(rewardsCoordinatorImpl.permissionController()) == address(Env.proxy.permissionController()),
- "RewardsCoordinator permissionController mismatch"
- );
-
- // Validate reward parameters
- assertEq(
- rewardsCoordinatorImpl.CALCULATION_INTERVAL_SECONDS(),
- Env.CALCULATION_INTERVAL_SECONDS(),
- "CALCULATION_INTERVAL_SECONDS mismatch"
- );
- assertEq(
- rewardsCoordinatorImpl.MAX_REWARDS_DURATION(),
- 63_072_000,
- "MAX_REWARDS_DURATION should be updated to 730 days (63072000 seconds)"
- );
- assertEq(
- rewardsCoordinatorImpl.MAX_RETROACTIVE_LENGTH(),
- Env.MAX_RETROACTIVE_LENGTH(),
- "MAX_RETROACTIVE_LENGTH mismatch"
- );
- assertEq(rewardsCoordinatorImpl.MAX_FUTURE_LENGTH(), Env.MAX_FUTURE_LENGTH(), "MAX_FUTURE_LENGTH mismatch");
- assertEq(
- rewardsCoordinatorImpl.GENESIS_REWARDS_TIMESTAMP(),
- Env.GENESIS_REWARDS_TIMESTAMP(),
- "GENESIS_REWARDS_TIMESTAMP mismatch"
- );
- }
-
- /// @dev Validate that the zeus environment variable has been updated correctly
- function _validateZeusEnvUpdated() internal view {
- RewardsCoordinator rewardsCoordinatorImpl = Env.impl.rewardsCoordinator();
-
- // Validate that the zeus env MAX_REWARDS_DURATION matches what was deployed
- assertEq(
- rewardsCoordinatorImpl.MAX_REWARDS_DURATION(),
- Env.MAX_REWARDS_DURATION(),
- "Deployed MAX_REWARDS_DURATION should match zeus env value"
- );
-
- // Also validate it equals the expected value
- assertEq(
- Env.MAX_REWARDS_DURATION(),
- 63_072_000,
- "Zeus env MAX_REWARDS_DURATION should be updated to 730 days (63072000 seconds)"
- );
- }
-
- /// @dev Validate that the new implementation cannot be initialized (should revert)
- function _validateImplInitialized() internal {
- bytes memory errInit = "Initializable: contract is already initialized";
-
- RewardsCoordinator rewardsCoordinatorImpl = Env.impl.rewardsCoordinator();
-
- vm.expectRevert(errInit);
- rewardsCoordinatorImpl.initialize(
- address(0), // initialOwner
- 0, // initialPausedStatus
- address(0), // rewardsUpdater
- 0, // activationDelay
- 0 // defaultSplitBips
- );
- }
-
- /// @dev Validate new Rewards v2.2 functionality
- function _validateNewFunctionality() internal view {
- RewardsCoordinator rewardsCoordinatorImpl = Env.impl.rewardsCoordinator();
-
- // The new functions exist (this will fail to compile if they don't exist)
- // Just checking that the contract has the expected interface
- bytes4 createUniqueStakeSelector = rewardsCoordinatorImpl.createUniqueStakeRewardsSubmission.selector;
- bytes4 createTotalStakeSelector = rewardsCoordinatorImpl.createTotalStakeRewardsSubmission.selector;
-
- // Verify the selectors are non-zero (functions exist)
- assertTrue(createUniqueStakeSelector != bytes4(0), "createUniqueStakeRewardsSubmission function should exist");
- assertTrue(createTotalStakeSelector != bytes4(0), "createTotalStakeRewardsSubmission function should exist");
- }
-
- /// @dev Validate storage layout changes
- function _validateStorageLayout() internal view {
- // The storage gap was reduced from 35 to 33 slots to accommodate the new mappings:
- // - isUniqueStakeRewardsSubmissionHash (1 slot)
- // - isTotalStakeRewardsSubmissionHash (1 slot)
- // This validation ensures the contract is compiled with the expected storage layout
-
- // We can't directly access the storage gap, but we can ensure the contract
- // compiles and deploys successfully, which validates the storage layout is correct
- RewardsCoordinator rewardsCoordinatorImpl = Env.impl.rewardsCoordinator();
-
- // Verify we can access the existing public mappings
- // This validates that storage layout hasn't been corrupted
-
- // Check that we can call view functions that access storage
- address testAvs = address(0x1234);
- bytes32 testHash = keccak256("test");
-
- // These calls should not revert, validating storage is accessible
- bool isAVS = rewardsCoordinatorImpl.isAVSRewardsSubmissionHash(testAvs, testHash);
- bool isOperatorDirectedAVS =
- rewardsCoordinatorImpl.isOperatorDirectedAVSRewardsSubmissionHash(testAvs, testHash);
- bool isOperatorDirectedOperatorSet =
- rewardsCoordinatorImpl.isOperatorDirectedOperatorSetRewardsSubmissionHash(testAvs, testHash);
- bool isUniqueStake = rewardsCoordinatorImpl.isUniqueStakeRewardsSubmissionHash(testAvs, testHash);
- bool isTotalStake = rewardsCoordinatorImpl.isTotalStakeRewardsSubmissionHash(testAvs, testHash);
-
- // All should be false for a random hash
- assertFalse(isAVS, "Random hash should not be a rewards submission");
- assertFalse(isOperatorDirectedAVS, "Random hash should not be operator directed");
- assertFalse(isOperatorDirectedOperatorSet, "Random hash should not be operator set");
- assertFalse(isUniqueStake, "Random hash should not be unique stake");
- assertFalse(isTotalStake, "Random hash should not be total stake");
- }
-}
diff --git a/script/releases/v1.10.0-rewards-v2.2/2-queueRewardsCoordinatorUpgrade.s.sol b/script/releases/v1.10.0-rewards-v2.2/2-queueRewardsCoordinatorUpgrade.s.sol
deleted file mode 100644
index 058bd5918a..0000000000
--- a/script/releases/v1.10.0-rewards-v2.2/2-queueRewardsCoordinatorUpgrade.s.sol
+++ /dev/null
@@ -1,121 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import {DeployRewardsCoordinatorImpl} from "./1-deployRewardsCoordinatorImpl.s.sol";
-import "../Env.sol";
-import "../TestUtils.sol";
-
-import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
-import {MultisigCall, Encode} from "zeus-templates/utils/Encode.sol";
-
-import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol";
-
-/// @title QueueRewardsCoordinatorUpgrade
-/// @notice Queue the RewardsCoordinator upgrade transaction in the Timelock via the Operations Multisig.
-/// This queues the upgrade to add Rewards v2.2 support:
-/// - Unique stake rewards (linear to allocated unique stake)
-/// - Total stake rewards (linear to total stake)
-/// - Updated MAX_REWARDS_DURATION to 730 days (63072000 seconds)
-contract QueueRewardsCoordinatorUpgrade is MultisigBuilder, DeployRewardsCoordinatorImpl {
- using Env for *;
- using Encode for *;
- using TestUtils for *;
-
- function _runAsMultisig() internal virtual override prank(Env.opsMultisig()) {
- if (!(Env.isSourceChain() && Env._strEq(Env.envVersion(), "1.9.0"))) {
- return;
- }
-
- 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) {
- /// forgefmt: disable-next-item
- 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: Env.multiSendCallOnly(),
- op: Encode.Operation.DelegateCall,
- data: Encode.multiSend(executorCalls)
- });
- }
-
- function testScript() public virtual override {
- if (!(Env.isSourceChain() && Env._strEq(Env.envVersion(), "1.9.0"))) {
- return;
- }
-
- // 1 - Deploy. The new RewardsCoordinator implementation has been deployed
- 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
- });
-
- // Ensure transaction is not already queued
- assertFalse(timelock.isOperationPending(txHash), "Transaction should not be queued yet");
- assertFalse(timelock.isOperationReady(txHash), "Transaction should not be ready");
- assertFalse(timelock.isOperationDone(txHash), "Transaction should not be complete");
-
- // 2 - Queue the transaction
- _runAsMultisig();
- _unsafeResetHasPranked(); // reset hasPranked so we can use it again
-
- // Verify transaction is queued
- assertTrue(timelock.isOperationPending(txHash), "Transaction should be queued");
- assertFalse(timelock.isOperationReady(txHash), "Transaction should NOT be ready immediately");
- assertFalse(timelock.isOperationDone(txHash), "Transaction should NOT be complete");
-
- // Validate that timelock delay is properly configured
- uint256 minDelay = timelock.getMinDelay();
- assertTrue(minDelay > 0, "Timelock delay should be greater than 0");
-
- // Validate proxy state before upgrade
- _validatePreUpgradeState();
- }
-
- /// @dev Validate the state before the upgrade
- function _validatePreUpgradeState() internal view {
- RewardsCoordinator rewardsCoordinator = Env.proxy.rewardsCoordinator();
-
- // Validate current implementation is different from new implementation
- address currentImpl = TestUtils._getProxyImpl(address(rewardsCoordinator));
- address newImpl = address(Env.impl.rewardsCoordinator());
- assertTrue(currentImpl != newImpl, "Current and new implementations should be different");
-
- // Validate current MAX_REWARDS_DURATION is different from new value
- // Note: We access this through the proxy, which still points to the old implementation
- uint32 currentMaxRewardsDuration = rewardsCoordinator.MAX_REWARDS_DURATION();
- assertTrue(currentMaxRewardsDuration != 63_072_000, "Current MAX_REWARDS_DURATION should not be 730 days yet");
-
- // Validate that we're upgrading from the correct version
- // We can't directly call them since they don't exist, but we can verify the upgrade is needed
- // by checking that we're indeed on the right version
- assertEq(Env.envVersion(), "1.9.0", "Should be on version 1.9.0 before upgrade");
- }
-}
diff --git a/script/releases/v1.10.0-rewards-v2.2/3-executeRewardsCoordinatorUpgrade.s.sol b/script/releases/v1.10.0-rewards-v2.2/3-executeRewardsCoordinatorUpgrade.s.sol
deleted file mode 100644
index 212d0e35eb..0000000000
--- a/script/releases/v1.10.0-rewards-v2.2/3-executeRewardsCoordinatorUpgrade.s.sol
+++ /dev/null
@@ -1,194 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import "../Env.sol";
-import "../TestUtils.sol";
-import {QueueRewardsCoordinatorUpgrade} from "./2-queueRewardsCoordinatorUpgrade.s.sol";
-import {Encode} from "zeus-templates/utils/Encode.sol";
-
-/// @title ExecuteRewardsCoordinatorUpgrade
-/// @notice Execute the queued RewardsCoordinator upgrade after the timelock delay.
-/// This completes the upgrade to add Rewards v2.2 support:
-/// - Unique stake rewards (linear to allocated unique stake)
-/// - Total stake rewards (linear to total stake)
-/// - Updated MAX_REWARDS_DURATION to 730 days (63072000 seconds)
-contract ExecuteRewardsCoordinatorUpgrade is QueueRewardsCoordinatorUpgrade {
- using Env for *;
- using Encode for *;
- using TestUtils for *;
-
- function _runAsMultisig() internal override prank(Env.protocolCouncilMultisig()) {
- if (!(Env.isSourceChain() && Env._strEq(Env.envVersion(), "1.9.0"))) {
- return;
- }
-
- 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 {
- if (!(Env.isSourceChain() && Env._strEq(Env.envVersion(), "1.9.0"))) {
- return;
- }
-
- // 1 - Deploy. The new RewardsCoordinator implementation has been deployed
- 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
- });
-
- // 2 - Queue. Check that the operation IS ready
- QueueRewardsCoordinatorUpgrade._runAsMultisig();
- _unsafeResetHasPranked(); // reset hasPranked so we can use it again
-
- assertTrue(timelock.isOperationPending(txHash), "Transaction should be queued");
- assertFalse(timelock.isOperationReady(txHash), "Transaction should NOT be ready immediately");
- assertFalse(timelock.isOperationDone(txHash), "Transaction should NOT be complete");
-
- // 3 - Warp past the timelock delay
- vm.warp(block.timestamp + timelock.getMinDelay());
- assertTrue(timelock.isOperationReady(txHash), "Transaction should be ready for execution");
-
- // 4 - Execute the upgrade
- execute();
- assertTrue(timelock.isOperationDone(txHash), "v1.10.0 RewardsCoordinator upgrade should be complete");
-
- // 5 - Validate the upgrade was successful
- _validateUpgradeComplete();
- _validateProxyAdmin();
- _validateProxyConstructor();
- _validateProxyInitialized();
- _validateNewFunctionalityThroughProxy();
- }
-
- /// @dev Validate that the RewardsCoordinator proxy now points to the new implementation
- function _validateUpgradeComplete() internal view {
- address currentImpl = TestUtils._getProxyImpl(address(Env.proxy.rewardsCoordinator()));
- address expectedImpl = address(Env.impl.rewardsCoordinator());
-
- assertTrue(currentImpl == expectedImpl, "RewardsCoordinator proxy should point to new implementation");
- }
-
- /// @dev Validate the proxy's constructor values through the proxy
- function _validateProxyConstructor() internal view {
- RewardsCoordinator rewardsCoordinator = Env.proxy.rewardsCoordinator();
-
- // Validate core dependencies
- assertTrue(
- address(rewardsCoordinator.delegationManager()) == address(Env.proxy.delegationManager()),
- "RewardsCoordinator delegationManager mismatch"
- );
- assertTrue(
- address(rewardsCoordinator.strategyManager()) == address(Env.proxy.strategyManager()),
- "RewardsCoordinator strategyManager mismatch"
- );
- assertTrue(
- address(rewardsCoordinator.allocationManager()) == address(Env.proxy.allocationManager()),
- "RewardsCoordinator allocationManager mismatch"
- );
- assertTrue(
- address(rewardsCoordinator.pauserRegistry()) == address(Env.impl.pauserRegistry()),
- "RewardsCoordinator pauserRegistry mismatch"
- );
- assertTrue(
- address(rewardsCoordinator.permissionController()) == address(Env.proxy.permissionController()),
- "RewardsCoordinator permissionController mismatch"
- );
-
- // Validate reward parameters
- assertEq(
- rewardsCoordinator.CALCULATION_INTERVAL_SECONDS(),
- Env.CALCULATION_INTERVAL_SECONDS(),
- "CALCULATION_INTERVAL_SECONDS mismatch"
- );
-
- // Validate the updated MAX_REWARDS_DURATION
- assertEq(
- rewardsCoordinator.MAX_REWARDS_DURATION(),
- 63_072_000,
- "MAX_REWARDS_DURATION should be updated to 730 days (63072000 seconds)"
- );
-
- assertEq(
- rewardsCoordinator.MAX_RETROACTIVE_LENGTH(), Env.MAX_RETROACTIVE_LENGTH(), "MAX_RETROACTIVE_LENGTH mismatch"
- );
- assertEq(rewardsCoordinator.MAX_FUTURE_LENGTH(), Env.MAX_FUTURE_LENGTH(), "MAX_FUTURE_LENGTH mismatch");
-
- assertEq(
- rewardsCoordinator.GENESIS_REWARDS_TIMESTAMP(),
- Env.GENESIS_REWARDS_TIMESTAMP(),
- "GENESIS_REWARDS_TIMESTAMP mismatch"
- );
- }
-
- /// @dev Validate that the proxy is still initialized and cannot be re-initialized
- function _validateProxyInitialized() internal {
- RewardsCoordinator rewardsCoordinator = Env.proxy.rewardsCoordinator();
-
- // Validate the existing initializable state variables are still set
- assertTrue(rewardsCoordinator.paused() == Env.REWARDS_PAUSE_STATUS(), "Paused status should still be set");
- assertTrue(rewardsCoordinator.owner() == Env.opsMultisig(), "Owner should still be set");
- assertTrue(rewardsCoordinator.rewardsUpdater() == Env.REWARDS_UPDATER(), "RewardsUpdater should still be set");
- assertTrue(
- rewardsCoordinator.activationDelay() == Env.ACTIVATION_DELAY(), "Activation delay should still be set"
- );
- assertTrue(
- rewardsCoordinator.defaultOperatorSplitBips() == Env.DEFAULT_SPLIT_BIPS(),
- "Default split bips should still be set"
- );
-
- // Attempt to re-initialize should fail
- bytes memory errInit = "Initializable: contract is already initialized";
- vm.expectRevert(errInit);
- rewardsCoordinator.initialize(
- address(0x1234), // initialOwner
- 0, // initialPausedStatus
- address(0x9ABC), // rewardsUpdater
- 0, // activationDelay
- 0 // defaultSplitBips
- );
- }
-
- /// @dev Validate new Rewards v2.2 functionality through the proxy
- function _validateNewFunctionalityThroughProxy() internal view {
- RewardsCoordinator rewardsCoordinator = Env.proxy.rewardsCoordinator();
-
- // The new functions should be accessible through the proxy
- bytes4 createUniqueStakeSelector = rewardsCoordinator.createUniqueStakeRewardsSubmission.selector;
- bytes4 createTotalStakeSelector = rewardsCoordinator.createTotalStakeRewardsSubmission.selector;
-
- // Verify the selectors are non-zero (functions exist)
- assertTrue(
- createUniqueStakeSelector != bytes4(0), "createUniqueStakeRewardsSubmission function should exist on proxy"
- );
- assertTrue(
- createTotalStakeSelector != bytes4(0), "createTotalStakeRewardsSubmission function should exist on proxy"
- );
-
- // Test that we can access the new storage mappings
- address testAvs = address(0xDEAD);
- bytes32 testHash = keccak256("test_rewards_v2.2");
-
- // These should all return false for test values, but accessing them validates the storage layout
- bool isUniqueStake = rewardsCoordinator.isUniqueStakeRewardsSubmissionHash(testAvs, testHash);
- bool isTotalStake = rewardsCoordinator.isTotalStakeRewardsSubmissionHash(testAvs, testHash);
-
- assertFalse(isUniqueStake, "Test hash should not be a unique stake submission");
- assertFalse(isTotalStake, "Test hash should not be a total stake submission");
- }
-}
diff --git a/script/releases/v1.10.0-rewards-v2.2/upgrade.json b/script/releases/v1.10.0-rewards-v2.2/upgrade.json
deleted file mode 100644
index 05d1f68665..0000000000
--- a/script/releases/v1.10.0-rewards-v2.2/upgrade.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "rewards-v2.2-v1.10.0",
- "from": "1.9.0",
- "to": "1.10.0",
- "phases": [
- {
- "type": "eoa",
- "filename": "1-deployRewardsCoordinatorImpl.s.sol"
- },
- {
- "type": "multisig",
- "filename": "2-queueRewardsCoordinatorUpgrade.s.sol"
- },
- {
- "type": "multisig",
- "filename": "3-executeRewardsCoordinatorUpgrade.s.sol"
- }
- ]
-}
\ No newline at end of file
diff --git a/script/releases/v1.12.0-incentive-council/1-deployImplementations.s.sol b/script/releases/v1.12.0-incentive-council/1-deployImplementations.s.sol
new file mode 100644
index 0000000000..1ea889f190
--- /dev/null
+++ b/script/releases/v1.12.0-incentive-council/1-deployImplementations.s.sol
@@ -0,0 +1,99 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.12;
+
+import "../Env.sol";
+import "../TestUtils.sol";
+import {CoreContractsDeployer} from "../CoreContractsDeployer.sol";
+import {EmissionsController} from "src/contracts/core/EmissionsController.sol";
+import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
+
+/// Purpose: use an EOA to deploy all new/updated contracts for Duration Vault and Incentive Council features.
+/// Contracts deployed:
+/// /// Core
+/// - RewardsCoordinator (rewards v2.2 + protocol fees)
+/// - StrategyManager (updated with beforeAddShares/beforeRemoveShares hooks)
+/// - EmissionsController implementation + proxy
+/// /// Strategies
+/// - EigenStrategy, StrategyBase, StrategyBaseTVLLimits (updated for Duration Vault hooks)
+/// - StrategyFactory (updated with duration vault beacon support)
+/// - DurationVaultStrategy (new beacon implementation + beacon)
+contract DeployImplementations is CoreContractsDeployer {
+ using Env for *;
+
+ function _runAsEOA() internal virtual override {
+ vm.startBroadcast();
+
+ /// core/
+ // Deploy EmissionsController proxy first (RewardsCoordinator needs its address as immutable)
+ // Preprod already has EmissionsController proxy deployed
+ if (!(Env._strEq(Env.envVersion(), "1.12.0"))) {
+ deployEmissionsControllerProxy();
+ }
+ deployEmissionsController();
+
+ // Update the MAX_REWARDS_DURATION environment variable before deploying RewardsCoordinator
+ // 63072000s = 730 days = 2 years
+ zUpdateUint32("REWARDS_COORDINATOR_MAX_REWARDS_DURATION", 63_072_000);
+ deployRewardsCoordinator();
+ deployStrategyManager();
+
+ /// strategies/
+ deployEigenStrategy();
+ deployStrategyBase();
+ deployStrategyBaseTVLLimits();
+
+ // Deploy DurationVaultStrategy implementation and beacon
+ DurationVaultStrategy durationVaultImpl = deployDurationVaultStrategy();
+ _deployDurationVaultBeacon(address(durationVaultImpl));
+
+ // Deploy StrategyFactory (requires beacons to exist for immutable constructor args)
+ deployStrategyFactory();
+
+ vm.stopBroadcast();
+ }
+
+ function _deployDurationVaultBeacon(
+ address implementation
+ ) internal onlyEOA {
+ UpgradeableBeacon beacon = new UpgradeableBeacon(implementation);
+ beacon.transferOwnership(Env.executorMultisig());
+ deployBeacon({name: type(DurationVaultStrategy).name, deployedTo: address(beacon)});
+ }
+
+ function deployEmissionsControllerProxy() internal onlyEOA {
+ deployProxy({
+ name: type(EmissionsController).name,
+ deployedTo: address(
+ ITransparentUpgradeableProxy(
+ payable(new TransparentUpgradeableProxy({
+ _logic: address(Env.impl.emptyContract()),
+ admin_: Env.proxyAdmin(),
+ _data: ""
+ }))
+ )
+ )
+ });
+ }
+
+ function testScript() public virtual {
+ if (!Env.isCoreProtocolDeployed()) {
+ return;
+ }
+
+ runAsEOA();
+
+ // Validate incentive council implementations
+ TestUtils.validateEmissionsControllerInitialized(Env.impl.emissionsController());
+ TestUtils.validateRewardsCoordinatorConstructor(Env.impl.rewardsCoordinator());
+ TestUtils.validateEmissionsControllerImmutables(Env.impl.emissionsController());
+ TestUtils.validateRewardsCoordinatorImmutables(Env.impl.rewardsCoordinator());
+
+ // Validate duration vault implementations
+ TestUtils.validateDurationVaultStrategyImplConstructors();
+
+ TestUtils.validateProxyAdmins();
+ TestUtils.validateImplConstructors();
+ TestUtils.validateImplsNotInitializable();
+ }
+}
+
diff --git a/script/releases/v1.12.0-incentive-council/2-queueUpgrade.s.sol b/script/releases/v1.12.0-incentive-council/2-queueUpgrade.s.sol
new file mode 100644
index 0000000000..67c4ec3964
--- /dev/null
+++ b/script/releases/v1.12.0-incentive-council/2-queueUpgrade.s.sol
@@ -0,0 +1,205 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.12;
+
+import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
+import {Encode, MultisigCall} from "zeus-templates/utils/Encode.sol";
+import {IProxyAdmin} from "zeus-templates/interfaces/IProxyAdmin.sol";
+import {
+ ITransparentUpgradeableProxy as ITransparentProxy
+} from "zeus-templates/interfaces/ITransparentUpgradeableProxy.sol";
+import {DeployImplementations} from "./1-deployImplementations.s.sol";
+import {CoreUpgradeQueueBuilder} from "../CoreUpgradeQueueBuilder.sol";
+import "../Env.sol";
+import "../TestUtils.sol";
+
+import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol";
+
+import {EmissionsController} from "src/contracts/core/EmissionsController.sol";
+import {RewardsCoordinator} from "src/contracts/core/RewardsCoordinator.sol";
+import {IProtocolRegistry, IProtocolRegistryTypes} from "src/contracts/interfaces/IProtocolRegistry.sol";
+import {IBackingEigen} from "src/contracts/interfaces/IBackingEigen.sol";
+
+/// Purpose: Queue the upgrade for Duration Vault and Incentive Council features.
+/// This script queues upgrades to:
+/// - EmissionsController (new proxy + initialize, or upgrade for preprod)
+/// - RewardsCoordinator (rewards v2.2 + protocol fees, with conditional reinitialization)
+/// - StrategyManager, EigenStrategy, StrategyBase beacon, StrategyBaseTVLLimits, StrategyFactory
+/// - Register DurationVaultStrategy beacon + EmissionsController in ProtocolRegistry
+/// - Transfer minting rights from legacy hopper to EmissionsController
+contract QueueUpgrade is DeployImplementations, MultisigBuilder {
+ using Env for *;
+ using Encode for *;
+ using CoreUpgradeQueueBuilder 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()
+ });
+ }
+
+ function _getCalldataToExecutor() internal returns (bytes memory) {
+ MultisigCall[] storage executorCalls = Encode.newMultisigCalls();
+
+ // 1. Upgrade EmissionsController proxy to the new implementation and initialize
+ // Preprod needs to be upgraded, not redeployed.
+ if (Env._strEq(Env.envVersion(), "1.12.0")) {
+ executorCalls.append({
+ to: Env.proxyAdmin(),
+ data: abi.encodeCall(
+ IProxyAdmin.upgrade,
+ (
+ ITransparentProxy(payable(address(Env.proxy.emissionsController()))),
+ address(Env.impl.emissionsController())
+ )
+ )
+ });
+ } else {
+ executorCalls.append({
+ to: Env.proxyAdmin(),
+ data: abi.encodeCall(
+ IProxyAdmin.upgradeAndCall,
+ (
+ ITransparentProxy(payable(address(Env.proxy.emissionsController()))),
+ address(Env.impl.emissionsController()),
+ abi.encodeCall(
+ EmissionsController.initialize,
+ (
+ Env.opsMultisig(), // initialOwner
+ Env.incentiveCouncilMultisig(), // initialIncentiveCouncil
+ 0 // initialPausedStatus
+ )
+ )
+ )
+ )
+ });
+ }
+ // 2. Upgrade strategy contracts for Duration Vault feature.
+ executorCalls.upgradeStrategyManager();
+ executorCalls.upgradeEigenStrategy();
+ executorCalls.upgradeStrategyBase();
+ executorCalls.upgradeStrategyBaseTVLLimits();
+ executorCalls.upgradeStrategyFactory();
+
+ // 3. Upgrade RewardsCoordinator to the new implementation.
+ // Check if RewardsCoordinator has already been reinitialized by reading _initialized from storage.
+ // Slot 0 contains: _initialized (uint8 at offset 0) and _initializing (bool at offset 1)
+ // If _initialized >= 2, reinitializer(2) has already been called.
+ RewardsCoordinator rc = Env.proxy.rewardsCoordinator();
+ bytes32 slot0 = vm.load(address(rc), bytes32(uint256(0)));
+ uint8 initializedVersion = uint8(uint256(slot0) & 0xFF); // Mask to get only the first byte
+
+ if (initializedVersion < 2) {
+ // Not yet reinitialized - perform upgrade with reinitialization
+ executorCalls.upgradeAndReinitializeRewardsCoordinator({
+ initialOwner: Env.opsMultisig(),
+ initialPausedStatus: 2,
+ rewardsUpdater: Env.REWARDS_UPDATER(),
+ activationDelay: Env.ACTIVATION_DELAY(),
+ defaultSplitBips: Env.DEFAULT_SPLIT_BIPS(),
+ feeRecipient: Env.incentiveCouncilMultisig()
+ });
+ } else {
+ // Already reinitialized - just upgrade without calling initialize
+ executorCalls.upgradeRewardsCoordinator();
+ }
+ // 4. Register DurationVaultStrategy beacon and EmissionsController in protocol registry.
+ address[] memory addresses = new address[](2);
+ addresses[0] = address(Env.beacon.durationVaultStrategy());
+ addresses[1] = address(Env.proxy.emissionsController());
+
+ IProtocolRegistryTypes.DeploymentConfig[] memory configs = new IProtocolRegistryTypes.DeploymentConfig[](2);
+ configs[0] = IProtocolRegistryTypes.DeploymentConfig({pausable: false, deprecated: false});
+ configs[1] = IProtocolRegistryTypes.DeploymentConfig({pausable: true, deprecated: false});
+
+ string[] memory names = new string[](2);
+ names[0] = type(DurationVaultStrategy).name;
+ names[1] = type(EmissionsController).name;
+
+ executorCalls.append({
+ to: address(Env.proxy.protocolRegistry()),
+ data: abi.encodeCall(IProtocolRegistry.ship, (addresses, configs, names, Env.deployVersion()))
+ });
+ // 5. Remove minting rights from the old hopper.
+ executorCalls.append({
+ to: address(Env.proxy.beigen()),
+ data: abi.encodeCall(IBackingEigen.setIsMinter, (Env.legacyTokenHopper(), false))
+ });
+ // 6. Grant minting rights to the EmissionsController.
+ executorCalls.append({
+ to: address(Env.proxy.beigen()),
+ data: abi.encodeCall(IBackingEigen.setIsMinter, (address(Env.proxy.emissionsController()), true))
+ });
+
+ // Execute the calls.
+ return Encode.gnosisSafe
+ .execTransaction({
+ from: address(Env.timelockController()),
+ to: Env.multiSendCallOnly(),
+ op: Encode.Operation.DelegateCall,
+ data: Encode.multiSend(executorCalls)
+ });
+ }
+
+ function testScript() public virtual override {
+ if (!Env.isCoreProtocolDeployed()) {
+ return;
+ }
+
+ 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.");
+ _validatePreUpgradeState();
+
+ execute();
+
+ // Check that the upgrade has been added to the timelock
+ assertTrue(timelock.isOperationPending(txHash), "Transaction should be queued.");
+ }
+
+ /// @notice Validates state before queuing the upgrade
+ function _validatePreUpgradeState() internal view {
+ // Ensure new implementations are deployed
+ require(
+ address(Env.impl.emissionsController()).code.length > 0, "EmissionsController implementation not deployed"
+ );
+ require(
+ address(Env.impl.rewardsCoordinator()).code.length > 0, "RewardsCoordinator implementation not deployed"
+ );
+
+ // Ensure EmissionsController proxy is deployed
+ require(address(Env.proxy.emissionsController()).code.length > 0, "EmissionsController proxy not deployed");
+ // Ensure old hopper currently has minting rights
+ IBackingEigen beigen = Env.proxy.beigen();
+ if (Env.legacyTokenHopper() != address(0)) {
+ require(beigen.isMinter(Env.legacyTokenHopper()), "Old hopper should have minting rights before upgrade");
+ }
+ // Ensure EmissionsController does NOT have minting rights yet
+ // Skip check if we are on preprod, as the EmissionsController is already deployed.
+ if (!Env._strEq(Env.envVersion(), "1.12.0")) {
+ require(
+ !beigen.isMinter(address(Env.proxy.emissionsController())),
+ "EmissionsController should NOT have minting rights before upgrade"
+ );
+ }
+ }
+}
+
diff --git a/script/releases/v1.12.0-incentive-council/3-completeUpgrade.s.sol b/script/releases/v1.12.0-incentive-council/3-completeUpgrade.s.sol
new file mode 100644
index 0000000000..f374cf67e8
--- /dev/null
+++ b/script/releases/v1.12.0-incentive-council/3-completeUpgrade.s.sol
@@ -0,0 +1,161 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.12;
+
+import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
+import {QueueUpgrade} from "./2-queueUpgrade.s.sol";
+import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
+import {Encode, MultisigCall} from "zeus-templates/utils/Encode.sol";
+import {IProxyAdmin} from "zeus-templates/interfaces/IProxyAdmin.sol";
+import {
+ ITransparentUpgradeableProxy as ITransparentProxy
+} from "zeus-templates/interfaces/ITransparentUpgradeableProxy.sol";
+import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
+import "../Env.sol";
+import "../TestUtils.sol";
+
+import {EmissionsController} from "src/contracts/core/EmissionsController.sol";
+import {RewardsCoordinator} from "src/contracts/core/RewardsCoordinator.sol";
+import {IProtocolRegistry, IProtocolRegistryTypes} from "src/contracts/interfaces/IProtocolRegistry.sol";
+import {IBackingEigen} from "src/contracts/interfaces/IBackingEigen.sol";
+
+contract ExecuteUpgrade is QueueUpgrade {
+ using Env for *;
+
+ function _runAsMultisig() internal virtual override 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 {
+ if (!Env.isCoreProtocolDeployed()) {
+ return;
+ }
+
+ // Deploy the implementations (from previous step 1)
+ super.runAsEOA();
+
+ // Queue the upgrade (from previous step 2)
+ 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.");
+ QueueUpgrade._runAsMultisig();
+ _unsafeResetHasPranked(); // reset hasPranked so we can use it again
+
+ assertTrue(timelock.isOperationPending(txHash), "Transaction should be queued.");
+ assertFalse(timelock.isOperationReady(txHash), "Transaction should NOT be ready for execution.");
+ assertFalse(timelock.isOperationDone(txHash), "Transaction should NOT be complete.");
+
+ // Warp Past delay
+ vm.warp(block.timestamp + timelock.getMinDelay()); // 1 tick after ETA
+ assertEq(timelock.isOperationReady(txHash), true, "Transaction should be executable.");
+
+ // Execute
+ execute();
+
+ // Run Tests
+ TestUtils.validateProxyAdmins();
+ TestUtils.validateProxyConstructors();
+ // TestUtils.validateProxiesAlreadyInitialized();
+ TestUtils.validateProxyStorage();
+ TestUtils.validateImplAddressesMatchProxy();
+
+ // Incentive council validations (must run before validateProtocolRegistry which pauses everything)
+ _validateEmissionsControllerUpgrade();
+ _validateRewardsCoordinatorUpgrade();
+ _validateMintingRights();
+
+ // Duration vault validations
+ TestUtils.validateDurationVaultStrategyProxyAdmin();
+ TestUtils.validateDurationVaultStrategyStorage();
+ TestUtils.validateDurationVaultStrategyImplConstructors();
+ TestUtils.validateDurationVaultStrategyImplAddressesMatchProxy();
+ TestUtils.validateDurationVaultStrategyProtocolRegistry();
+
+ // Run last since it calls pauseAll()
+ TestUtils.validateProtocolRegistry();
+ }
+
+ /// @notice Validates that the EmissionsController was upgraded and initialized correctly
+ function _validateEmissionsControllerUpgrade() internal view {
+ EmissionsController ec = Env.proxy.emissionsController();
+
+ // Validate proxy admin
+ address expectedProxyAdmin = Env.proxyAdmin();
+ address actualProxyAdmin =
+ ProxyAdmin(expectedProxyAdmin).getProxyAdmin(ITransparentUpgradeableProxy(payable(address(ec))));
+ assertEq(actualProxyAdmin, expectedProxyAdmin, "EC: proxy admin incorrect");
+
+ // Validate implementation
+ address expectedImpl = address(Env.impl.emissionsController());
+ address actualImpl =
+ ProxyAdmin(expectedProxyAdmin).getProxyImplementation(ITransparentUpgradeableProxy(payable(address(ec))));
+ assertEq(actualImpl, expectedImpl, "EC: implementation incorrect");
+
+ // Validate initialization state
+ assertEq(ec.owner(), Env.opsMultisig(), "EC: owner incorrect");
+ assertEq(ec.incentiveCouncil(), Env.incentiveCouncilMultisig(), "EC: incentiveCouncil incorrect");
+ assertEq(ec.paused(), 0, "EC: paused status incorrect");
+
+ // Validate immutables
+ TestUtils.validateEmissionsControllerImmutables(ec);
+
+ // Validate protocol registry entry
+ (address addr, IProtocolRegistryTypes.DeploymentConfig memory config) =
+ Env.proxy.protocolRegistry().getDeployment(type(EmissionsController).name);
+ assertEq(addr, address(ec), "EC: protocol registry address incorrect");
+ assertTrue(config.pausable, "EC: should be pausable in registry");
+ assertFalse(config.deprecated, "EC: should not be deprecated in registry");
+ }
+
+ /// @notice Validates that the RewardsCoordinator was upgraded and reinitialized correctly
+ function _validateRewardsCoordinatorUpgrade() internal view {
+ RewardsCoordinator rc = Env.proxy.rewardsCoordinator();
+
+ // Validate implementation
+ address expectedImpl = address(Env.impl.rewardsCoordinator());
+ address actualImpl =
+ ProxyAdmin(Env.proxyAdmin()).getProxyImplementation(ITransparentUpgradeableProxy(payable(address(rc))));
+ assertEq(actualImpl, expectedImpl, "RC: implementation incorrect");
+
+ // Validate reinitialization state
+ assertEq(rc.owner(), Env.opsMultisig(), "RC: owner incorrect");
+ assertEq(rc.rewardsUpdater(), Env.REWARDS_UPDATER(), "RC: rewardsUpdater incorrect");
+ assertEq(rc.activationDelay(), Env.ACTIVATION_DELAY(), "RC: activationDelay incorrect");
+ assertEq(rc.defaultOperatorSplitBips(), Env.DEFAULT_SPLIT_BIPS(), "RC: defaultOperatorSplitBips incorrect");
+ assertEq(rc.feeRecipient(), Env.incentiveCouncilMultisig(), "RC: feeRecipient incorrect");
+ //assertEq(rc.paused(), 2, "RC: paused status incorrect");
+
+ // Validate immutables still intact
+ TestUtils.validateRewardsCoordinatorImmutables(rc);
+ }
+
+ /// @notice Validates that minting rights were correctly transferred
+ function _validateMintingRights() internal view {
+ IBackingEigen beigen = Env.proxy.beigen();
+
+ // Validate EmissionsController has minting rights
+ assertTrue(
+ beigen.isMinter(address(Env.proxy.emissionsController())), "EmissionsController should have minting rights"
+ );
+
+ // Validate old hopper does NOT have minting rights
+ assertFalse(beigen.isMinter(Env.legacyTokenHopper()), "Old hopper should NOT have minting rights");
+ }
+}
+
diff --git a/script/releases/v1.12.0-incentive-council/upgrade.json b/script/releases/v1.12.0-incentive-council/upgrade.json
new file mode 100644
index 0000000000..9e5d440e6d
--- /dev/null
+++ b/script/releases/v1.12.0-incentive-council/upgrade.json
@@ -0,0 +1,22 @@
+{
+ "name": "duration-vault-incentives-v1.12.0",
+ "from": "1.9.0",
+ "to": "1.12.0",
+ "phases": [
+ {
+ "type": "eoa",
+ "filename": "1-deployImplementations.s.sol",
+ "description": "Deploy Duration Vault, RewardsCoordinator v2.2, and EmissionsController implementations"
+ },
+ {
+ "type": "multisig",
+ "filename": "2-queueUpgrade.s.sol",
+ "description": "Queue upgrades for all strategy contracts, EmissionsController, and RewardsCoordinator"
+ },
+ {
+ "type": "multisig",
+ "filename": "3-completeUpgrade.s.sol",
+ "description": "Execute the upgrade after timelock delay"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/script/releases/v1.9.0-slashing-ux-destination/1-deployProtocolRegistryProxy.s.sol b/script/releases/v1.9.0-slashing-ux-destination/1-deployProtocolRegistryProxy.s.sol
deleted file mode 100644
index 9a5b634f15..0000000000
--- a/script/releases/v1.9.0-slashing-ux-destination/1-deployProtocolRegistryProxy.s.sol
+++ /dev/null
@@ -1,94 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
-import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
-import "../Env.sol";
-import {CrosschainDeployLib} from "script/releases/CrosschainDeployLib.sol";
-
-/// Purpose: Deploy the Protocol Registry contract
-contract DeployProtocolRegistryProxy is MultisigBuilder {
- using Env for *;
- using CrosschainDeployLib for *;
-
- /// forgefmt: disable-next-item
- function _runAsMultisig() internal virtual override {
- // Only execute on version 1.8.1
- if (!Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- // We don't use the prank modifier here, since we have to write to the env
- _startPrank(Env.multichainDeployerMultisig());
-
- // Deploy Protocol Registry Proxy
- ITransparentUpgradeableProxy protocolRegistryProxy = CrosschainDeployLib.deployCrosschainProxy({
- implementation: address(Env.impl.emptyContract()),
- adminAndDeployer: Env.multichainDeployerMultisig(),
- name: type(ProtocolRegistry).name
- });
-
- // Stop pranking
- _stopPrank();
-
- // Save all the contracts to the env
- _unsafeAddProxyContract(type(ProtocolRegistry).name, address(protocolRegistryProxy));
- }
-
- function testScript() public virtual {
- if (Env.isCoreProtocolDeployed() || !Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- execute();
-
- _validateProxyAdminIsMultisig();
- _validateExpectedProxyAddress();
- }
-
- /// @dev Validate that proxies are owned by the multichain deployer multisig (temporarily)
- function _validateProxyAdminIsMultisig() internal view {
- address multisig = Env.multichainDeployerMultisig();
-
- assertTrue(
- Env.getProxyAdminBySlot(address(Env.proxy.protocolRegistry())) == multisig,
- "protocolRegistry proxyAdmin should be multisig"
- );
- }
-
- /// @dev Validate that the expected proxy address is deployed
- function _validateExpectedProxyAddress() internal view {
- address expectedProxy =
- _computeExpectedProxyAddress(type(ProtocolRegistry).name, address(Env.impl.emptyContract()));
- address actualProxy = address(Env.proxy.protocolRegistry());
- assertTrue(expectedProxy == actualProxy, "protocolRegistry proxy address mismatch");
- }
-
- /// @dev Check if the proxies are deployed by checking if the empty contract is deployed
- function _areProxiesDeployed() internal view returns (bool) {
- address expectedProtocolRegistry =
- _computeExpectedProxyAddress(type(ProtocolRegistry).name, address(Env.impl.emptyContract()));
-
- // If the empty contract is deployed, then the proxies are deployed
- return expectedProtocolRegistry.code.length > 0;
- }
-
- /// @dev Add the contracts to the env
- function _addContractsToEnv() internal {
- address expectedProtocolRegistry =
- _computeExpectedProxyAddress(type(ProtocolRegistry).name, address(Env.impl.emptyContract()));
- _unsafeAddProxyContract(type(ProtocolRegistry).name, expectedProtocolRegistry);
- }
-
- /// @dev Compute the expected proxy address for a given name and empty contract
- function _computeExpectedProxyAddress(
- string memory name,
- address emptyContract
- ) internal view returns (address) {
- return CrosschainDeployLib.computeCrosschainUpgradeableProxyAddress({
- adminAndDeployer: Env.multichainDeployerMultisig(),
- implementation: emptyContract,
- name: name
- });
- }
-}
diff --git a/script/releases/v1.9.0-slashing-ux-destination/2-deployProtocolRegistryImpl.s.sol b/script/releases/v1.9.0-slashing-ux-destination/2-deployProtocolRegistryImpl.s.sol
deleted file mode 100644
index 5de4ed234a..0000000000
--- a/script/releases/v1.9.0-slashing-ux-destination/2-deployProtocolRegistryImpl.s.sol
+++ /dev/null
@@ -1,51 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
-import {DeployProtocolRegistryProxy} from "./1-deployProtocolRegistryProxy.s.sol";
-import {CoreContractsDeployer} from "../CoreContractsDeployer.sol";
-import "../Env.sol";
-import "../TestUtils.sol";
-
-/// Purpose: Deploy Protocol Registry implementation
-contract DeployProtocolRegistryImpl is DeployProtocolRegistryProxy, CoreContractsDeployer {
- using Env for *;
-
- function _runAsEOA() internal virtual override {
- // Only execute on version 1.8.1
- if (!Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- vm.startBroadcast();
-
- // Deploy Protocol Registry implementation
- deployProtocolRegistry();
-
- vm.stopBroadcast();
- }
-
- function testScript() public virtual override {
- if (Env.isCoreProtocolDeployed() || !Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- // 1. Deploy Protocol Registry Proxy
- // Only deploy the proxies if they haven't been deployed yet
- /// @dev This is needed in the production environment tests since this step would fail if the proxies are already deployed
- if (!_areProxiesDeployed()) {
- DeployProtocolRegistryProxy._runAsMultisig();
- _unsafeResetHasPranked(); // reset hasPranked so we can use it in the execute()
- } else {
- // Since the proxies are already deployed, we need to update the env with the proper addresses
- _addContractsToEnv();
- }
-
- // 2. Deploy Implementation
- runAsEOA();
-
- // Validate the implementation
- // Protocol Registry has no constructor, so we don't need to validate the immutables
- TestUtils.validateProtocolRegistryInitialized(Env.impl.protocolRegistry());
- }
-}
diff --git a/script/releases/v1.9.0-slashing-ux-destination/3-upgradeProtocolRegistry.s.sol b/script/releases/v1.9.0-slashing-ux-destination/3-upgradeProtocolRegistry.s.sol
deleted file mode 100644
index 26f2deccf7..0000000000
--- a/script/releases/v1.9.0-slashing-ux-destination/3-upgradeProtocolRegistry.s.sol
+++ /dev/null
@@ -1,60 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
-import {DeployProtocolRegistryProxy} from "./1-deployProtocolRegistryProxy.s.sol";
-import {DeployProtocolRegistryImpl} from "./2-deployProtocolRegistryImpl.s.sol";
-import {CoreContractsDeployer} from "../CoreContractsDeployer.sol";
-
-import "../Env.sol";
-import "../TestUtils.sol";
-
-/// Purpose: Upgrade Protocol Registry Proxy to point to the implementation. Also transfer control to the ProxyAdmin.
-contract UpgradeProtocolRegistry is DeployProtocolRegistryImpl {
- using Env for *;
-
- /// forgefmt: disable-next-item
- function _runAsMultisig() internal virtual override prank(Env.multichainDeployerMultisig()) {
- // Only execute on version 1.8.1
- if (!Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- // Upgrade the proxies to point to the actual implementations
- ITransparentUpgradeableProxy protocolRegistryProxy =
- ITransparentUpgradeableProxy(payable(address(Env.proxy.protocolRegistry())));
- protocolRegistryProxy.upgradeToAndCall(address(Env.impl.protocolRegistry()), abi.encodeWithSelector(ProtocolRegistry.initialize.selector, Env.executorMultisig(), Env.pauserMultisig()));
-
- // Transfer proxy admin ownership
- protocolRegistryProxy.changeAdmin(Env.proxyAdmin());
- }
-
- function testScript() public virtual override {
- if (Env.isCoreProtocolDeployed() || !Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
- // 1. Deploy the Protocol Registry Proxy
- // If proxies are not deployed, deploy them
- if (!_areProxiesDeployed()) {
- DeployProtocolRegistryProxy._runAsMultisig();
- _unsafeResetHasPranked(); // reset hasPranked so we can use it in the execute()
- } else {
- // Since the proxies are already deployed, we need to update the env with the proper addresses
- _addContractsToEnv();
- }
-
- // 2. Deploy the Protocol Registry Implementation
- _mode = OperationalMode.EOA; // Set to EOA mode so we can deploy the impls in the EOA script
- DeployProtocolRegistryImpl._runAsEOA();
-
- // 3. Upgrade the Protocol Registry Proxy
- execute();
-
- // 4. Validate the Protocol Registry
- TestUtils.validateDestinationProxyAdmins();
- TestUtils.validateProtocolRegistryInitialized(Env.proxy.protocolRegistry());
- // ProtocolRegistry has no constructor, so we don't need to validate the constructors
- // ProtocolRegistry has no initial storage, so we don't need to validate the storage
- TestUtils.validateDestinationImplAddressesMatchProxy();
- }
-}
diff --git a/script/releases/v1.9.0-slashing-ux-destination/4-deployCoreContracts.s.sol b/script/releases/v1.9.0-slashing-ux-destination/4-deployCoreContracts.s.sol
deleted file mode 100644
index 5ebaf27114..0000000000
--- a/script/releases/v1.9.0-slashing-ux-destination/4-deployCoreContracts.s.sol
+++ /dev/null
@@ -1,87 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
-import {CoreContractsDeployer} from "../CoreContractsDeployer.sol";
-import {DeployProtocolRegistryProxy} from "./1-deployProtocolRegistryProxy.s.sol";
-import {DeployProtocolRegistryImpl} from "./2-deployProtocolRegistryImpl.s.sol";
-import {UpgradeProtocolRegistry} from "./3-upgradeProtocolRegistry.s.sol";
-import "../Env.sol";
-import "../TestUtils.sol";
-
-import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
-import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
-import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
-
-/// Purpose: use an EOA to deploy all of the new contracts for this upgrade.
-/// Contracts deployed:
-/// /// Multichain
-/// - BN254CertificateVerifier
-/// - CrossChainRegistry
-/// - ECDSACertificateVerifier
-/// - OperatorTableUpdater
-/// /// AVS
-/// - TaskMailbox
-contract DeployCoreContracts is UpgradeProtocolRegistry {
- using Env for *;
-
- function _runAsEOA() internal override {
- // Only execute on version 1.8.1
- if (!Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- vm.startBroadcast();
-
- /// multichain/
- deployBN254CertificateVerifier();
- // CrossChainRegistry only deployed on destination chain
- deployECDSACertificateVerifier();
- deployOperatorTableUpdater();
-
- /// avs/
- deployTaskMailbox();
-
- vm.stopBroadcast();
- }
-
- function testScript() public virtual override {
- if (Env.isCoreProtocolDeployed() || !Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- // Deploy protocol registry and initialize it
- _completeProtocolRegistryUpgrade();
-
- // Deploy the core contracts
- runAsEOA();
-
- // Run tests
- TestUtils.validateDestinationProxyAdmins();
- TestUtils.validateDestinationImplConstructors();
- TestUtils.validateDestinationImplsNotInitializable();
-
- // Check individual version addresses
- TestUtils.validateECDSACertificateVerifierVersion();
- }
-
- function _completeProtocolRegistryUpgrade() internal {
- // 1. Deploy the Protocol Registry Proxy
- // If proxies are not deployed, deploy them
- if (!_areProxiesDeployed()) {
- DeployProtocolRegistryProxy._runAsMultisig();
- _unsafeResetHasPranked(); // reset hasPranked so we can use it in the execute()
- } else {
- // Since the proxies are already deployed, we need to update the env with the proper addresses
- _addContractsToEnv();
- }
-
- // 2. Deploy the Protocol Registry Implementation
- _mode = OperationalMode.EOA; // Set to EOA mode so we can deploy the impls in the EOA script
- DeployProtocolRegistryImpl._runAsEOA();
-
- // 3. Upgrade the Protocol Registry Proxy
- UpgradeProtocolRegistry._runAsMultisig();
- _unsafeResetHasPranked(); // reset hasPranked so we can use in the future
- }
-}
diff --git a/script/releases/v1.9.0-slashing-ux-destination/5-queueUpgrade.s.sol b/script/releases/v1.9.0-slashing-ux-destination/5-queueUpgrade.s.sol
deleted file mode 100644
index 3abbb2e408..0000000000
--- a/script/releases/v1.9.0-slashing-ux-destination/5-queueUpgrade.s.sol
+++ /dev/null
@@ -1,144 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
-import {UpgradeProtocolRegistry} from "./3-upgradeProtocolRegistry.s.sol";
-import {DeployCoreContracts} from "./4-deployCoreContracts.s.sol";
-import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
-import {Encode, MultisigCall} from "zeus-templates/utils/Encode.sol";
-import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
-import {CoreUpgradeQueueBuilder} from "../CoreUpgradeQueueBuilder.sol";
-import {IProtocolRegistryTypes} from "src/contracts/interfaces/IProtocolRegistry.sol";
-import "../Env.sol";
-import "../TestUtils.sol";
-
-contract QueueUpgrade is DeployCoreContracts {
- using Env for *;
- using Encode for *;
- using CoreUpgradeQueueBuilder for MultisigCall[];
-
- function _runAsMultisig() internal virtual override prank(Env.opsMultisig()) {
- // Only execute on version 1.8.1
- if (!Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- 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()
- });
-
- // Add the protocol registry as a pauser to the pauser registry
- Env.impl.pauserRegistry().setIsPauser(address(Env.proxy.protocolRegistry()), true);
- }
-
- function _getCalldataToExecutor() internal returns (bytes memory) {
- MultisigCall[] storage executorCalls = Encode.newMultisigCalls();
-
- /// multichain
- executorCalls.upgradeBN254CertificateVerifier();
- executorCalls.upgradeECDSACertificateVerifier();
- executorCalls.upgradeOperatorTableUpdater();
-
- /// avs
- executorCalls.upgradeTaskMailbox();
-
- // Add the protocol registry upgrade to the executor calls
- _appendProtocolRegistryUpgrade(executorCalls);
-
- return Encode.gnosisSafe
- .execTransaction({
- from: address(Env.timelockController()),
- to: Env.multiSendCallOnly(),
- op: Encode.Operation.DelegateCall,
- data: Encode.multiSend(executorCalls)
- });
- }
-
- function _appendProtocolRegistryUpgrade(
- MultisigCall[] storage calls
- ) internal {
- // We want to add all addresses that are deployed to the protocol registry
- address[] memory addresses = new address[](6);
- IProtocolRegistryTypes.DeploymentConfig[] memory configs = new IProtocolRegistryTypes.DeploymentConfig[](6);
- string[] memory names = new string[](6);
-
- IProtocolRegistryTypes.DeploymentConfig memory pausableConfig =
- IProtocolRegistryTypes.DeploymentConfig({pausable: true, deprecated: false});
- IProtocolRegistryTypes.DeploymentConfig memory unpausableConfig =
- IProtocolRegistryTypes.DeploymentConfig({pausable: false, deprecated: false});
-
- /// permissions/
- addresses[0] = address(Env.impl.pauserRegistry());
- configs[0] = unpausableConfig;
- names[0] = type(PauserRegistry).name;
-
- /// core/
- addresses[1] = address(Env.proxy.protocolRegistry());
- configs[1] = unpausableConfig;
- names[1] = type(ProtocolRegistry).name;
-
- /// multichain/
- addresses[2] = address(Env.proxy.bn254CertificateVerifier());
- configs[2] = unpausableConfig;
- names[2] = type(BN254CertificateVerifier).name;
-
- addresses[3] = address(Env.proxy.ecdsaCertificateVerifier());
- configs[3] = unpausableConfig;
- names[3] = type(ECDSACertificateVerifier).name;
-
- addresses[4] = address(Env.proxy.operatorTableUpdater());
- configs[4] = pausableConfig;
- names[4] = type(OperatorTableUpdater).name;
-
- /// avs/
- addresses[5] = address(Env.proxy.taskMailbox());
- configs[5] = unpausableConfig;
- names[5] = type(TaskMailbox).name;
-
- // Lastly, append to the multisig calls
- calls.append({
- to: address(Env.proxy.protocolRegistry()),
- data: abi.encodeWithSelector(
- IProtocolRegistry.ship.selector, addresses, configs, names, Env.deployVersion()
- )
- });
- }
-
- function testScript() public virtual override {
- if (Env.isCoreProtocolDeployed() || !Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- // Complete previous steps
- _completeProtocolRegistryUpgrade();
-
- // Deploy the core contracts
- super.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.9.0-slashing-ux-destination/6-completeUpgrade.s.sol b/script/releases/v1.9.0-slashing-ux-destination/6-completeUpgrade.s.sol
deleted file mode 100644
index d198e4818d..0000000000
--- a/script/releases/v1.9.0-slashing-ux-destination/6-completeUpgrade.s.sol
+++ /dev/null
@@ -1,77 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
-import {QueueUpgrade} from "./5-queueUpgrade.s.sol";
-import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
-import {Encode, MultisigCall} from "zeus-templates/utils/Encode.sol";
-import "../Env.sol";
-import "../TestUtils.sol";
-
-contract ExecuteUpgrade is QueueUpgrade {
- using Env for *;
-
- function _runAsMultisig() internal virtual override prank(Env.protocolCouncilMultisig()) {
- // Only execute on version 1.8.1
- if (!Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- 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 {
- if (Env.isCoreProtocolDeployed() || !Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- // Complete previous steps
- _completeProtocolRegistryUpgrade();
-
- // Deploy the core contracts
- super.runAsEOA();
-
- // Queue the upgrade
- 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.");
- QueueUpgrade._runAsMultisig();
- _unsafeResetHasPranked(); // reset hasPranked so we can use it again
-
- assertTrue(timelock.isOperationPending(txHash), "Transaction should be queued.");
- assertFalse(timelock.isOperationReady(txHash), "Transaction should NOT be ready for execution.");
- assertFalse(timelock.isOperationDone(txHash), "Transaction should NOT be complete.");
-
- // Warp Past delay
- vm.warp(block.timestamp + timelock.getMinDelay()); // 1 tick after ETA
- assertEq(timelock.isOperationReady(txHash), true, "Transaction should be executable.");
-
- // Execute
- execute();
-
- // Run Tests
- TestUtils.validateDestinationProxyAdmins();
- TestUtils.validateDestinationProxyConstructors();
- TestUtils.validateDestinationProxiesAlreadyInitialized();
- TestUtils.validateDestinationProxyStorage();
- TestUtils.validateDestinationImplAddressesMatchProxy();
- TestUtils.validateDestinationProtocolRegistry();
- }
-}
diff --git a/script/releases/v1.9.0-slashing-ux-destination/upgrade.json b/script/releases/v1.9.0-slashing-ux-destination/upgrade.json
deleted file mode 100644
index ea957cc5ab..0000000000
--- a/script/releases/v1.9.0-slashing-ux-destination/upgrade.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "name": "slashing-ux-improvements",
- "from": ">=1.8.0",
- "to": "1.9.0",
- "phases": [
- {
- "type": "multisig",
- "filename": "1-deployProtocolRegistryProxy.s.sol"
- },
- {
- "type": "eoa",
- "filename": "2-deployProtocolRegistryImpl.s.sol"
- },
- {
- "type": "multisig",
- "filename": "3-upgradeProtocolRegistry.s.sol"
- },
- {
- "type": "eoa",
- "filename": "4-deployCoreContracts.s.sol"
- },
- {
- "type": "multisig",
- "filename": "5-queueUpgrade.s.sol"
- },
- {
- "type": "multisig",
- "filename": "6-completeUpgrade.s.sol"
- }
- ]
-}
\ No newline at end of file
diff --git a/script/releases/v1.9.0-slashing-ux/1-deployProtocolRegistryProxy.s.sol b/script/releases/v1.9.0-slashing-ux/1-deployProtocolRegistryProxy.s.sol
deleted file mode 100644
index d40117e26c..0000000000
--- a/script/releases/v1.9.0-slashing-ux/1-deployProtocolRegistryProxy.s.sol
+++ /dev/null
@@ -1,93 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
-import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
-import "../Env.sol";
-import {CrosschainDeployLib} from "script/releases/CrosschainDeployLib.sol";
-
-/// Purpose: Deploy the Protocol Registry contract
-contract DeployProtocolRegistryProxy is MultisigBuilder {
- using Env for *;
- using CrosschainDeployLib for *;
-
- /// forgefmt: disable-next-item
- function _runAsMultisig() internal virtual override {
- // Only execute on version 1.8.1
- if (!Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- // We don't use the prank modifier here, since we have to write to the env
- _startPrank(Env.multichainDeployerMultisig());
-
- // Deploy Protocol Registry Proxy
- ITransparentUpgradeableProxy protocolRegistryProxy = CrosschainDeployLib.deployCrosschainProxy({
- implementation: address(Env.impl.emptyContract()),
- adminAndDeployer: Env.multichainDeployerMultisig(),
- name: type(ProtocolRegistry).name
- });
-
- // Stop pranking
- _stopPrank();
-
- // Save all the contracts to the env
- _unsafeAddProxyContract(type(ProtocolRegistry).name, address(protocolRegistryProxy));
- }
-
- function testScript() public virtual {
- if (!Env.isCoreProtocolDeployed() || !Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
- execute();
-
- _validateProxyAdminIsMultisig();
- _validateExpectedProxyAddress();
- }
-
- /// @dev Validate that proxies are owned by the multichain deployer multisig (temporarily)
- function _validateProxyAdminIsMultisig() internal view {
- address multisig = Env.multichainDeployerMultisig();
-
- assertTrue(
- Env.getProxyAdminBySlot(address(Env.proxy.protocolRegistry())) == multisig,
- "protocolRegistry proxyAdmin should be multisig"
- );
- }
-
- /// @dev Validate that the expected proxy address is deployed
- function _validateExpectedProxyAddress() internal view {
- address expectedProxy =
- _computeExpectedProxyAddress(type(ProtocolRegistry).name, address(Env.impl.emptyContract()));
- address actualProxy = address(Env.proxy.protocolRegistry());
- assertTrue(expectedProxy == actualProxy, "protocolRegistry proxy address mismatch");
- }
-
- /// @dev Check if the proxies are deployed by checking if the empty contract is deployed
- function _areProxiesDeployed() internal view returns (bool) {
- address expectedProtocolRegistry =
- _computeExpectedProxyAddress(type(ProtocolRegistry).name, address(Env.impl.emptyContract()));
-
- // If the empty contract is deployed, then the proxies are deployed
- return expectedProtocolRegistry.code.length > 0;
- }
-
- /// @dev Add the contracts to the env
- function _addContractsToEnv() internal {
- address expectedProtocolRegistry =
- _computeExpectedProxyAddress(type(ProtocolRegistry).name, address(Env.impl.emptyContract()));
- _unsafeAddProxyContract(type(ProtocolRegistry).name, expectedProtocolRegistry);
- }
-
- /// @dev Compute the expected proxy address for a given name and empty contract
- function _computeExpectedProxyAddress(
- string memory name,
- address emptyContract
- ) internal view returns (address) {
- return CrosschainDeployLib.computeCrosschainUpgradeableProxyAddress({
- adminAndDeployer: Env.multichainDeployerMultisig(),
- implementation: emptyContract,
- name: name
- });
- }
-}
diff --git a/script/releases/v1.9.0-slashing-ux/2-deployProtocolRegistryImpl.s.sol b/script/releases/v1.9.0-slashing-ux/2-deployProtocolRegistryImpl.s.sol
deleted file mode 100644
index ec80d17e73..0000000000
--- a/script/releases/v1.9.0-slashing-ux/2-deployProtocolRegistryImpl.s.sol
+++ /dev/null
@@ -1,50 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
-import {DeployProtocolRegistryProxy} from "./1-deployProtocolRegistryProxy.s.sol";
-import {CoreContractsDeployer} from "../CoreContractsDeployer.sol";
-import "../Env.sol";
-import "../TestUtils.sol";
-
-/// Purpose: Deploy Protocol Registry implementation
-contract DeployProtocolRegistryImpl is DeployProtocolRegistryProxy, CoreContractsDeployer {
- using Env for *;
-
- function _runAsEOA() internal virtual override {
- // Only execute on version 1.8.1
- if (!Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- vm.startBroadcast();
-
- // Deploy Protocol Registry implementation
- deployProtocolRegistry();
-
- vm.stopBroadcast();
- }
-
- function testScript() public virtual override {
- if (!Env.isCoreProtocolDeployed() || !Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
- // 1. Deploy Protocol Registry Proxy
- // Only deploy the proxies if they haven't been deployed yet
- /// @dev This is needed in the production environment tests since this step would fail if the proxies are already deployed
- if (!_areProxiesDeployed()) {
- DeployProtocolRegistryProxy._runAsMultisig();
- _unsafeResetHasPranked(); // reset hasPranked so we can use it in the execute()
- } else {
- // Since the proxies are already deployed, we need to update the env with the proper addresses
- _addContractsToEnv();
- }
-
- // 2. Deploy Implementation
- runAsEOA();
-
- // Validate the implementation
- // Protocol Registry has no constructor, so we don't need to validate the immutables
- TestUtils.validateProtocolRegistryInitialized(Env.impl.protocolRegistry());
- }
-}
diff --git a/script/releases/v1.9.0-slashing-ux/3-upgradeProtocolRegistry.s.sol b/script/releases/v1.9.0-slashing-ux/3-upgradeProtocolRegistry.s.sol
deleted file mode 100644
index ee5e15d2bb..0000000000
--- a/script/releases/v1.9.0-slashing-ux/3-upgradeProtocolRegistry.s.sol
+++ /dev/null
@@ -1,60 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
-import {DeployProtocolRegistryProxy} from "./1-deployProtocolRegistryProxy.s.sol";
-import {DeployProtocolRegistryImpl} from "./2-deployProtocolRegistryImpl.s.sol";
-import {CoreContractsDeployer} from "../CoreContractsDeployer.sol";
-
-import "../Env.sol";
-import "../TestUtils.sol";
-
-/// Purpose: Upgrade Protocol Registry Proxy to point to the implementation. Also transfer control to the ProxyAdmin.
-contract UpgradeProtocolRegistry is DeployProtocolRegistryImpl {
- using Env for *;
-
- /// forgefmt: disable-next-item
- function _runAsMultisig() internal virtual override prank(Env.multichainDeployerMultisig()) {
- // Only execute on version 1.8.1
- if (!Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- // Upgrade the proxies to point to the actual implementations
- ITransparentUpgradeableProxy protocolRegistryProxy =
- ITransparentUpgradeableProxy(payable(address(Env.proxy.protocolRegistry())));
- protocolRegistryProxy.upgradeToAndCall(address(Env.impl.protocolRegistry()), abi.encodeWithSelector(ProtocolRegistry.initialize.selector, Env.executorMultisig(), Env.pauserMultisig()));
-
- // Transfer proxy admin ownership
- protocolRegistryProxy.changeAdmin(Env.proxyAdmin());
- }
-
- function testScript() public virtual override {
- if (!Env.isCoreProtocolDeployed() || !Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
- // 1. Deploy the Protocol Registry Proxy
- // If proxies are not deployed, deploy them
- if (!_areProxiesDeployed()) {
- DeployProtocolRegistryProxy._runAsMultisig();
- _unsafeResetHasPranked(); // reset hasPranked so we can use it in the execute()
- } else {
- // Since the proxies are already deployed, we need to update the env with the proper addresses
- _addContractsToEnv();
- }
-
- // 2. Deploy the Protocol Registry Implementation
- _mode = OperationalMode.EOA; // Set to EOA mode so we can deploy the impls in the EOA script
- DeployProtocolRegistryImpl._runAsEOA();
-
- // 3. Upgrade the Protocol Registry Proxy
- execute();
-
- // 4. Validate the Protocol Registry
- TestUtils.validateDestinationProxyAdmins();
- TestUtils.validateProtocolRegistryInitialized(Env.proxy.protocolRegistry());
- // ProtocolRegistry has no constructor, so we don't need to validate the constructors
- // ProtocolRegistry has no initial storage, so we don't need to validate the storage
- TestUtils.validateDestinationImplAddressesMatchProxy();
- }
-}
diff --git a/script/releases/v1.9.0-slashing-ux/4-deployCoreContracts.s.sol b/script/releases/v1.9.0-slashing-ux/4-deployCoreContracts.s.sol
deleted file mode 100644
index f927fc6c95..0000000000
--- a/script/releases/v1.9.0-slashing-ux/4-deployCoreContracts.s.sol
+++ /dev/null
@@ -1,132 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
-import {CoreContractsDeployer} from "../CoreContractsDeployer.sol";
-import {DeployProtocolRegistryProxy} from "./1-deployProtocolRegistryProxy.s.sol";
-import {DeployProtocolRegistryImpl} from "./2-deployProtocolRegistryImpl.s.sol";
-import {UpgradeProtocolRegistry} from "./3-upgradeProtocolRegistry.s.sol";
-import "../Env.sol";
-import "../TestUtils.sol";
-
-import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
-import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
-import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
-
-/// Purpose: use an EOA to deploy all of the new contracts for this upgrade.
-/// Contracts deployed:
-/// /// Permissions
-/// - PermissionController
-/// - KeyRegistrar
-/// /// Core
-/// - AllocationManager
-/// - AVSDirectory
-/// - DelegationManager
-/// - ReleaseManager
-/// - RewardsCoordinator
-/// - StrategyManager
-/// /// Pods
-/// - EigenPod
-/// - EigenPodManager
-/// /// Strategies
-/// - EigenStrategy
-/// - StrategyBase
-/// - StrategyBaseTVLLimits
-/// - StrategyFactory
-/// /// Multichain
-/// - BN254CertificateVerifier
-/// - CrossChainRegistry
-/// - ECDSACertificateVerifier
-/// - OperatorTableUpdater
-/// /// AVS
-/// - TaskMailbox
-contract DeployCoreContracts is UpgradeProtocolRegistry {
- using Env for *;
-
- function _runAsEOA() internal override {
- // Only execute on version 1.8.1
- if (!Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- vm.startBroadcast();
-
- /// pemissions/
- deployPermissionController();
- deployKeyRegistrar();
-
- /// core/
- deployAllocationManagerView();
- deployAllocationManager();
- deployAVSDirectory();
- deployDelegationManager();
- // Protocol registry was deployed in the previous step
- deployReleaseManager();
- deployRewardsCoordinator();
- deployStrategyManager();
-
- /// pods/
- deployEigenPodManager();
- deployEigenPod();
-
- /// strategies/
- deployEigenStrategy();
- deployStrategyBase();
- deployStrategyBaseTVLLimits();
- deployStrategyFactory();
-
- /// multichain/
- deployBN254CertificateVerifier();
- deployCrossChainRegistry();
- deployECDSACertificateVerifier();
- deployOperatorTableUpdater();
-
- /// avs/
- deployTaskMailbox();
-
- vm.stopBroadcast();
- }
-
- function testScript() public virtual override {
- if (!Env.isCoreProtocolDeployed() || !Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
- // Deploy protocol registry and initialize it
- _completeProtocolRegistryUpgrade();
-
- // Deploy the core contracts
- runAsEOA();
-
- // Run tests
- TestUtils.validateProxyAdmins();
- TestUtils.validateImplConstructors();
- TestUtils.validateImplsNotInitializable();
-
- // Check individual version addresses
- TestUtils.validateKeyRegistrarVersion();
- TestUtils.validateAVSDirectoryVersion();
- TestUtils.validateDelegationManagerVersion();
- TestUtils.validateStrategyManagerVersion();
- TestUtils.validateECDSACertificateVerifierVersion();
- }
-
- function _completeProtocolRegistryUpgrade() internal {
- // 1. Deploy the Protocol Registry Proxy
- // If proxies are not deployed, deploy them
- if (!_areProxiesDeployed()) {
- DeployProtocolRegistryProxy._runAsMultisig();
- _unsafeResetHasPranked(); // reset hasPranked so we can use it in the execute()
- } else {
- // Since the proxies are already deployed, we need to update the env with the proper addresses
- _addContractsToEnv();
- }
-
- // 2. Deploy the Protocol Registry Implementation
- _mode = OperationalMode.EOA; // Set to EOA mode so we can deploy the impls in the EOA script
- DeployProtocolRegistryImpl._runAsEOA();
-
- // 3. Upgrade the Protocol Registry Proxy
- UpgradeProtocolRegistry._runAsMultisig();
- _unsafeResetHasPranked(); // reset hasPranked so we can use in the future
- }
-}
diff --git a/script/releases/v1.9.0-slashing-ux/5-queueUpgrade.s.sol b/script/releases/v1.9.0-slashing-ux/5-queueUpgrade.s.sol
deleted file mode 100644
index e13ce2f5ad..0000000000
--- a/script/releases/v1.9.0-slashing-ux/5-queueUpgrade.s.sol
+++ /dev/null
@@ -1,264 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
-import {UpgradeProtocolRegistry} from "./3-upgradeProtocolRegistry.s.sol";
-import {DeployCoreContracts} from "./4-deployCoreContracts.s.sol";
-import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
-import {Encode, MultisigCall} from "zeus-templates/utils/Encode.sol";
-import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
-import {CoreUpgradeQueueBuilder} from "../CoreUpgradeQueueBuilder.sol";
-import {IProtocolRegistryTypes} from "src/contracts/interfaces/IProtocolRegistry.sol";
-import "../Env.sol";
-import "../TestUtils.sol";
-
-contract QueueUpgrade is DeployCoreContracts {
- using Env for *;
- using Encode for *;
- using CoreUpgradeQueueBuilder for MultisigCall[];
-
- function _runAsMultisig() internal virtual override prank(Env.opsMultisig()) {
- // Only execute on version 1.8.1
- if (!Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- 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()
- });
- }
-
- function _getCalldataToExecutor() internal returns (bytes memory) {
- MultisigCall[] storage executorCalls = Encode.newMultisigCalls();
-
- /// permissions
- executorCalls.upgradePermissionController();
- executorCalls.upgradeKeyRegistrar();
-
- /// core
- executorCalls.upgradeAllocationManager();
- executorCalls.upgradeAVSDirectory();
- executorCalls.upgradeDelegationManager();
- // protocol registry was deployed in the previous step
- executorCalls.upgradeReleaseManager();
- executorCalls.upgradeRewardsCoordinator();
- executorCalls.upgradeStrategyManager();
-
- /// pods
- executorCalls.upgradeEigenPodManager();
- executorCalls.upgradeEigenPod();
-
- /// strategies
- executorCalls.upgradeEigenStrategy();
- executorCalls.upgradeStrategyBase();
- executorCalls.upgradeStrategyBaseTVLLimits();
- executorCalls.upgradeStrategyFactory();
-
- /// multichain
- executorCalls.upgradeBN254CertificateVerifier();
- executorCalls.upgradeCrossChainRegistry();
- executorCalls.upgradeECDSACertificateVerifier();
- executorCalls.upgradeOperatorTableUpdater();
-
- /// avs
- executorCalls.upgradeTaskMailbox();
-
- // Add the protocol registry upgrade to the executor calls
- _appendProtocolRegistryUpgrade(executorCalls);
-
- // Lastly, add the protocol registry as a pauser to the pauser registry
- executorCalls.append({
- to: address(Env.impl.pauserRegistry()),
- data: abi.encodeWithSelector(
- PauserRegistry.setIsPauser.selector, address(Env.proxy.protocolRegistry()), true
- )
- });
-
- return Encode.gnosisSafe
- .execTransaction({
- from: address(Env.timelockController()),
- to: Env.multiSendCallOnly(),
- op: Encode.Operation.DelegateCall,
- data: Encode.multiSend(executorCalls)
- });
- }
-
- function _appendProtocolRegistryUpgrade(
- MultisigCall[] storage calls
- ) internal {
- // We want to add all addresses that are deployed to the protocol registry
- address[] memory addresses = new address[](22);
- IProtocolRegistryTypes.DeploymentConfig[] memory configs = new IProtocolRegistryTypes.DeploymentConfig[](22);
- string[] memory names = new string[](22);
-
- IProtocolRegistryTypes.DeploymentConfig memory pausableConfig =
- IProtocolRegistryTypes.DeploymentConfig({pausable: true, deprecated: false});
- IProtocolRegistryTypes.DeploymentConfig memory unpausableConfig =
- IProtocolRegistryTypes.DeploymentConfig({pausable: false, deprecated: false});
-
- /// permissions/
- addresses[0] = address(Env.impl.pauserRegistry());
- configs[0] = unpausableConfig;
- names[0] = type(PauserRegistry).name;
-
- addresses[1] = address(Env.proxy.permissionController());
- configs[1] = unpausableConfig;
- names[1] = type(PermissionController).name;
-
- addresses[2] = address(Env.proxy.keyRegistrar());
- configs[2] = unpausableConfig;
- names[2] = type(KeyRegistrar).name;
-
- /// core/
- addresses[3] = address(Env.proxy.allocationManager());
- configs[3] = pausableConfig;
- names[3] = type(AllocationManager).name;
-
- addresses[4] = address(Env.proxy.avsDirectory());
- configs[4] = pausableConfig;
- names[4] = type(AVSDirectory).name;
-
- addresses[5] = address(Env.proxy.delegationManager());
- configs[5] = pausableConfig;
- names[5] = type(DelegationManager).name;
-
- addresses[6] = address(Env.proxy.protocolRegistry());
- configs[6] = unpausableConfig;
- names[6] = type(ProtocolRegistry).name;
-
- addresses[7] = address(Env.proxy.releaseManager());
- configs[7] = unpausableConfig;
- names[7] = type(ReleaseManager).name;
-
- addresses[8] = address(Env.proxy.rewardsCoordinator());
- configs[8] = pausableConfig;
- names[8] = type(RewardsCoordinator).name;
-
- addresses[9] = address(Env.proxy.strategyManager());
- configs[9] = pausableConfig;
- names[9] = type(StrategyManager).name;
-
- /// pods/
- addresses[10] = address(Env.proxy.eigenPodManager());
- configs[10] = pausableConfig;
- names[10] = type(EigenPodManager).name;
-
- addresses[11] = address(Env.beacon.eigenPod());
- configs[11] = unpausableConfig;
- names[11] = type(EigenPod).name;
-
- /// strategies/
- addresses[12] = address(Env.proxy.eigenStrategy());
- configs[12] = pausableConfig;
- names[12] = type(EigenStrategy).name;
-
- addresses[13] = address(Env.beacon.strategyBase());
- configs[13] = unpausableConfig;
- names[13] = type(StrategyBase).name;
-
- addresses[14] = address(Env.proxy.strategyFactory());
- configs[14] = pausableConfig;
- names[14] = type(StrategyFactory).name;
-
- /// multichain/
- addresses[15] = address(Env.proxy.bn254CertificateVerifier());
- configs[15] = unpausableConfig;
- names[15] = type(BN254CertificateVerifier).name;
-
- addresses[16] = address(Env.proxy.crossChainRegistry());
- configs[16] = pausableConfig;
- names[16] = type(CrossChainRegistry).name;
-
- addresses[17] = address(Env.proxy.ecdsaCertificateVerifier());
- configs[17] = unpausableConfig;
- names[17] = type(ECDSACertificateVerifier).name;
-
- addresses[18] = address(Env.proxy.operatorTableUpdater());
- configs[18] = pausableConfig;
- names[18] = type(OperatorTableUpdater).name;
-
- /// avs/
- addresses[19] = address(Env.proxy.taskMailbox());
- configs[19] = unpausableConfig;
- names[19] = type(TaskMailbox).name;
-
- /// token
- addresses[20] = address(Env.proxy.beigen());
- configs[20] = unpausableConfig;
- names[20] = type(BackingEigen).name;
-
- addresses[21] = address(Env.proxy.eigen());
- configs[21] = unpausableConfig;
- names[21] = type(Eigen).name;
-
- // Append to the multisig calls
- calls.append({
- to: address(Env.proxy.protocolRegistry()),
- data: abi.encodeWithSelector(
- IProtocolRegistry.ship.selector, addresses, configs, names, Env.deployVersion()
- )
- });
-
- // Now, if we have any strategy base TVLLimits, we need to add them to the protocol registry
- uint256 count = Env.instance.strategyBaseTVLLimits_Count();
- if (count > 0) {
- address[] memory strategyAddresses = new address[](count);
- IProtocolRegistryTypes.DeploymentConfig[] memory strategyConfigs =
- new IProtocolRegistryTypes.DeploymentConfig[](count);
- string[] memory strategyNames = new string[](count);
- for (uint256 i = 0; i < count; i++) {
- strategyAddresses[i] = address(Env.instance.strategyBaseTVLLimits(i));
- strategyConfigs[i] = pausableConfig;
- strategyNames[i] = string.concat(type(StrategyBaseTVLLimits).name, "_", Strings.toString(i));
- }
-
- calls.append({
- to: address(Env.proxy.protocolRegistry()),
- data: abi.encodeWithSelector(
- IProtocolRegistry.ship.selector,
- strategyAddresses,
- strategyConfigs,
- strategyNames,
- Env.deployVersion()
- )
- });
- }
- }
-
- function testScript() public virtual override {
- if (!Env.isCoreProtocolDeployed() || !Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
- // Complete previous steps
- _completeProtocolRegistryUpgrade();
-
- // Deploy the core contracts
- super.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.9.0-slashing-ux/6-completeUpgrade.s.sol b/script/releases/v1.9.0-slashing-ux/6-completeUpgrade.s.sol
deleted file mode 100644
index 9304d30ade..0000000000
--- a/script/releases/v1.9.0-slashing-ux/6-completeUpgrade.s.sol
+++ /dev/null
@@ -1,76 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity ^0.8.12;
-
-import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
-import {QueueUpgrade} from "./5-queueUpgrade.s.sol";
-import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
-import {Encode, MultisigCall} from "zeus-templates/utils/Encode.sol";
-import "../Env.sol";
-import "../TestUtils.sol";
-
-contract ExecuteUpgrade is QueueUpgrade {
- using Env for *;
-
- function _runAsMultisig() internal virtual override prank(Env.protocolCouncilMultisig()) {
- // Only execute on version 1.8.1
- if (!Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
-
- 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 {
- if (!Env.isCoreProtocolDeployed() || !Env._strEq(Env.envVersion(), "1.8.1")) {
- return;
- }
- // Complete previous steps
- _completeProtocolRegistryUpgrade();
-
- // Deploy the core contracts
- super.runAsEOA();
-
- // Queue the upgrade
- 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.");
- QueueUpgrade._runAsMultisig();
- _unsafeResetHasPranked(); // reset hasPranked so we can use it again
-
- assertTrue(timelock.isOperationPending(txHash), "Transaction should be queued.");
- assertFalse(timelock.isOperationReady(txHash), "Transaction should NOT be ready for execution.");
- assertFalse(timelock.isOperationDone(txHash), "Transaction should NOT be complete.");
-
- // Warp Past delay
- vm.warp(block.timestamp + timelock.getMinDelay()); // 1 tick after ETA
- assertEq(timelock.isOperationReady(txHash), true, "Transaction should be executable.");
-
- // Execute
- execute();
-
- // Run Tests
- TestUtils.validateProxyAdmins();
- TestUtils.validateProxyConstructors();
- TestUtils.validateProxiesAlreadyInitialized();
- TestUtils.validateProxyStorage();
- TestUtils.validateImplAddressesMatchProxy();
- TestUtils.validateProtocolRegistry();
- }
-}
diff --git a/script/releases/v1.9.0-slashing-ux/7-script/go.mod b/script/releases/v1.9.0-slashing-ux/7-script/go.mod
deleted file mode 100644
index a12d440a3a..0000000000
--- a/script/releases/v1.9.0-slashing-ux/7-script/go.mod
+++ /dev/null
@@ -1,47 +0,0 @@
-module eigenlayer-migration-script
-
-go 1.21
-
-require (
- github.com/Layr-Labs/eigenlayer-contracts v0.0.0
- github.com/ethereum/go-ethereum v1.14.0
- github.com/joho/godotenv v1.5.1
-)
-
-require (
- github.com/Microsoft/go-winio v0.6.1 // indirect
- github.com/bits-and-blooms/bitset v1.13.0 // indirect
- github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect
- github.com/consensys/bavard v0.1.13 // indirect
- github.com/consensys/gnark-crypto v0.12.1 // indirect
- github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect
- github.com/deckarep/golang-set/v2 v2.5.0 // indirect
- github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
- github.com/ethereum/c-kzg-4844 v1.0.0 // indirect
- github.com/fsnotify/fsnotify v1.7.0 // indirect
- github.com/go-ole/go-ole v1.3.0 // indirect
- github.com/google/uuid v1.5.0 // indirect
- github.com/gorilla/websocket v1.5.1 // indirect
- github.com/holiman/uint256 v1.2.4 // indirect
- github.com/mitchellh/mapstructure v1.5.0 // indirect
- github.com/mmcloughlin/addchain v0.4.0 // indirect
- github.com/prometheus/client_golang v1.17.0 // indirect
- github.com/prometheus/client_model v0.5.0 // indirect
- github.com/prometheus/common v0.45.0 // indirect
- github.com/prometheus/procfs v0.12.0 // indirect
- github.com/shirou/gopsutil v3.21.11+incompatible // indirect
- github.com/supranational/blst v0.3.11 // indirect
- github.com/tklauser/go-sysconf v0.3.13 // indirect
- github.com/tklauser/numcpus v0.7.0 // indirect
- github.com/yusufpapurcu/wmi v1.2.3 // indirect
- golang.org/x/crypto v0.22.0 // indirect
- golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect
- golang.org/x/mod v0.17.0 // indirect
- golang.org/x/net v0.24.0 // indirect
- golang.org/x/sync v0.7.0 // indirect
- golang.org/x/sys v0.19.0 // indirect
- golang.org/x/tools v0.20.0 // indirect
- rsc.io/tmplfunc v0.0.3 // indirect
-)
-
-replace github.com/Layr-Labs/eigenlayer-contracts => ../../../../
diff --git a/script/releases/v1.9.0-slashing-ux/7-script/go.sum b/script/releases/v1.9.0-slashing-ux/7-script/go.sum
deleted file mode 100644
index b54498ff3b..0000000000
--- a/script/releases/v1.9.0-slashing-ux/7-script/go.sum
+++ /dev/null
@@ -1,192 +0,0 @@
-github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
-github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
-github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
-github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
-github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40=
-github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o=
-github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
-github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
-github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE=
-github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
-github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U=
-github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04=
-github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
-github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
-github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk=
-github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
-github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
-github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8=
-github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw=
-github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
-github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
-github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4=
-github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E=
-github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
-github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
-github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
-github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
-github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ=
-github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI=
-github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M=
-github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY=
-github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
-github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
-github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ=
-github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs=
-github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI=
-github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/deckarep/golang-set/v2 v2.5.0 h1:hn6cEZtQ0h3J8kFrHR/NrzyOoTnjgW1+FmNJzQ7y/sA=
-github.com/deckarep/golang-set/v2 v2.5.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
-github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y=
-github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
-github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs=
-github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
-github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA=
-github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0=
-github.com/ethereum/go-ethereum v1.14.0 h1:xRWC5NlB6g1x7vNy4HDBLuqVNbtLrc7v8S6+Uxim1LU=
-github.com/ethereum/go-ethereum v1.14.0/go.mod h1:1STrq471D0BQbCX9He0hUj4bHxX2k6mt5nOQJhDNOJ8=
-github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA=
-github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
-github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
-github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
-github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI=
-github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
-github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE=
-github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc=
-github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0=
-github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ=
-github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
-github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
-github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
-github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
-github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
-github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
-github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
-github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
-github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
-github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk=
-github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
-github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
-github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
-github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
-github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
-github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE=
-github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0=
-github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4=
-github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc=
-github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
-github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
-github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU=
-github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E=
-github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc=
-github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8=
-github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
-github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
-github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
-github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
-github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw=
-github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4=
-github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
-github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
-github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
-github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
-github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
-github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c=
-github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8=
-github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
-github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
-github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
-github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
-github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
-github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
-github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
-github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
-github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
-github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A=
-github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4=
-github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY=
-github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU=
-github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU=
-github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
-github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
-github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
-github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=
-github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY=
-github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
-github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
-github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=
-github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=
-github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
-github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
-github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
-github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
-github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
-github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
-github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
-github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
-github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
-github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
-github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
-github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA=
-github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg=
-github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
-github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
-github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4=
-github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw=
-github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
-github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
-github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4=
-github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0=
-github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4=
-github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY=
-github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8=
-github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U=
-github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs=
-github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
-github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
-github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
-github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
-github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
-golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
-golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
-golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=
-golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
-golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
-golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
-golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
-golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
-golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
-golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
-golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
-golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
-golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY=
-golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg=
-google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
-google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
-gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
-gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
-gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
-gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
-gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU=
-rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA=
diff --git a/script/releases/v1.9.0-slashing-ux/7-script/script.go b/script/releases/v1.9.0-slashing-ux/7-script/script.go
deleted file mode 100644
index 0fc0c52d45..0000000000
--- a/script/releases/v1.9.0-slashing-ux/7-script/script.go
+++ /dev/null
@@ -1,234 +0,0 @@
-package main
-
-import (
- "context"
- "encoding/json"
- "fmt"
- "io"
- "net/http"
- "os"
- "strings"
- "time"
-
- allocationmanager "github.com/Layr-Labs/eigenlayer-contracts/pkg/bindings/AllocationManager"
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/crypto"
- "github.com/ethereum/go-ethereum/ethclient"
-)
-
-// SidecarOperatorSet represents the JSON response from the sidecar API
-type SidecarOperatorSet struct {
- AVS string `json:"avs"`
- ID uint32 `json:"operatorSetId"`
-}
-
-// SidecarResponse represents the full response from the sidecar API
-type SidecarResponse struct {
- OperatorSets []SidecarOperatorSet `json:"operatorSets"`
-}
-
-type ScriptArgs struct {
- SidecarURL string
- AllocationManagerAddr string
- RPCEndpoint string
- PrivateKey string
-}
-
-func main() {
- // Get environment variables
- args := ScriptArgs{
- SidecarURL: os.Getenv("SIDECAR_URL"),
- AllocationManagerAddr: os.Getenv("ZEUS_DEPLOYED_AllocationManager_Proxy"),
- RPCEndpoint: os.Getenv("RPC_URL"),
- PrivateKey: os.Getenv("PRIVATE_KEY"),
- }
-
- // Validate required environment variables
- if args.SidecarURL == "" {
- fmt.Println("Error: SIDECAR_URL environment variable is required")
- os.Exit(1)
- }
- if args.AllocationManagerAddr == "" {
- fmt.Println("Error: ZEUS_DEPLOYED_AllocationManager_Proxy environment variable is required")
- os.Exit(1)
- }
- if args.RPCEndpoint == "" {
- fmt.Println("Error: RPC_URL environment variable is required")
- os.Exit(1)
- }
- if args.PrivateKey == "" {
- fmt.Println("Error: PRIVATE_KEY environment variable is required")
- os.Exit(1)
- }
-
- err := runScript(args)
- if err != nil {
- fmt.Printf("Error: %v\n", err)
- os.Exit(1)
- }
-}
-
-func runScript(args ScriptArgs) error {
- // 1. Fetch operator sets from sidecar API
- operatorSets, err := fetchOperatorSets(args.SidecarURL)
- if err != nil {
- return fmt.Errorf("failed to fetch operator sets: %v", err)
- }
-
- fmt.Printf("Fetched %d operator sets from sidecar API\n", len(operatorSets))
-
- // If no operator sets, nothing to do
- if len(operatorSets) == 0 {
- fmt.Println("No operator sets to migrate")
- return nil
- }
-
- // 2. Convert to contract format
- operatorSetsToCall := convertToContractFormat(operatorSets)
-
- // 3. Process in batches of 20
- const batchSize = 20
- totalBatches := (len(operatorSetsToCall) + batchSize - 1) / batchSize
-
- fmt.Printf("Processing %d operator sets in %d batches of up to %d each\n", len(operatorSetsToCall), totalBatches, batchSize)
-
- for i := 0; i < len(operatorSetsToCall); i += batchSize {
- end := i + batchSize
- if end > len(operatorSetsToCall) {
- end = len(operatorSetsToCall)
- }
-
- batch := operatorSetsToCall[i:end]
- batchNum := i/batchSize + 1
-
- fmt.Printf("\n--- Processing batch %d/%d (%d operator sets) ---\n", batchNum, totalBatches, len(batch))
-
- err = callMigrateSlashers(args, batch)
- if err != nil {
- return fmt.Errorf("failed to process batch %d: %v", batchNum, err)
- }
-
- // Add a delay
- if end < len(operatorSetsToCall) {
- fmt.Println("Waiting before next batch...")
- time.Sleep(2 * time.Second)
- }
- }
-
- fmt.Printf("\n✅ Successfully migrated all %d operator sets in %d batches\n", len(operatorSetsToCall), totalBatches)
-
- return nil
-}
-
-func fetchOperatorSets(sidecarURL string) ([]SidecarOperatorSet, error) {
- // Make HTTP request to sidecar API
- url := fmt.Sprintf("%s/v1/operatorSets", strings.TrimRight(sidecarURL, "/"))
-
- fmt.Printf("Fetching operator sets from %s\n", url)
-
- req, err := http.NewRequest("GET", url, nil)
- if err != nil {
- return nil, fmt.Errorf("failed to create request: %v", err)
- }
- req.Header.Set("Accept", "application/json")
-
- client := &http.Client{}
- resp, err := client.Do(req)
- if err != nil {
- return nil, fmt.Errorf("failed to make request: %v", err)
- }
- defer resp.Body.Close()
-
- if resp.StatusCode != http.StatusOK {
- body, _ := io.ReadAll(resp.Body)
- return nil, fmt.Errorf("unexpected status code %d: %s", resp.StatusCode, string(body))
- }
-
- // Parse response
- body, err := io.ReadAll(resp.Body)
- if err != nil {
- return nil, fmt.Errorf("failed to read response body: %v", err)
- }
-
- var response SidecarResponse
- err = json.Unmarshal(body, &response)
- if err != nil {
- return nil, fmt.Errorf("failed to parse JSON response: %v", err)
- }
-
- return response.OperatorSets, nil
-}
-
-func convertToContractFormat(sidecarSets []SidecarOperatorSet) []allocationmanager.OperatorSet {
- contractSets := make([]allocationmanager.OperatorSet, len(sidecarSets))
-
- for i, set := range sidecarSets {
- contractSets[i] = allocationmanager.OperatorSet{
- Avs: common.HexToAddress(set.AVS),
- Id: set.ID,
- }
- }
-
- return contractSets
-}
-
-func callMigrateSlashers(args ScriptArgs, operatorSets []allocationmanager.OperatorSet) error {
- // Connect to Ethereum client
- client, err := ethclient.Dial(args.RPCEndpoint)
- if err != nil {
- return fmt.Errorf("failed to connect to Ethereum client: %v", err)
- }
-
- // Parse private key
- privateKey, err := crypto.HexToECDSA(strings.TrimPrefix(args.PrivateKey, "0x"))
- if err != nil {
- return fmt.Errorf("failed to parse private key: %v", err)
- }
-
- // Get chain ID
- chainID, err := client.ChainID(context.Background())
- if err != nil {
- return fmt.Errorf("failed to get chain ID: %v", err)
- }
-
- // Create auth transactor
- auth, err := bind.NewKeyedTransactorWithChainID(privateKey, chainID)
- if err != nil {
- return fmt.Errorf("failed to create transactor: %v", err)
- }
-
- // Create AllocationManager instance
- allocationManager, err := allocationmanager.NewAllocationManager(common.HexToAddress(args.AllocationManagerAddr), client)
- if err != nil {
- return fmt.Errorf("failed to create AllocationManager instance: %v", err)
- }
-
- // Call migrateSlashers
- fmt.Printf("Calling migrateSlashers with %d operator sets:\n", len(operatorSets))
- for idx, opSet := range operatorSets {
- fmt.Printf(" [%d] AVS: %s, ID: %d\n", idx+1, opSet.Avs.Hex(), opSet.Id)
- }
-
- tx, err := allocationManager.MigrateSlashers(auth, operatorSets)
- if err != nil {
- return fmt.Errorf("failed to call migrateSlashers: %v", err)
- }
-
- fmt.Printf("Transaction sent! Hash: %s\n", tx.Hash().Hex())
-
- // Wait for transaction receipt
- fmt.Println("Waiting for transaction to be mined...")
- receipt, err := bind.WaitMined(context.Background(), client, tx)
- if err != nil {
- return fmt.Errorf("failed to wait for transaction: %v", err)
- }
-
- if receipt.Status == 0 {
- return fmt.Errorf("transaction failed")
- }
-
- fmt.Printf("Transaction mined! Block: %d, Gas used: %d\n", receipt.BlockNumber.Uint64(), receipt.GasUsed)
-
- return nil
-}
diff --git a/script/releases/v1.9.0-slashing-ux/7-script/script_test.go b/script/releases/v1.9.0-slashing-ux/7-script/script_test.go
deleted file mode 100644
index c0cad26a32..0000000000
--- a/script/releases/v1.9.0-slashing-ux/7-script/script_test.go
+++ /dev/null
@@ -1,213 +0,0 @@
-package main
-
-import (
- "encoding/json"
- "net/http"
- "net/http/httptest"
- "os"
- "testing"
-
- "github.com/ethereum/go-ethereum/common"
- "github.com/joho/godotenv"
-)
-
-func TestFetchOperatorSets(t *testing.T) {
- // Create a test server that returns mock operator sets
- mockResponse := SidecarResponse{
- OperatorSets: []SidecarOperatorSet{
- {
- AVS: "0x1234567890123456789012345678901234567890",
- ID: 1,
- },
- {
- AVS: "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd",
- ID: 2,
- },
- },
- }
-
- server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if r.URL.Path != "/v1/operatorSets" {
- t.Errorf("Expected path /v1/operatorSets, got %s", r.URL.Path)
- }
- if r.Header.Get("Accept") != "application/json" {
- t.Errorf("Expected Accept header application/json, got %s", r.Header.Get("Accept"))
- }
-
- w.Header().Set("Content-Type", "application/json")
- json.NewEncoder(w).Encode(mockResponse)
- }))
- defer server.Close()
-
- // Test fetchOperatorSets
- operatorSets, err := fetchOperatorSets(server.URL)
- if err != nil {
- t.Fatalf("fetchOperatorSets failed: %v", err)
- }
-
- if len(operatorSets) != 2 {
- t.Errorf("Expected 2 operator sets, got %d", len(operatorSets))
- }
-
- if operatorSets[0].AVS != mockResponse.OperatorSets[0].AVS {
- t.Errorf("Expected AVS %s, got %s", mockResponse.OperatorSets[0].AVS, operatorSets[0].AVS)
- }
-
- if operatorSets[1].ID != mockResponse.OperatorSets[1].ID {
- t.Errorf("Expected ID %d, got %d", mockResponse.OperatorSets[1].ID, operatorSets[1].ID)
- }
-}
-
-func TestConvertToContractFormat(t *testing.T) {
- sidecarSets := []SidecarOperatorSet{
- {
- AVS: "0x1234567890123456789012345678901234567890",
- ID: 1,
- },
- {
- AVS: "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd",
- ID: 2,
- },
- }
-
- contractSets := convertToContractFormat(sidecarSets)
-
- if len(contractSets) != 2 {
- t.Errorf("Expected 2 contract sets, got %d", len(contractSets))
- }
-
- expectedAVS1 := common.HexToAddress("0x1234567890123456789012345678901234567890")
- if contractSets[0].Avs != expectedAVS1 {
- t.Errorf("Expected AVS %s, got %s", expectedAVS1.Hex(), contractSets[0].Avs.Hex())
- }
-
- if contractSets[1].Id != 2 {
- t.Errorf("Expected ID 2, got %d", contractSets[1].Id)
- }
-}
-
-func TestFetchAndConvert(t *testing.T) {
- // Create a test server
- mockResponse := SidecarResponse{
- OperatorSets: []SidecarOperatorSet{
- {
- AVS: "0x1234567890123456789012345678901234567890",
- ID: 1,
- },
- },
- }
-
- server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- w.Header().Set("Content-Type", "application/json")
- json.NewEncoder(w).Encode(mockResponse)
- }))
- defer server.Close()
-
- // Test fetching and converting operator sets
- operatorSets, err := fetchOperatorSets(server.URL)
- if err != nil {
- t.Fatalf("fetchOperatorSets failed: %v", err)
- }
-
- if len(operatorSets) != 1 {
- t.Errorf("Expected 1 operator set, got %d", len(operatorSets))
- }
-
- // Test conversion
- contractSets := convertToContractFormat(operatorSets)
- if len(contractSets) != 1 {
- t.Errorf("Expected 1 contract set, got %d", len(contractSets))
- }
-
- expectedAVS := common.HexToAddress("0x1234567890123456789012345678901234567890")
- if contractSets[0].Avs != expectedAVS {
- t.Errorf("Expected AVS %s, got %s", expectedAVS.Hex(), contractSets[0].Avs.Hex())
- }
-}
-
-func TestMainFunctionWithEnv(t *testing.T) {
- // Skip this test if we're in CI or don't have a .env file
- if _, err := os.Stat(".env"); os.IsNotExist(err) {
- t.Skip("Skipping test that requires .env file")
- }
-
- // Load .env file
- err := godotenv.Load()
- if err != nil {
- t.Fatalf("Error loading .env file: %v", err)
- }
-
- // Check if SIDECAR_URL is set
- sidecarURL := os.Getenv("SIDECAR_URL")
- if sidecarURL == "" {
- t.Skip("SIDECAR_URL not set in .env file")
- }
-
- // Test fetching real operator sets
- operatorSets, err := fetchOperatorSets(sidecarURL)
- if err != nil {
- t.Logf("Warning: Failed to fetch operator sets from %s: %v", sidecarURL, err)
- // Don't fail the test, as the API might be down or require auth
- return
- }
-
- t.Logf("Successfully fetched %d operator sets from %s", len(operatorSets), sidecarURL)
-
- // Log first few operator sets for debugging
- for i := 0; i < len(operatorSets) && i < 3; i++ {
- t.Logf(" OperatorSet %d: AVS=%s, ID=%d", i, operatorSets[i].AVS, operatorSets[i].ID)
- }
-}
-
-func TestErrorHandling(t *testing.T) {
- // Test with server that returns error
- server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- w.WriteHeader(http.StatusInternalServerError)
- w.Write([]byte("Internal Server Error"))
- }))
- defer server.Close()
-
- _, err := fetchOperatorSets(server.URL)
- if err == nil {
- t.Error("Expected error for 500 response, got nil")
- }
-
- // Test with invalid JSON
- server2 := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- w.Header().Set("Content-Type", "application/json")
- w.Write([]byte("invalid json"))
- }))
- defer server2.Close()
-
- _, err = fetchOperatorSets(server2.URL)
- if err == nil {
- t.Error("Expected error for invalid JSON, got nil")
- }
-}
-
-func TestBatching(t *testing.T) {
- // Test that batching logic correctly splits operator sets
- testCases := []struct {
- totalSets int
- expectedBatches int
- }{
- {0, 0},
- {1, 1},
- {20, 1},
- {21, 2},
- {40, 2},
- {41, 3},
- {100, 5},
- }
-
- const batchSize = 20
- for _, tc := range testCases {
- actualBatches := (tc.totalSets + batchSize - 1) / batchSize
- if tc.totalSets == 0 {
- actualBatches = 0
- }
- if actualBatches != tc.expectedBatches {
- t.Errorf("For %d sets, expected %d batches, got %d", tc.totalSets, tc.expectedBatches, actualBatches)
- }
- }
-}
diff --git a/script/releases/v1.9.0-slashing-ux/7-script/start.sh b/script/releases/v1.9.0-slashing-ux/7-script/start.sh
deleted file mode 100755
index 58eb73ce9c..0000000000
--- a/script/releases/v1.9.0-slashing-ux/7-script/start.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-cd script/releases/v1.9.0-slashing-ux/7-script
-go run script.go
\ No newline at end of file
diff --git a/script/releases/v1.9.0-slashing-ux/upgrade.json b/script/releases/v1.9.0-slashing-ux/upgrade.json
deleted file mode 100644
index 86ac5a953d..0000000000
--- a/script/releases/v1.9.0-slashing-ux/upgrade.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "name": "slashing-ux-improvements",
- "from": ">=1.8.0",
- "to": "1.9.0",
- "phases": [
- {
- "type": "multisig",
- "filename": "1-deployProtocolRegistryProxy.s.sol"
- },
- {
- "type": "eoa",
- "filename": "2-deployProtocolRegistryImpl.s.sol"
- },
- {
- "type": "multisig",
- "filename": "3-upgradeProtocolRegistry.s.sol"
- },
- {
- "type": "eoa",
- "filename": "4-deployCoreContracts.s.sol"
- },
- {
- "type": "multisig",
- "filename": "5-queueUpgrade.s.sol"
- },
- {
- "type": "multisig",
- "filename": "6-completeUpgrade.s.sol"
- },
- {
- "type": "script",
- "filename": "7-script/start.sh",
- "arguments": [
- {
- "type": "url",
- "passBy": "env",
- "inputType": "text",
- "name": "SIDECAR_URL",
- "prompt": "Enter an Sidecar URL"
- },
- {
- "type": "url",
- "passBy": "env",
- "inputType": "text",
- "name": "RPC_URL",
- "prompt": "Enter an RPC URL"
- },
- {
- "type": "privateKey",
- "passBy": "env",
- "inputType": "password",
- "name": "PRIVATE_KEY",
- "prompt": "Enter an ETH wallet private key to migrate from"
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/script/utils/ExistingDeploymentParser.sol b/script/utils/ExistingDeploymentParser.sol
index 8485bcedd0..23c4b843ee 100644
--- a/script/utils/ExistingDeploymentParser.sol
+++ b/script/utils/ExistingDeploymentParser.sol
@@ -16,6 +16,7 @@ import "../../src/contracts/permissions/PermissionController.sol";
import "../../src/contracts/strategies/StrategyFactory.sol";
import "../../src/contracts/strategies/StrategyBase.sol";
import "../../src/contracts/strategies/StrategyBaseTVLLimits.sol";
+import "../../src/contracts/strategies/DurationVaultStrategy.sol";
import "../../src/contracts/strategies/EigenStrategy.sol";
import "../../src/contracts/pods/EigenPod.sol";
@@ -31,6 +32,9 @@ import "../../src/test/mocks/EmptyContract.sol";
import "../../src/contracts/interfaces/IBackingEigen.sol";
import "../../src/contracts/interfaces/IEigen.sol";
+// contracts
+import "../../src/contracts/core/EmissionsController.sol";
+
import "forge-std/Script.sol";
import "src/test/utils/Logger.t.sol";
@@ -95,6 +99,12 @@ contract ExistingDeploymentParser is Script, Logger {
uint256 STRATEGY_MAX_PER_DEPOSIT;
uint256 STRATEGY_MAX_TOTAL_DEPOSITS;
+ /// @dev EmissionsController
+ uint256 EMISSIONS_CONTROLLER_INFLATION_RATE;
+ uint256 EMISSIONS_CONTROLLER_START_TIME;
+ uint256 EMISSIONS_CONTROLLER_EPOCH_LENGTH;
+ address EMISSIONS_CONTROLLER_INCENTIVE_COUNCIL;
+
/// -----------------------------------------------------------------------
/// EigenLayer Contracts
/// -----------------------------------------------------------------------
@@ -103,6 +113,7 @@ contract ExistingDeploymentParser is Script, Logger {
PauserRegistry public eigenLayerPauserReg;
UpgradeableBeacon public eigenPodBeacon;
UpgradeableBeacon public strategyBeacon;
+ UpgradeableBeacon public durationVaultBeacon;
/// @dev AllocationManager
IAllocationManager public allocationManager;
@@ -138,6 +149,7 @@ contract ExistingDeploymentParser is Script, Logger {
StrategyFactory public strategyFactory;
StrategyFactory public strategyFactoryImplementation;
StrategyBase public baseStrategyImplementation;
+ DurationVaultStrategy public durationVaultImplementation;
StrategyBase public strategyFactoryBeaconImplementation;
// Token
@@ -153,6 +165,10 @@ contract ExistingDeploymentParser is Script, Logger {
KeyRegistrar public keyRegistrar;
KeyRegistrar public keyRegistrarImplementation;
+ /// @dev EmissionsController
+ EmissionsController public emissionsController;
+ EmissionsController public emissionsControllerImplementation;
+
/// -----------------------------------------------------------------------
/// Storage
/// -----------------------------------------------------------------------
@@ -522,7 +538,8 @@ contract ExistingDeploymentParser is Script, Logger {
0, // initialPausedStatus
address(0), // rewardsUpdater
0, // activationDelay
- 0 // defaultSplitBips
+ 0, // defaultSplitBips
+ address(0) // feeRecipient
);
// DelegationManager
cheats.expectRevert(bytes("Initializable: contract is already initialized"));
diff --git a/snapshots/Integration_ALM_Multi.json b/snapshots/Integration_ALM_Multi.json
deleted file mode 100644
index a2c3359a1a..0000000000
--- a/snapshots/Integration_ALM_Multi.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "gasUsed": "47579"
-}
\ No newline at end of file
diff --git a/src/contracts/core/EmissionsController.sol b/src/contracts/core/EmissionsController.sol
new file mode 100644
index 0000000000..b6ed5cc705
--- /dev/null
+++ b/src/contracts/core/EmissionsController.sol
@@ -0,0 +1,481 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
+import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
+import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol";
+import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
+import "../libraries/OperatorSetLib.sol";
+import "../permissions/Pausable.sol";
+import "./storage/EmissionsControllerStorage.sol";
+
+contract EmissionsController is
+ Initializable,
+ OwnableUpgradeable,
+ Pausable,
+ ReentrancyGuardUpgradeable,
+ EmissionsControllerStorage
+{
+ using SafeERC20 for IERC20;
+
+ /// @dev Modifier that checks if the caller is the incentive council.
+ modifier onlyIncentiveCouncil() {
+ _checkOnlyIncentiveCouncil();
+ _;
+ }
+
+ /// -----------------------------------------------------------------------
+ /// Initialization
+ /// -----------------------------------------------------------------------
+ constructor(
+ IEigen eigen,
+ IBackingEigen backingEigen,
+ IAllocationManager allocationManager,
+ IRewardsCoordinator rewardsCoordinator,
+ IPauserRegistry pauserRegistry,
+ uint256 inflationRate,
+ uint256 startTime,
+ uint256 cooldownSeconds,
+ uint256 calculationIntervalSeconds
+ )
+ EmissionsControllerStorage(
+ eigen,
+ backingEigen,
+ allocationManager,
+ rewardsCoordinator,
+ inflationRate,
+ startTime,
+ cooldownSeconds,
+ calculationIntervalSeconds
+ )
+ Pausable(pauserRegistry)
+ {
+ _disableInitializers();
+ }
+
+ /// @inheritdoc IEmissionsController
+ function initialize(
+ address initialOwner,
+ address initialIncentiveCouncil,
+ uint256 initialPausedStatus
+ ) external override initializer {
+ // Set the initial owner.
+ _transferOwnership(initialOwner);
+ // Set the initial incentive council.
+ _setIncentiveCouncil(initialIncentiveCouncil);
+ // Set the initial paused status.
+ _setPausedStatus(initialPausedStatus);
+ }
+
+ /// -----------------------------------------------------------------------
+ /// Permissionless Trigger
+ /// -----------------------------------------------------------------------
+
+ /// @inheritdoc IEmissionsController
+ function sweep() external override nonReentrant onlyWhenNotPaused(PAUSED_TOKEN_FLOWS) {
+ uint256 amount = EIGEN.balanceOf(address(this));
+ if (!isButtonPressable() && amount != 0) {
+ IERC20(EIGEN).safeTransfer(incentiveCouncil, amount);
+ emit Swept(incentiveCouncil, amount);
+ }
+ }
+
+ /// @inheritdoc IEmissionsController
+ function pressButton(
+ uint256 length
+ ) external override nonReentrant onlyWhenNotPaused(PAUSED_TOKEN_FLOWS) {
+ uint256 currentEpoch = getCurrentEpoch();
+
+ // Check if emissions have not started yet.
+ // Prevents minting EIGEN before the first epoch has started.
+ require(currentEpoch != type(uint256).max, EmissionsNotStarted());
+
+ uint256 totalProcessable = getTotalProcessableDistributions();
+ uint256 nextDistributionId = _epochs[currentEpoch].totalProcessed;
+
+ // Check if all distributions have already been processed.
+ require(nextDistributionId < totalProcessable, AllDistributionsProcessed());
+
+ // Mint the total amount of bEIGEN/EIGEN needed for all distributions.
+ if (!_epochs[currentEpoch].minted) {
+ // NOTE: Approvals may not be entirely spent.
+
+ // Max approve EIGEN for spending bEIGEN.
+ BACKING_EIGEN.approve(address(EIGEN), EMISSIONS_INFLATION_RATE);
+ // Max approve RewardsCoordinator for spending EIGEN.
+ EIGEN.approve(address(REWARDS_COORDINATOR), EMISSIONS_INFLATION_RATE);
+
+ // First mint the bEIGEN in order to wrap it into EIGEN.
+ BACKING_EIGEN.mint(address(this), EMISSIONS_INFLATION_RATE);
+ // Then wrap it into EIGEN.
+ EIGEN.wrap(EMISSIONS_INFLATION_RATE);
+
+ // Mark the epoch as minted.
+ _epochs[currentEpoch].minted = true;
+ }
+
+ // Calculate the start timestamp for the distribution (equivalent to `lastTimeButtonPressable()`).
+ uint256 startTimestamp = EMISSIONS_START_TIME + EMISSIONS_EPOCH_LENGTH * currentEpoch;
+ // Calculate the last index to process.
+ uint256 lastIndex = nextDistributionId + length;
+
+ // If length exceeds total distributions, set last index to total distributions (exclusive upper bound).
+ if (lastIndex > totalProcessable) lastIndex = totalProcessable;
+
+ // Process distributions starting from the next one to process...
+ for (uint256 distributionId = nextDistributionId; distributionId < lastIndex; ++distributionId) {
+ Distribution memory distribution = _distributions[distributionId];
+
+ // Skip disabled distributions...
+ if (distribution.distributionType == DistributionType.Disabled) continue;
+ // Skip distributions that haven't started yet...
+ if (distribution.startEpoch > currentEpoch) continue;
+ // Skip distributions that have ended (0 means infinite)...
+ if (distribution.totalEpochs != 0) {
+ if (currentEpoch >= distribution.startEpoch + distribution.totalEpochs) continue;
+ }
+
+ _processDistribution({
+ distribution: distribution,
+ distributionId: distributionId,
+ currentEpoch: currentEpoch,
+ startTimestamp: startTimestamp
+ });
+ }
+
+ // Update total processed count for this epoch.
+ _epochs[currentEpoch].totalProcessed = uint64(lastIndex);
+ }
+
+ /// @dev Internal helper that processes a distribution.
+ /// @param distributionId The id of the distribution to process.
+ /// @param currentEpoch The current epoch.
+ /// @param distribution The distribution (from storage).
+ function _processDistribution(
+ Distribution memory distribution,
+ uint256 distributionId,
+ uint256 currentEpoch,
+ uint256 startTimestamp
+ ) internal {
+ // Calculate the total amount of emissions for the distribution.
+ uint256 totalAmount = EMISSIONS_INFLATION_RATE * distribution.weight / MAX_TOTAL_WEIGHT;
+ // Success flag for the distribution.
+ bool success;
+
+ // Skip if the total amount is 0.
+ if (totalAmount == 0) return;
+
+ if (distribution.distributionType != DistributionType.Manual) {
+ uint256 strategiesAndMultipliersLength = distribution.strategiesAndMultipliers.length;
+
+ // Skip cases where the below `amountPerSubmission` calculation would revert.
+ if (strategiesAndMultipliersLength > totalAmount) return;
+
+ // Calculate the amount per submission.
+ uint256 amountPerSubmission = totalAmount / strategiesAndMultipliersLength;
+
+ // Update the rewards submissions start timestamp, duration, and amount.
+ IRewardsCoordinator.RewardsSubmission[] memory rewardsSubmissions =
+ new IRewardsCoordinator.RewardsSubmission[](strategiesAndMultipliersLength);
+ for (uint256 i = 0; i < rewardsSubmissions.length; ++i) {
+ rewardsSubmissions[i] = IRewardsCoordinatorTypes.RewardsSubmission({
+ strategiesAndMultipliers: distribution.strategiesAndMultipliers[i],
+ token: EIGEN,
+ amount: amountPerSubmission,
+ startTimestamp: uint32(startTimestamp),
+ duration: uint32(EMISSIONS_EPOCH_LENGTH)
+ });
+ }
+
+ // Dispatch the `RewardsCoordinator` call based on the distribution type.
+ if (distribution.distributionType == DistributionType.RewardsForAllEarners) {
+ success = _tryCallRewardsCoordinator(
+ abi.encodeCall(IRewardsCoordinator.createRewardsForAllEarners, (rewardsSubmissions))
+ );
+ } else if (distribution.distributionType == DistributionType.OperatorSetUniqueStake) {
+ success = _tryCallRewardsCoordinator(
+ abi.encodeCall(
+ IRewardsCoordinator.createUniqueStakeRewardsSubmission,
+ (distribution.operatorSet, rewardsSubmissions)
+ )
+ );
+ } else if (distribution.distributionType == DistributionType.OperatorSetTotalStake) {
+ success = _tryCallRewardsCoordinator(
+ abi.encodeCall(
+ IRewardsCoordinator.createTotalStakeRewardsSubmission,
+ (distribution.operatorSet, rewardsSubmissions)
+ )
+ );
+ } else if (distribution.distributionType == DistributionType.EigenDA) {
+ success = _tryCallRewardsCoordinator(
+ abi.encodeCall(
+ IRewardsCoordinator.createEigenDARewardsSubmission,
+ (distribution.operatorSet.avs, rewardsSubmissions)
+ )
+ );
+ }
+ } else {
+ (success,) =
+ address(EIGEN).call(abi.encodeWithSelector(IERC20.transfer.selector, incentiveCouncil, totalAmount));
+ }
+
+ // Emit an event for the processed distribution.
+ emit DistributionProcessed(distributionId, currentEpoch, distribution, success);
+ }
+
+ /// @dev Internal helper that try/calls the RewardsCoordinator returning success or failure.
+ /// This is needed as using try/catch requires decoding the calldata, which can revert preventing further distributions.
+ /// Also checks for reentrancy attacks by verifying the return data is not the reentrancy error thrown by OZ 4.9.0 ReentrancyGuard.
+ /// Also checks for OOG (Out Of Gas) panics by verifying the return data is not empty.
+ /// @param abiEncodedCall The ABI encoded call to the RewardsCoordinator.
+ /// @return success True if the function call was successful, false otherwise.
+ function _tryCallRewardsCoordinator(
+ bytes memory abiEncodedCall
+ ) internal returns (bool success) {
+ bytes memory returnData;
+ (success, returnData) = address(REWARDS_COORDINATOR).call(abiEncodedCall);
+ if (!success) require(!_isDisallowedError(returnData), MaliciousCallDetected());
+ }
+
+ /// @dev Internal helper that checks if the error is a disallowed error (reentrancy or OOG).
+ /// @param returnData The return data from the failed call.
+ /// @return True if the error is disallowed, false otherwise.
+ function _isDisallowedError(
+ bytes memory returnData
+ ) internal pure returns (bool) {
+ if (keccak256(returnData) == REENTRANCY_ERROR_HASH) return true; // prevent reentrancy attacks
+ if (returnData.length == 0) return true; // prevent OOG errors
+ return false;
+ }
+
+ /// -----------------------------------------------------------------------
+ /// Owner Functions
+ /// -----------------------------------------------------------------------
+
+ /// @inheritdoc IEmissionsController
+ function setIncentiveCouncil(
+ address newIncentiveCouncil
+ ) external override onlyOwner {
+ _setIncentiveCouncil(newIncentiveCouncil);
+ }
+
+ /// @dev Internal helper to set the incentive council.
+ function _setIncentiveCouncil(
+ address newIncentiveCouncil
+ ) internal {
+ // Check that new incentive council is not the zero address to prevent lost funds.
+ require(newIncentiveCouncil != address(0), InputAddressZero());
+ // Set the new incentive council.
+ incentiveCouncil = newIncentiveCouncil;
+ // Emit an event for the updated incentive council.
+ emit IncentiveCouncilUpdated(newIncentiveCouncil);
+ }
+
+ /// -----------------------------------------------------------------------
+ /// Incentive Council Functions
+ /// -----------------------------------------------------------------------
+
+ /// @inheritdoc IEmissionsController
+ function addDistribution(
+ Distribution calldata distribution
+ ) external override onlyIncentiveCouncil returns (uint256 distributionId) {
+ // Checks
+
+ uint256 currentEpoch = getCurrentEpoch();
+
+ // Check if the distribution is disabled.
+ require(distribution.distributionType != DistributionType.Disabled, CannotAddDisabledDistribution());
+
+ // Can only add/update distributions if all distributions have been processed for the current epoch.
+ // Prevents pending weight changes from affecting the current epoch.
+ _checkAllDistributionsProcessed(currentEpoch);
+
+ uint256 totalWeightBefore = totalWeight;
+
+ // Asserts the following:
+ // - The start epoch is in the future.
+ // - The total weight of all distributions does not exceed the max total weight.
+ _checkDistribution(distribution, currentEpoch, totalWeightBefore);
+
+ // Effects
+
+ // Increment the total added count for the current epoch.
+ ++_epochs[currentEpoch].totalAdded;
+
+ // Update return value to the next available distribution id.
+ // Use the current length of the distributions array as the new id.
+ distributionId = _distributions.length;
+
+ // Update the total weight.
+ totalWeight = uint16(totalWeightBefore + distribution.weight);
+ // Append the distribution to the distributions array.
+ _distributions.push(distribution);
+ // Emit an event for the new distribution.
+ emit DistributionAdded(distributionId, currentEpoch, distribution);
+ }
+
+ /// @inheritdoc IEmissionsController
+ function updateDistribution(
+ uint256 distributionId,
+ Distribution calldata distribution
+ ) external override onlyIncentiveCouncil {
+ // Checks
+
+ uint256 currentEpoch = getCurrentEpoch();
+ uint256 totalWeightBefore = totalWeight;
+ uint256 weight = _distributions[distributionId].weight;
+
+ // Can only add/update distributions if all distributions have been processed for the current epoch.
+ // Prevents pending weight changes from affecting the current epoch.
+ _checkAllDistributionsProcessed(currentEpoch);
+
+ // Asserts the following:
+ // - The start epoch is in the future.
+ // - The total weight of all distributions does not exceed the max total weight.
+ _checkDistribution(distribution, currentEpoch, totalWeightBefore - weight);
+
+ // Effects
+
+ // Update the pending total weight (will be committed when pressButton starts a new epoch).
+ totalWeight = uint16(totalWeightBefore - weight + distribution.weight);
+ // Update the distribution in the distributions array.
+ _distributions[distributionId] = distribution;
+ // Emit an event for the updated distribution.
+ emit DistributionUpdated(distributionId, currentEpoch, distribution);
+ }
+
+ /// -----------------------------------------------------------------------
+ /// Internal Helpers
+ /// -----------------------------------------------------------------------
+
+ function _checkOnlyIncentiveCouncil() internal view {
+ // Check if the caller is the incentive council.
+ require(msg.sender == incentiveCouncil, CallerIsNotIncentiveCouncil());
+ }
+
+ function _checkAllDistributionsProcessed(
+ uint256 currentEpoch
+ ) internal view {
+ // Check if all distributions have been processed for the current epoch.
+ require(!_isButtonPressable(currentEpoch), AllDistributionsMustBeProcessed());
+ }
+
+ function _checkDistribution(
+ Distribution calldata distribution,
+ uint256 currentEpoch,
+ uint256 totalWeightBefore
+ ) internal view {
+ // Check if the operator set is registered (for OperatorSetTotalStake or OperatorSetUniqueStake distributions).
+ if (
+ distribution.distributionType == DistributionType.OperatorSetTotalStake
+ || distribution.distributionType == DistributionType.OperatorSetUniqueStake
+ ) {
+ require(ALLOCATION_MANAGER.isOperatorSet(distribution.operatorSet), OperatorSetNotRegistered());
+ }
+
+ // Check if the start epoch is in the future.
+ // Prevents updating a distribution to a past or current epoch.
+ if (currentEpoch != type(uint256).max) {
+ // After emissions start - require future epochs only
+ require(distribution.startEpoch > currentEpoch, StartEpochMustBeInTheFuture());
+ }
+
+ // Check if the new total weight of all distributions exceeds max total weight.
+ // Prevents distributing more supply than inflation rate allows.
+ require(distribution.weight + totalWeightBefore <= MAX_TOTAL_WEIGHT, TotalWeightExceedsMax());
+
+ // Check if rewards submissions array is empty for non-Manual distributions.
+ // Manual distributions handle rewards differently and don't require submissions.
+ require(
+ distribution.distributionType == DistributionType.Manual
+ || distribution.strategiesAndMultipliers.length > 0,
+ RewardsSubmissionsCannotBeEmpty()
+ );
+ }
+
+ /// @dev Internal helper to check if the button is pressable.
+ /// @param currentEpoch The current epoch.
+ /// @return True if the button is pressable, false otherwise.
+ function _isButtonPressable(
+ uint256 currentEpoch
+ ) internal view returns (bool) {
+ // If emissions haven't started yet, button is not pressable.
+ if (currentEpoch == type(uint256).max) return false;
+
+ // Return true if there are any unprocessed distributions for the current epoch.
+ return _epochs[currentEpoch].totalProcessed < getTotalProcessableDistributions();
+ }
+
+ /// -----------------------------------------------------------------------
+ /// View
+ /// -----------------------------------------------------------------------
+
+ /// @inheritdoc IEmissionsController
+ function getCurrentEpoch() public view returns (uint256) {
+ // If the start time has not elapsed, default to max uint256.
+ if (block.timestamp < EMISSIONS_START_TIME) return type(uint256).max;
+ // Calculate the current epoch by dividing the time since start by the epoch length.
+ return (block.timestamp - EMISSIONS_START_TIME) / EMISSIONS_EPOCH_LENGTH;
+ }
+
+ /// @inheritdoc IEmissionsController
+ function isButtonPressable() public view returns (bool) {
+ return _isButtonPressable(getCurrentEpoch());
+ }
+
+ /// @inheritdoc IEmissionsController
+ function nextTimeButtonPressable() external view returns (uint256) {
+ uint256 currentEpoch = getCurrentEpoch();
+
+ // If emissions haven't started yet, return the start time.
+ if (currentEpoch == type(uint256).max) return EMISSIONS_START_TIME;
+
+ // Return the start time of the next epoch.
+ return EMISSIONS_START_TIME + EMISSIONS_EPOCH_LENGTH * (currentEpoch + 1);
+ }
+
+ /// @inheritdoc IEmissionsController
+ function lastTimeButtonPressable() external view returns (uint256) {
+ uint256 currentEpoch = getCurrentEpoch();
+
+ // If emissions haven't started yet, return the max uint256.
+ if (currentEpoch == type(uint256).max) return type(uint256).max;
+
+ // Return the start time of the current epoch.
+ return EMISSIONS_START_TIME + EMISSIONS_EPOCH_LENGTH * currentEpoch;
+ }
+
+ /// @inheritdoc IEmissionsController
+ function getTotalProcessableDistributions() public view returns (uint256) {
+ uint256 currentEpoch = getCurrentEpoch();
+ // Before emissions start, return the full count since distributions added
+ // before emissions are not tracked as "added in current epoch"
+ if (currentEpoch == type(uint256).max) {
+ return _distributions.length;
+ }
+ return _distributions.length - _epochs[currentEpoch].totalAdded;
+ }
+
+ /// @inheritdoc IEmissionsController
+ function getDistribution(
+ uint256 distributionId
+ ) external view returns (Distribution memory) {
+ return _distributions[distributionId];
+ }
+
+ /// @inheritdoc IEmissionsController
+ function getDistributions(
+ uint256 start,
+ uint256 length
+ ) external view returns (Distribution[] memory distributions) {
+ // Avoid out-of-bounds error.
+ uint256 actualLength = _distributions.length;
+ if (start + length > actualLength) length = actualLength - start;
+ // Create a new array in memory with the given length.
+ distributions = new Distribution[](length);
+ // Copy the specified subset of distributions from the storage array to the memory array.
+ for (uint256 i = 0; i < length; ++i) {
+ distributions[i] = _distributions[start + i];
+ }
+ }
+}
diff --git a/src/contracts/core/RewardsCoordinator.sol b/src/contracts/core/RewardsCoordinator.sol
index a62547cadb..b1657b16cc 100644
--- a/src/contracts/core/RewardsCoordinator.sol
+++ b/src/contracts/core/RewardsCoordinator.sol
@@ -39,6 +39,10 @@ contract RewardsCoordinator is
_;
}
+ /// -----------------------------------------------------------------------
+ /// Initialization
+ /// -----------------------------------------------------------------------
+
/// @dev Sets the immutable variables for the contract
constructor(
RewardsCoordinatorConstructorParams memory params
@@ -47,6 +51,7 @@ contract RewardsCoordinator is
params.delegationManager,
params.strategyManager,
params.allocationManager,
+ params.emissionsController,
params.CALCULATION_INTERVAL_SECONDS,
params.MAX_REWARDS_DURATION,
params.MAX_RETROACTIVE_LENGTH,
@@ -67,36 +72,35 @@ contract RewardsCoordinator is
uint256 initialPausedStatus,
address _rewardsUpdater,
uint32 _activationDelay,
- uint16 _defaultSplitBips
- ) external initializer {
+ uint16 _defaultSplitBips,
+ address _feeRecipient
+ ) external reinitializer(2) {
_setPausedStatus(initialPausedStatus);
_transferOwnership(initialOwner);
_setRewardsUpdater(_rewardsUpdater);
_setActivationDelay(_activationDelay);
_setDefaultOperatorSplit(_defaultSplitBips);
+ _setFeeRecipient(_feeRecipient);
}
- ///
- /// EXTERNAL FUNCTIONS
- ///
+ /// -----------------------------------------------------------------------
+ /// External Functions
+ /// -----------------------------------------------------------------------
/// @inheritdoc IRewardsCoordinator
- function createAVSRewardsSubmission(
+ function createEigenDARewardsSubmission(
+ address avs,
RewardsSubmission[] calldata rewardsSubmissions
) external onlyWhenNotPaused(PAUSED_AVS_REWARDS_SUBMISSION) nonReentrant {
- for (uint256 i = 0; i < rewardsSubmissions.length; i++) {
- RewardsSubmission calldata rewardsSubmission = rewardsSubmissions[i];
- uint256 nonce = submissionNonce[msg.sender];
- bytes32 rewardsSubmissionHash = keccak256(abi.encode(msg.sender, nonce, rewardsSubmission));
-
- _validateRewardsSubmission(rewardsSubmission);
-
- isAVSRewardsSubmissionHash[msg.sender][rewardsSubmissionHash] = true;
- submissionNonce[msg.sender] = nonce + 1;
+ require(msg.sender == address(emissionsController), UnauthorizedCaller());
+ _createAVSRewardsSubmission(avs, rewardsSubmissions);
+ }
- emit AVSRewardsSubmissionCreated(msg.sender, nonce, rewardsSubmissionHash, rewardsSubmission);
- rewardsSubmission.token.safeTransferFrom(msg.sender, address(this), rewardsSubmission.amount);
- }
+ /// @inheritdoc IRewardsCoordinator
+ function createAVSRewardsSubmission(
+ RewardsSubmission[] calldata rewardsSubmissions
+ ) external onlyWhenNotPaused(PAUSED_AVS_REWARDS_SUBMISSION) nonReentrant {
+ _createAVSRewardsSubmission(msg.sender, rewardsSubmissions);
}
/// @inheritdoc IRewardsCoordinator
@@ -148,14 +152,24 @@ contract RewardsCoordinator is
OperatorDirectedRewardsSubmission[] calldata operatorDirectedRewardsSubmissions
) external onlyWhenNotPaused(PAUSED_OPERATOR_DIRECTED_AVS_REWARDS_SUBMISSION) checkCanCall(avs) nonReentrant {
for (uint256 i = 0; i < operatorDirectedRewardsSubmissions.length; i++) {
- OperatorDirectedRewardsSubmission calldata operatorDirectedRewardsSubmission =
+ OperatorDirectedRewardsSubmission memory operatorDirectedRewardsSubmission =
operatorDirectedRewardsSubmissions[i];
+
uint256 nonce = submissionNonce[avs];
- bytes32 operatorDirectedRewardsSubmissionHash =
- keccak256(abi.encode(avs, nonce, operatorDirectedRewardsSubmission));
- uint256 totalAmount = _validateOperatorDirectedRewardsSubmission(operatorDirectedRewardsSubmission);
+ // First validate the operator directed submission.
+ // Validate the operator directed submission and deduct protocol fees upfront from each `operatorRewards.amount` if applicable.
+ // This ensures all amounts are net of fees before proceeding, avoiding redundant fee calculations later.
+ (bytes32 operatorDirectedRewardsSubmissionHash, uint256 amountBeforeFee, uint256 amountAfterFee) =
+ _validateOperatorDirectedRewardsSubmission(avs, nonce, operatorDirectedRewardsSubmission);
+
+ // Then transfer the full amount to the contract.
+ operatorDirectedRewardsSubmission.token.safeTransferFrom(msg.sender, address(this), amountBeforeFee);
+ // Then take the protocol fee (if the submitter is opted in for protocol fees).
+ _takeOperatorDirectedProtocolFee(operatorDirectedRewardsSubmission.token, amountBeforeFee, amountAfterFee);
+
+ // Last update storage.
isOperatorDirectedAVSRewardsSubmissionHash[avs][operatorDirectedRewardsSubmissionHash] = true;
submissionNonce[avs] = nonce + 1;
@@ -166,7 +180,6 @@ contract RewardsCoordinator is
nonce,
operatorDirectedRewardsSubmission
);
- operatorDirectedRewardsSubmission.token.safeTransferFrom(msg.sender, address(this), totalAmount);
}
}
@@ -182,14 +195,23 @@ contract RewardsCoordinator is
{
require(allocationManager.isOperatorSet(operatorSet), InvalidOperatorSet());
for (uint256 i = 0; i < operatorDirectedRewardsSubmissions.length; i++) {
- OperatorDirectedRewardsSubmission calldata operatorDirectedRewardsSubmission =
+ OperatorDirectedRewardsSubmission memory operatorDirectedRewardsSubmission =
operatorDirectedRewardsSubmissions[i];
+
uint256 nonce = submissionNonce[operatorSet.avs];
- bytes32 operatorDirectedRewardsSubmissionHash =
- keccak256(abi.encode(operatorSet.avs, nonce, operatorDirectedRewardsSubmission));
+ // First validate the operator directed submission.
+ // Validate the operator directed submission and deduct protocol fees upfront from each `operatorRewards.amount` if applicable.
+ // This ensures all amounts are net of fees before proceeding, avoiding redundant fee calculations later.
+ (bytes32 operatorDirectedRewardsSubmissionHash, uint256 amountBeforeFee, uint256 amountAfterFee) =
+ _validateOperatorDirectedRewardsSubmission(operatorSet.avs, nonce, operatorDirectedRewardsSubmission);
- uint256 totalAmount = _validateOperatorDirectedRewardsSubmission(operatorDirectedRewardsSubmission);
+ // Then transfer the full amount to the contract.
+ operatorDirectedRewardsSubmission.token.safeTransferFrom(msg.sender, address(this), amountBeforeFee);
+ // Then take the protocol fee (if the submitter is opted in for protocol fees).
+ _takeOperatorDirectedProtocolFee(operatorDirectedRewardsSubmission.token, amountBeforeFee, amountAfterFee);
+
+ // Last update storage.
isOperatorDirectedOperatorSetRewardsSubmissionHash[operatorSet.avs][operatorDirectedRewardsSubmissionHash] =
true;
submissionNonce[operatorSet.avs] = nonce + 1;
@@ -201,7 +223,6 @@ contract RewardsCoordinator is
nonce,
operatorDirectedRewardsSubmission
);
- operatorDirectedRewardsSubmission.token.safeTransferFrom(msg.sender, address(this), totalAmount);
}
}
@@ -212,12 +233,21 @@ contract RewardsCoordinator is
) external onlyWhenNotPaused(PAUSED_UNIQUE_STAKE_REWARDS_SUBMISSION) checkCanCall(operatorSet.avs) nonReentrant {
require(allocationManager.isOperatorSet(operatorSet), InvalidOperatorSet());
for (uint256 i = 0; i < rewardsSubmissions.length; ++i) {
- RewardsSubmission calldata rewardsSubmission = rewardsSubmissions[i];
- uint256 nonce = submissionNonce[operatorSet.avs];
- bytes32 rewardsSubmissionHash = keccak256(abi.encode(operatorSet.avs, nonce, rewardsSubmission));
+ RewardsSubmission memory rewardsSubmission = rewardsSubmissions[i];
+ // First validate the submission.
_validateRewardsSubmission(rewardsSubmission);
+ // Then transfer the full amount to the contract.
+ rewardsSubmission.token.safeTransferFrom(msg.sender, address(this), rewardsSubmission.amount);
+
+ // Then take the protocol fee (if the submitter is opted in for protocol fees).
+ rewardsSubmission.amount = _takeProtocolFee(rewardsSubmission.token, rewardsSubmission.amount);
+
+ // Last update storage.
+ uint256 nonce = submissionNonce[operatorSet.avs];
+ bytes32 rewardsSubmissionHash = keccak256(abi.encode(operatorSet.avs, nonce, rewardsSubmission));
+
isUniqueStakeRewardsSubmissionHash[operatorSet.avs][rewardsSubmissionHash] = true;
submissionNonce[operatorSet.avs] = nonce + 1;
@@ -228,7 +258,6 @@ contract RewardsCoordinator is
nonce,
rewardsSubmission
);
- rewardsSubmission.token.safeTransferFrom(msg.sender, address(this), rewardsSubmission.amount);
}
}
@@ -239,12 +268,21 @@ contract RewardsCoordinator is
) external onlyWhenNotPaused(PAUSED_TOTAL_STAKE_REWARDS_SUBMISSION) checkCanCall(operatorSet.avs) nonReentrant {
require(allocationManager.isOperatorSet(operatorSet), InvalidOperatorSet());
for (uint256 i = 0; i < rewardsSubmissions.length; ++i) {
- RewardsSubmission calldata rewardsSubmission = rewardsSubmissions[i];
- uint256 nonce = submissionNonce[operatorSet.avs];
- bytes32 rewardsSubmissionHash = keccak256(abi.encode(operatorSet.avs, nonce, rewardsSubmission));
+ RewardsSubmission memory rewardsSubmission = rewardsSubmissions[i];
+ // First validate the submission.
_validateRewardsSubmission(rewardsSubmission);
+ // Then transfer the full amount to the contract.
+ rewardsSubmission.token.safeTransferFrom(msg.sender, address(this), rewardsSubmission.amount);
+
+ // Then take the protocol fee (if the submitter is opted in for protocol fees).
+ rewardsSubmission.amount = _takeProtocolFee(rewardsSubmission.token, rewardsSubmission.amount);
+
+ // Last update storage.
+ uint256 nonce = submissionNonce[operatorSet.avs];
+ bytes32 rewardsSubmissionHash = keccak256(abi.encode(operatorSet.avs, nonce, rewardsSubmission));
+
isTotalStakeRewardsSubmissionHash[operatorSet.avs][rewardsSubmissionHash] = true;
submissionNonce[operatorSet.avs] = nonce + 1;
@@ -255,7 +293,6 @@ contract RewardsCoordinator is
nonce,
rewardsSubmission
);
- rewardsSubmission.token.safeTransferFrom(msg.sender, address(this), rewardsSubmission.amount);
}
}
@@ -346,6 +383,13 @@ contract RewardsCoordinator is
_setDefaultOperatorSplit(split);
}
+ /// @inheritdoc IRewardsCoordinator
+ function setFeeRecipient(
+ address _feeRecipient
+ ) external onlyOwner {
+ _setFeeRecipient(_feeRecipient);
+ }
+
/// @inheritdoc IRewardsCoordinator
function setOperatorAVSSplit(
address operator,
@@ -386,6 +430,14 @@ contract RewardsCoordinator is
emit OperatorSetSplitBipsSet(msg.sender, operator, operatorSet, activatedAt, oldSplit, split);
}
+ /// @inheritdoc IRewardsCoordinator
+ function setOptInForProtocolFee(
+ address submitter,
+ bool optInForProtocolFee
+ ) external checkCanCall(submitter) {
+ _setOptInForProtocolFee(submitter, optInForProtocolFee);
+ }
+
/// @inheritdoc IRewardsCoordinator
function setRewardsUpdater(
address _rewardsUpdater
@@ -403,9 +455,39 @@ contract RewardsCoordinator is
isRewardsForAllSubmitter[_submitter] = _newValue;
}
- ///
- /// INTERNAL FUNCTIONS
- ///
+ /// -----------------------------------------------------------------------
+ /// Internal Helper Functions
+ /// -----------------------------------------------------------------------
+
+ /// @notice Internal helper to create AVS rewards submissions.
+ /// @param avs The address of the AVS to submit rewards for.
+ /// @param rewardsSubmissions The RewardsSubmissions to be created.
+ function _createAVSRewardsSubmission(
+ address avs,
+ RewardsSubmission[] calldata rewardsSubmissions
+ ) internal {
+ for (uint256 i = 0; i < rewardsSubmissions.length; i++) {
+ RewardsSubmission memory rewardsSubmission = rewardsSubmissions[i];
+
+ // First validate the submission.
+ _validateRewardsSubmission(rewardsSubmission);
+
+ // Then transfer the full amount to the contract.
+ rewardsSubmission.token.safeTransferFrom(msg.sender, address(this), rewardsSubmission.amount);
+
+ // Then take the protocol fee (if the submitter is opted in for protocol fees).
+ rewardsSubmission.amount = _takeProtocolFee(rewardsSubmission.token, rewardsSubmission.amount);
+
+ // Last update storage.
+ uint256 nonce = submissionNonce[avs];
+ bytes32 rewardsSubmissionHash = keccak256(abi.encode(avs, nonce, rewardsSubmission));
+
+ isAVSRewardsSubmissionHash[avs][rewardsSubmissionHash] = true;
+ submissionNonce[avs] = nonce + 1;
+
+ emit AVSRewardsSubmissionCreated(avs, nonce, rewardsSubmissionHash, rewardsSubmission);
+ }
+ }
/// @notice Internal helper to process reward claims.
/// @param claim The RewardsMerkleClaims to be processed.
@@ -469,6 +551,14 @@ contract RewardsCoordinator is
emit ClaimerForSet(earner, prevClaimer, claimer);
}
+ function _setFeeRecipient(
+ address _feeRecipient
+ ) internal {
+ require(_feeRecipient != address(0), InvalidAddressZero());
+ emit FeeRecipientSet(feeRecipient, _feeRecipient);
+ feeRecipient = _feeRecipient;
+ }
+
/// @notice Internal helper to set the operator split.
/// @param operatorSplit The split struct for an Operator
/// @param split The split in basis points.
@@ -493,9 +583,18 @@ contract RewardsCoordinator is
operatorSplit.activatedAt = activatedAt;
}
+ function _setOptInForProtocolFee(
+ address submitter,
+ bool value
+ ) internal {
+ bool prevValue = isOptedInForProtocolFee[submitter];
+ emit OptInForProtocolFeeSet(submitter, prevValue, value);
+ isOptedInForProtocolFee[submitter] = value;
+ }
+
/// @notice Common checks for all RewardsSubmissions.
function _validateCommonRewardsSubmission(
- StrategyAndMultiplier[] calldata strategiesAndMultipliers,
+ StrategyAndMultiplier[] memory strategiesAndMultipliers,
uint32 startTimestamp,
uint32 duration
) internal view {
@@ -524,7 +623,7 @@ contract RewardsCoordinator is
/// @notice Validate a RewardsSubmission. Called from both `createAVSRewardsSubmission` and `createRewardsForAllSubmission`
function _validateRewardsSubmission(
- RewardsSubmission calldata rewardsSubmission
+ RewardsSubmission memory rewardsSubmission
) internal view {
_validateCommonRewardsSubmission(
rewardsSubmission.strategiesAndMultipliers, rewardsSubmission.startTimestamp, rewardsSubmission.duration
@@ -537,10 +636,14 @@ contract RewardsCoordinator is
/// @notice Validate a OperatorDirectedRewardsSubmission. Called from `createOperatorDirectedAVSRewardsSubmission`.
/// @dev Not checking for `MAX_FUTURE_LENGTH` (Since operator-directed reward submissions are strictly retroactive).
/// @param submission OperatorDirectedRewardsSubmission to validate.
- /// @return total amount to be transferred from the avs to the contract.
+ /// @return submissionHash The hash of the submission.
+ /// @return amountBeforeFee The sum of all operator reward amounts before fees are taken.
+ /// @return amountAfterFee The sum of all operator reward amounts after fees are taken.
function _validateOperatorDirectedRewardsSubmission(
- OperatorDirectedRewardsSubmission calldata submission
- ) internal view returns (uint256) {
+ address submitter,
+ uint256 nonce,
+ OperatorDirectedRewardsSubmission memory submission
+ ) internal view returns (bytes32 submissionHash, uint256 amountBeforeFee, uint256 amountAfterFee) {
_validateCommonRewardsSubmission(
submission.strategiesAndMultipliers, submission.startTimestamp, submission.duration
);
@@ -548,21 +651,34 @@ contract RewardsCoordinator is
require(submission.operatorRewards.length > 0, InputArrayLengthZero());
require(submission.startTimestamp + submission.duration < block.timestamp, SubmissionNotRetroactive());
- uint256 totalAmount = 0;
- address currOperatorAddress = address(0);
- for (uint256 i = 0; i < submission.operatorRewards.length; ++i) {
- OperatorReward calldata operatorReward = submission.operatorRewards[i];
- require(operatorReward.operator != address(0), InvalidAddressZero());
- require(currOperatorAddress < operatorReward.operator, OperatorsNotInAscendingOrder());
- require(operatorReward.amount > 0, AmountIsZero());
+ bool feeOn = isOptedInForProtocolFee[msg.sender];
+
+ address lastOperator = address(0);
+ uint256 length = submission.operatorRewards.length;
+ for (uint256 i = 0; i < length; ++i) {
+ // Check that each operator is a non-zero address.
+ require(submission.operatorRewards[i].operator != address(0), InvalidAddressZero());
+ // Check that each operator is in ascending order.
+ require(lastOperator < submission.operatorRewards[i].operator, OperatorsNotInAscendingOrder());
+ // Check that each operator reward amount is non-zero.
+ require(submission.operatorRewards[i].amount > 0, AmountIsZero());
+
+ // Increment the total amount before fees by the operator reward amount.
+ amountBeforeFee += submission.operatorRewards[i].amount;
+
+ // Take the protocol fee (if the submitter is opted in for protocol fees).
+ uint256 feeAmount = submission.operatorRewards[i].amount * PROTOCOL_FEE_BIPS / ONE_HUNDRED_IN_BIPS;
+ if (feeOn && feeAmount != 0) {
+ submission.operatorRewards[i].amount -= feeAmount;
+ }
- currOperatorAddress = operatorReward.operator;
- totalAmount += operatorReward.amount;
+ amountAfterFee += submission.operatorRewards[i].amount;
+ lastOperator = submission.operatorRewards[i].operator;
}
- require(totalAmount <= MAX_REWARDS_AMOUNT, AmountExceedsMax());
+ require(amountBeforeFee <= MAX_REWARDS_AMOUNT, AmountExceedsMax());
- return totalAmount;
+ return (keccak256(abi.encode(submitter, nonce, submission)), amountBeforeFee, amountAfterFee);
}
function _checkClaim(
@@ -672,9 +788,41 @@ contract RewardsCoordinator is
}
}
- ///
- /// VIEW FUNCTIONS
- ///
+ /// @notice Internal helper to take protocol fees from a submission.
+ /// @param token The token to take the protocol fee from.
+ /// @param amountBeforeFee The amount before the protocol fee is taken.
+ /// @return amountAfterFee The amount after the protocol fee is taken.
+ function _takeProtocolFee(
+ IERC20 token,
+ uint256 amountBeforeFee
+ ) internal returns (uint256 amountAfterFee) {
+ uint256 feeAmount = amountBeforeFee * PROTOCOL_FEE_BIPS / ONE_HUNDRED_IN_BIPS;
+ if (isOptedInForProtocolFee[msg.sender]) {
+ if (feeAmount != 0) {
+ token.safeTransfer(feeRecipient, feeAmount);
+ return amountBeforeFee - feeAmount;
+ }
+ }
+ return amountBeforeFee;
+ }
+
+ /// @notice Internal helper to take protocol fees from a operator-directed rewards submission.
+ /// @param token The token to take the protocol fee from.
+ /// @param amountBeforeFee The amount before the protocol fee is taken.
+ /// @param amountAfterFee The amount after the protocol fee is taken.
+ function _takeOperatorDirectedProtocolFee(
+ IERC20 token,
+ uint256 amountBeforeFee,
+ uint256 amountAfterFee
+ ) internal {
+ if (amountAfterFee != amountBeforeFee) {
+ token.safeTransfer(feeRecipient, amountBeforeFee - amountAfterFee);
+ }
+ }
+
+ /// -----------------------------------------------------------------------
+ /// External View Functions
+ /// -----------------------------------------------------------------------
/// @inheritdoc IRewardsCoordinator
function calculateEarnerLeafHash(
diff --git a/src/contracts/core/StrategyManager.sol b/src/contracts/core/StrategyManager.sol
index 7377e064b8..fb23e31f22 100644
--- a/src/contracts/core/StrategyManager.sol
+++ b/src/contracts/core/StrategyManager.sol
@@ -267,6 +267,9 @@ contract StrategyManager is
require(staker != address(0), StakerAddressZero());
require(shares != 0, SharesAmountZero());
+ // allow the strategy to veto or enforce constraints on adding shares
+ strategy.beforeAddShares(staker, shares);
+
uint256 prevDepositShares = stakerDepositShares[staker][strategy];
// if they dont have prevDepositShares of this strategy, add it to their strats
@@ -336,6 +339,10 @@ contract StrategyManager is
// This check technically shouldn't actually ever revert because depositSharesToRemove is already
// checked to not exceed max amount of shares when the withdrawal was queued in the DelegationManager
require(depositSharesToRemove <= userDepositShares, SharesAmountTooHigh());
+
+ // allow the strategy to veto or enforce constraints on removing shares
+ strategy.beforeRemoveShares(staker, depositSharesToRemove);
+
userDepositShares = userDepositShares - depositSharesToRemove;
// subtract the shares from the staker's existing shares for this strategy
diff --git a/src/contracts/core/storage/EmissionsControllerStorage.sol b/src/contracts/core/storage/EmissionsControllerStorage.sol
new file mode 100644
index 0000000000..e9b425f842
--- /dev/null
+++ b/src/contracts/core/storage/EmissionsControllerStorage.sol
@@ -0,0 +1,88 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "../../interfaces/IEmissionsController.sol";
+import "../../interfaces/IRewardsCoordinator.sol";
+
+abstract contract EmissionsControllerStorage is IEmissionsController {
+ // Constants
+
+ /// @inheritdoc IEmissionsController
+ uint256 public constant MAX_TOTAL_WEIGHT = 10_000;
+
+ /// @dev Index for flag that pauses pressing the button when set.
+ uint8 internal constant PAUSED_TOKEN_FLOWS = 0;
+
+ /// @dev Returns the hash of the reentrancy error from OZ 4.9.0 ReentrancyGuard.
+ /// Used to detect griefing attacks.
+ bytes32 internal constant REENTRANCY_ERROR_HASH =
+ keccak256(abi.encodeWithSignature("Error(string)", "ReentrancyGuard: reentrant call"));
+
+ // Immutables
+
+ /// @dev The EIGEN token that will be minted for emissions.
+ IEigen public immutable override EIGEN;
+ /// @dev The backing Eigen token that will be minted for emissions.
+ IBackingEigen public immutable override BACKING_EIGEN;
+ /// @dev The AllocationManager contract for managing operator sets.
+ IAllocationManager public immutable override ALLOCATION_MANAGER;
+ /// @dev The RewardsCoordinator contract for submitting rewards.
+ IRewardsCoordinator public immutable override REWARDS_COORDINATOR;
+
+ /// @inheritdoc IEmissionsController
+ uint256 public immutable EMISSIONS_INFLATION_RATE;
+ /// @inheritdoc IEmissionsController
+ uint256 public immutable EMISSIONS_START_TIME;
+ /// @inheritdoc IEmissionsController
+ uint256 public immutable EMISSIONS_EPOCH_LENGTH;
+
+ // Mutatables
+
+ // Slot 0 (Packed)
+
+ /// @inheritdoc IEmissionsController
+ address public incentiveCouncil;
+ /// @inheritdoc IEmissionsController
+ uint16 public totalWeight;
+
+ /// @dev Returns an append-only array of distributions.
+ Distribution[] internal _distributions;
+ /// @dev Mapping from epoch number to epoch metadata.
+ mapping(uint256 epoch => Epoch) internal _epochs;
+
+ // Construction
+
+ constructor(
+ IEigen eigen,
+ IBackingEigen backingEigen,
+ IAllocationManager allocationManager,
+ IRewardsCoordinator rewardsCoordinator,
+ uint256 inflationRate,
+ uint256 startTime,
+ uint256 epochLength,
+ uint256 calculationIntervalSeconds
+ ) {
+ // Check if epochLength is aligned with CALCULATION_INTERVAL_SECONDS.
+ if (epochLength % calculationIntervalSeconds != 0) {
+ revert EpochLengthNotAlignedWithCalculationInterval();
+ }
+ // Check if startTime is aligned with CALCULATION_INTERVAL_SECONDS.
+ if (startTime % calculationIntervalSeconds != 0) {
+ revert StartTimeNotAlignedWithCalculationInterval();
+ }
+
+ EIGEN = eigen;
+ BACKING_EIGEN = backingEigen;
+ ALLOCATION_MANAGER = allocationManager;
+ REWARDS_COORDINATOR = rewardsCoordinator;
+
+ EMISSIONS_INFLATION_RATE = inflationRate;
+ EMISSIONS_START_TIME = startTime;
+ EMISSIONS_EPOCH_LENGTH = epochLength;
+ }
+
+ /// @dev This empty reserved space is put in place to allow future versions to add new
+ /// variables without shifting down storage in the inheritance chain.
+ /// See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
+ uint256[47] private __gap;
+}
diff --git a/src/contracts/core/storage/RewardsCoordinatorStorage.sol b/src/contracts/core/storage/RewardsCoordinatorStorage.sol
index 270e18d0f6..07e6e1e52b 100644
--- a/src/contracts/core/storage/RewardsCoordinatorStorage.sol
+++ b/src/contracts/core/storage/RewardsCoordinatorStorage.sol
@@ -10,7 +10,7 @@ import "../../interfaces/IRewardsCoordinator.sol";
abstract contract RewardsCoordinatorStorage is IRewardsCoordinator {
// Constants
- /// @dev Index for flag that pauses calling createAVSRewardsSubmission
+ /// @dev Index for flag that pauses calling createAVSRewardsSubmission and createEigenDARewardsSubmission
uint8 internal constant PAUSED_AVS_REWARDS_SUBMISSION = 0;
/// @dev Index for flag that pauses calling createRewardsForAllSubmission
uint8 internal constant PAUSED_REWARDS_FOR_ALL_SUBMISSION = 1;
@@ -18,7 +18,7 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator {
uint8 internal constant PAUSED_PROCESS_CLAIM = 2;
/// @dev Index for flag that pauses submitRoots and disableRoot
uint8 internal constant PAUSED_SUBMIT_DISABLE_ROOTS = 3;
- /// @dev Index for flag that pauses calling rewardAllStakersAndOperators
+ /// @dev Index for flag that pauses calling createRewardsForAllEarners
uint8 internal constant PAUSED_REWARD_ALL_STAKERS_AND_OPERATORS = 4;
/// @dev Index for flag that pauses calling createOperatorDirectedAVSRewardsSubmission
uint8 internal constant PAUSED_OPERATOR_DIRECTED_AVS_REWARDS_SUBMISSION = 5;
@@ -28,9 +28,9 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator {
uint8 internal constant PAUSED_OPERATOR_PI_SPLIT = 7;
/// @dev Index for flag that pauses calling setOperatorSetSplit
uint8 internal constant PAUSED_OPERATOR_SET_SPLIT = 8;
- /// @dev Index for flag that pauses calling setOperatorSetPerformanceRewardsSubmission
+ /// @dev Index for flag that pauses calling createOperatorDirectedOperatorSetRewardsSubmission
uint8 internal constant PAUSED_OPERATOR_DIRECTED_OPERATOR_SET_REWARDS_SUBMISSION = 9;
- /// @dev Index for flag that pauses calling createOperatorSetRewardsSubmission
+ /// @dev Index for flag that pauses calling createUniqueStakeRewardsSubmission
uint8 internal constant PAUSED_UNIQUE_STAKE_REWARDS_SUBMISSION = 10;
/// @dev Index for flag that pauses calling createTotalStakeRewardsSubmission
uint8 internal constant PAUSED_TOTAL_STAKE_REWARDS_SUBMISSION = 11;
@@ -48,6 +48,9 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator {
/// @notice Canonical, virtual beacon chain ETH strategy
IStrategy public constant beaconChainETHStrategy = IStrategy(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0);
+ /// @notice Protocol fee percentage in basis points (20%).
+ uint16 internal constant PROTOCOL_FEE_BIPS = 2000;
+
// Immutables
/// @notice The DelegationManager contract for EigenLayer
@@ -59,6 +62,9 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator {
/// @notice The AllocationManager contract for EigenLayer
IAllocationManager public immutable allocationManager;
+ /// @notice The RewardsCoordinator contract for EigenLayer
+ IEmissionsController public immutable emissionsController;
+
/// @notice The interval in seconds at which the calculation for rewards distribution is done.
/// @dev RewardsSubmission durations must be multiples of this interval. This is going to be configured to 1 day
uint32 public immutable CALCULATION_INTERVAL_SECONDS;
@@ -136,11 +142,18 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator {
/// @notice Returns whether a `hash` is a `valid` total stake rewards submission hash for a given `avs`.
mapping(address avs => mapping(bytes32 hash => bool valid)) public isTotalStakeRewardsSubmissionHash;
+ /// @notice Returns whether a `submitter` is opted in for protocol fees.
+ mapping(address submitter => bool isOptedIn) public isOptedInForProtocolFee;
+
+ /// @notice The address that receives optional protocol fees
+ address public feeRecipient;
+
// Construction
constructor(
IDelegationManager _delegationManager,
IStrategyManager _strategyManager,
IAllocationManager _allocationManager,
+ IEmissionsController _emissionsController,
uint32 _CALCULATION_INTERVAL_SECONDS,
uint32 _MAX_REWARDS_DURATION,
uint32 _MAX_RETROACTIVE_LENGTH,
@@ -154,6 +167,7 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator {
delegationManager = _delegationManager;
strategyManager = _strategyManager;
allocationManager = _allocationManager;
+ emissionsController = _emissionsController;
CALCULATION_INTERVAL_SECONDS = _CALCULATION_INTERVAL_SECONDS;
MAX_REWARDS_DURATION = _MAX_REWARDS_DURATION;
MAX_RETROACTIVE_LENGTH = _MAX_RETROACTIVE_LENGTH;
@@ -164,5 +178,5 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator {
/// @dev This empty reserved space is put in place to allow future versions to add new
/// variables without shifting down storage in the inheritance chain.
/// See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
- uint256[33] private __gap;
+ uint256[31] private __gap;
}
diff --git a/src/contracts/interfaces/IBackingEigen.sol b/src/contracts/interfaces/IBackingEigen.sol
index 682f6f82f3..380e3213ff 100644
--- a/src/contracts/interfaces/IBackingEigen.sol
+++ b/src/contracts/interfaces/IBackingEigen.sol
@@ -62,4 +62,9 @@ interface IBackingEigen is IERC20 {
/// Has been overridden to inform callers that this contract uses timestamps instead of block numbers, to match `clock()`
// solhint-disable-next-line func-name-mixedcase
function CLOCK_MODE() external pure returns (string memory);
+
+ /// @notice Returns whether an address is allowed to mint new tokens.
+ function isMinter(
+ address who
+ ) external view returns (bool);
}
diff --git a/src/contracts/interfaces/IDurationVaultStrategy.sol b/src/contracts/interfaces/IDurationVaultStrategy.sol
new file mode 100644
index 0000000000..fedc74abe0
--- /dev/null
+++ b/src/contracts/interfaces/IDurationVaultStrategy.sol
@@ -0,0 +1,285 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+
+import "./IStrategy.sol";
+import "./IDelegationManager.sol";
+import "./IAllocationManager.sol";
+import "./IRewardsCoordinator.sol";
+import "../libraries/OperatorSetLib.sol";
+
+/// @title Errors for IDurationVaultStrategy
+interface IDurationVaultStrategyErrors {
+ /// @dev Thrown when attempting to use a zero-address vault admin.
+ error InvalidVaultAdmin();
+ /// @dev Thrown when attempting to configure a zero duration.
+ error InvalidDuration();
+ /// @dev Thrown when attempting to mutate configuration from a non-admin.
+ error OnlyVaultAdmin();
+ /// @dev Thrown when attempting to call arbitrator-only functionality from a non-arbitrator.
+ error OnlyArbitrator();
+ /// @dev Thrown when attempting to configure a zero-address arbitrator.
+ error InvalidArbitrator();
+ /// @dev Thrown when attempting to lock an already locked vault.
+ error VaultAlreadyLocked();
+ /// @dev Thrown when attempting to deposit after the vault has been locked.
+ error DepositsLocked();
+ /// @dev Thrown when attempting to remove shares during the allocations period.
+ error WithdrawalsLockedDuringAllocations();
+ /// @dev Thrown when attempting to add shares when not delegated to the vault operator.
+ error MustBeDelegatedToVaultOperator();
+ /// @dev Thrown when attempting to mark the vault as matured before duration elapses.
+ error DurationNotElapsed();
+ /// @dev Thrown when attempting to use the arbitrator early-advance after the duration has elapsed.
+ error DurationAlreadyElapsed();
+ /// @dev Thrown when attempting to use the arbitrator early-advance before the vault is locked.
+ error VaultNotLocked();
+ /// @dev Thrown when operator integration inputs are missing or invalid.
+ error OperatorIntegrationInvalid();
+ /// @dev Thrown when attempting to deposit into a vault whose underlying token is blacklisted.
+ error UnderlyingTokenBlacklisted();
+
+ /// @dev Thrown when a deposit exceeds the configured `maxPerDeposit` limit.
+ error DepositExceedsMaxPerDeposit();
+
+ /// @dev Thrown when attempting to lock with an operator set that doesn't include this strategy.
+ error StrategyNotSupportedByOperatorSet();
+
+ /// @dev Thrown when attempting to allocate while a pending allocation modification already exists.
+ error PendingAllocation();
+}
+
+/// @title Types for IDurationVaultStrategy
+interface IDurationVaultStrategyTypes {
+ /// @notice Represents the lifecycle state of a duration vault.
+ /// @dev UNINITIALIZED: Vault has not been initialized.
+ /// DEPOSITS: Vault is accepting deposits, withdrawals can be queued.
+ /// ALLOCATIONS: Vault is locked, funds are allocated to the operator set.
+ /// WITHDRAWALS: Duration elapsed, vault is matured and withdrawals are enabled.
+ enum VaultState {
+ UNINITIALIZED,
+ DEPOSITS,
+ ALLOCATIONS,
+ WITHDRAWALS
+ }
+
+ /// @notice Configuration parameters for initializing a duration vault.
+ /// @param underlyingToken The ERC20 token that stakers deposit into this vault.
+ /// @param vaultAdmin The address authorized to manage vault configuration.
+ /// @param arbitrator The address authorized to call `advanceToWithdrawals` for early maturity.
+ /// @param duration The lock period in seconds after which the vault matures.
+ /// @param maxPerDeposit Maximum amount of underlying tokens accepted per deposit.
+ /// @param stakeCap Maximum total underlying tokens the vault will accept.
+ /// @param metadataURI URI pointing to vault metadata (description, name, etc.).
+ /// @param operatorSet The operator set this vault will register and allocate to.
+ /// @param operatorSetRegistrationData Data passed to the AVS registrar during registration.
+ /// @param delegationApprover Address that approves staker delegations (0x0 for open delegation).
+ /// @param operatorMetadataURI URI pointing to operator metadata.
+ struct VaultConfig {
+ IERC20 underlyingToken;
+ address vaultAdmin;
+ address arbitrator;
+ uint32 duration;
+ uint256 maxPerDeposit;
+ uint256 stakeCap;
+ string metadataURI;
+ OperatorSet operatorSet;
+ bytes operatorSetRegistrationData;
+ address delegationApprover;
+ string operatorMetadataURI;
+ }
+}
+
+/// @title Events for IDurationVaultStrategy
+interface IDurationVaultStrategyEvents {
+ /// @notice Emitted when a vault is initialized with its configuration.
+ /// @param vaultAdmin The address of the vault administrator.
+ /// @param arbitrator The address of the vault arbitrator.
+ /// @param underlyingToken The ERC20 token used for deposits.
+ /// @param duration The lock duration in seconds.
+ /// @param maxPerDeposit Maximum deposit amount per transaction.
+ /// @param stakeCap Maximum total deposits allowed.
+ /// @param metadataURI URI pointing to vault metadata.
+ event VaultInitialized(
+ address indexed vaultAdmin,
+ address indexed arbitrator,
+ IERC20 indexed underlyingToken,
+ uint32 duration,
+ uint256 maxPerDeposit,
+ uint256 stakeCap,
+ string metadataURI
+ );
+
+ /// @notice Emitted when the vault is locked, transitioning to ALLOCATIONS state.
+ /// @param lockedAt Timestamp when the vault was locked.
+ /// @param unlockAt Timestamp when the vault will mature.
+ event VaultLocked(uint32 lockedAt, uint32 unlockAt);
+
+ /// @notice Emitted when the vault matures, transitioning to WITHDRAWALS state.
+ /// @param maturedAt Timestamp when the vault matured.
+ event VaultMatured(uint32 maturedAt);
+
+ /// @notice Emitted when the vault is advanced to WITHDRAWALS early by the arbitrator.
+ /// @param arbitrator The arbitrator that performed the early advance.
+ /// @param maturedAt Timestamp when the vault transitioned to WITHDRAWALS.
+ event VaultAdvancedToWithdrawals(address indexed arbitrator, uint32 maturedAt);
+
+ /// @notice Emitted when the vault metadata URI is updated.
+ /// @param newMetadataURI The new metadata URI.
+ event MetadataURIUpdated(string newMetadataURI);
+
+ /// @notice Emitted when deallocation from the operator set is attempted.
+ /// @param success Whether the deallocation call succeeded.
+ event DeallocateAttempted(bool success);
+
+ /// @notice Emitted when deregistration from the operator set is attempted.
+ /// @param success Whether the deregistration call succeeded.
+ event DeregisterAttempted(bool success);
+
+ /// @notice Emitted when `maxPerDeposit` value is updated from `previousValue` to `newValue`.
+ event MaxPerDepositUpdated(uint256 previousValue, uint256 newValue);
+
+ /// @notice Emitted when `maxTotalDeposits` value is updated from `previousValue` to `newValue`.
+ event MaxTotalDepositsUpdated(uint256 previousValue, uint256 newValue);
+}
+
+/// @title Interface for time-bound EigenLayer vault strategies.
+/// @author Layr Labs, Inc.
+/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
+/// @dev Duration vault strategies are operator-bound strategies that accept deposits during an
+/// open window, lock funds for a configurable duration while allocating to an operator set,
+/// and then enable withdrawals after maturity. The vault itself acts as an operator.
+interface IDurationVaultStrategy is
+ IStrategy,
+ IDurationVaultStrategyErrors,
+ IDurationVaultStrategyTypes,
+ IDurationVaultStrategyEvents
+{
+ /// @notice Locks the vault, preventing further deposits and withdrawal queuing until maturity.
+ /// @dev Transitions state from DEPOSITS to ALLOCATIONS. Allocates full magnitude to the
+ /// configured operator set. Only callable by the vault admin.
+ function lock() external;
+
+ /// @notice Marks the vault as matured once the configured duration has elapsed.
+ /// @dev Transitions state from ALLOCATIONS to WITHDRAWALS.
+ ///
+ /// Best-effort operator cleanup:
+ /// - Attempts to deallocate from the configured operator set and deregister the vault as an operator.
+ /// - These external calls are intentionally best-effort so `markMatured()` cannot be bricked and user
+ /// withdrawals cannot be indefinitely locked.
+ ///
+ /// Common reasons deallocation/deregistration can fail include:
+ /// - AllocationManager pausing allocations/deallocations or register/deregister operations.
+ /// - AVS-side registrar rejecting deregistration (e.g., operator removed/ejected from an operator set).
+ /// - AllocationManager state constraints (e.g., pending allocation modification preventing an update).
+ ///
+ /// After maturation, withdrawals are permitted while deposits remain disabled. Callable by anyone once
+ /// the duration has elapsed.
+ function markMatured() external;
+
+ /// @notice Advances the vault to WITHDRAWALS early, after lock but before duration elapses.
+ /// @dev Transitions state from ALLOCATIONS to WITHDRAWALS, and triggers the same best-effort operator cleanup
+ /// as `markMatured()`. Only callable by the configured arbitrator.
+ function advanceToWithdrawals() external;
+
+ /// @notice Updates the vault metadata URI.
+ /// @param newMetadataURI The new metadata URI to set.
+ /// @dev Only callable by the vault admin.
+ function updateMetadataURI(
+ string calldata newMetadataURI
+ ) external;
+
+ /// @notice Updates the delegation approver used for operator delegation approvals.
+ /// @param newDelegationApprover The new delegation approver (0x0 for open delegation).
+ /// @dev Only callable by the vault admin.
+ function updateDelegationApprover(
+ address newDelegationApprover
+ ) external;
+
+ /// @notice Updates the operator metadata URI emitted by the DelegationManager.
+ /// @param newOperatorMetadataURI The new operator metadata URI.
+ /// @dev Only callable by the vault admin.
+ function updateOperatorMetadataURI(
+ string calldata newOperatorMetadataURI
+ ) external;
+
+ /// @notice Sets the claimer for operator rewards accrued to the vault.
+ /// @param claimer The address authorized to claim rewards for the vault.
+ /// @dev Only callable by the vault admin.
+ function setRewardsClaimer(
+ address claimer
+ ) external;
+
+ /// @notice Updates the TVL limits for max deposit per transaction and total stake cap.
+ /// @param newMaxPerDeposit New maximum deposit amount per transaction.
+ /// @param newStakeCap New maximum total deposits allowed.
+ /// @dev Only callable by the vault admin while deposits are open (before lock).
+ function updateTVLLimits(
+ uint256 newMaxPerDeposit,
+ uint256 newStakeCap
+ ) external;
+
+ /// @notice Returns the vault administrator address.
+ function vaultAdmin() external view returns (address);
+
+ /// @notice Returns the arbitrator address.
+ function arbitrator() external view returns (address);
+
+ /// @notice Returns the configured lock duration in seconds.
+ function duration() external view returns (uint32);
+
+ /// @notice Returns the timestamp when the vault was locked.
+ function lockedAt() external view returns (uint32);
+
+ /// @notice Returns the timestamp when the vault will/did mature.
+ function unlockTimestamp() external view returns (uint32);
+
+ /// @notice Returns true if the vault has been locked (state != DEPOSITS).
+ function isLocked() external view returns (bool);
+
+ /// @notice Returns true if the vault has matured (state == WITHDRAWALS).
+ function isMatured() external view returns (bool);
+
+ /// @notice Returns the current vault lifecycle state.
+ function state() external view returns (VaultState);
+
+ /// @notice Returns the vault metadata URI.
+ function metadataURI() external view returns (string memory);
+
+ /// @notice Returns the maximum total deposits allowed (alias for maxTotalDeposits).
+ function stakeCap() external view returns (uint256);
+
+ /// @notice Returns the maximum deposit amount per transaction.
+ function maxPerDeposit() external view returns (uint256);
+
+ /// @notice Returns the maximum total deposits allowed.
+ function maxTotalDeposits() external view returns (uint256);
+
+ /// @notice Returns true if deposits are currently accepted (state == DEPOSITS).
+ function depositsOpen() external view returns (bool);
+
+ /// @notice Returns true if withdrawal queuing is allowed (state != ALLOCATIONS).
+ function withdrawalsOpen() external view returns (bool);
+
+ /// @notice Returns the DelegationManager contract reference.
+ function delegationManager() external view returns (IDelegationManager);
+
+ /// @notice Returns the AllocationManager contract reference.
+ function allocationManager() external view returns (IAllocationManager);
+
+ /// @notice Returns the RewardsCoordinator contract reference.
+ function rewardsCoordinator() external view returns (IRewardsCoordinator);
+
+ /// @notice Returns true if operator integration has been configured.
+ function operatorIntegrationConfigured() external view returns (bool);
+
+ /// @notice Returns true if the vault is registered to the operator set.
+ function operatorSetRegistered() external view returns (bool);
+
+ /// @notice Returns true if allocations are currently active (state == ALLOCATIONS).
+ function allocationsActive() external view returns (bool);
+
+ /// @notice Returns the operator set info (AVS address and operator set ID).
+ function operatorSetInfo() external view returns (address avs, uint32 operatorSetId);
+}
diff --git a/src/contracts/interfaces/IEmissionsController.sol b/src/contracts/interfaces/IEmissionsController.sol
new file mode 100644
index 0000000000..5df818e4a2
--- /dev/null
+++ b/src/contracts/interfaces/IEmissionsController.sol
@@ -0,0 +1,295 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity >=0.5.0;
+
+import "./IAllocationManager.sol";
+import "./IRewardsCoordinator.sol";
+import "./IEigen.sol";
+import "./IBackingEigen.sol";
+import "./IPausable.sol";
+import {OperatorSet} from "../libraries/OperatorSetLib.sol";
+
+/// @title IEmissionsControllerErrors
+/// @notice Errors for the IEmissionsController contract.
+interface IEmissionsControllerErrors {
+ /// @dev Thrown when a reentrancy attack is detected.
+ error MaliciousCallDetected();
+ /// @dev Thrown when caller is not the incentive council.
+ error CallerIsNotIncentiveCouncil();
+ /// @dev Thrown when the start epoch is the current or past epoch.
+ error StartEpochMustBeInTheFuture();
+ /// @dev Thrown when the total weight of all distributions exceeds the max total weight (100%).
+ error TotalWeightExceedsMax();
+ /// @dev Thrown when attempting to add a disabled distribution.
+ error CannotAddDisabledDistribution();
+ /// @dev Thrown when all distributions have been processed for the current epoch.
+ error AllDistributionsProcessed();
+ /// @dev Thrown when not all distributions have been processed for the current epoch.
+ error AllDistributionsMustBeProcessed();
+ /// @dev Thrown when the distribution type is invalid. Should be unreachable.
+ error InvalidDistributionType();
+ /// @dev Thrown when rewards submissions array is empty for a distribution that requires it.
+ error RewardsSubmissionsCannotBeEmpty();
+ /// @dev Thrown when the operator set is not registered.
+ error OperatorSetNotRegistered();
+ /// @dev Thrown when emissions have not started yet.
+ error EmissionsNotStarted();
+ /// @dev Thrown when epoch length is not aligned with CALCULATION_INTERVAL_SECONDS.
+ error EpochLengthNotAlignedWithCalculationInterval();
+ /// @dev Thrown when start time is not aligned with CALCULATION_INTERVAL_SECONDS.
+ error StartTimeNotAlignedWithCalculationInterval();
+}
+
+/// @title IEmissionsControllerTypes
+/// @notice Types for the IEmissionsController contract.
+interface IEmissionsControllerTypes {
+ /// @notice Distribution types that determine how emissions are routed to the RewardsCoordinator.
+ /// @dev Each type maps to a specific RewardsCoordinator function or minting mechanism.
+ /// - Disabled: Distribution is inactive and skipped during processing
+ /// - RewardsForAllEarners: Calls `createRewardsForAllEarners` for protocol-wide rewards
+ /// - OperatorSetTotalStake: Calls `createTotalStakeRewardsSubmission` for operator set rewards weighted by total stake
+ /// - OperatorSetUniqueStake: Calls `createUniqueStakeRewardsSubmission` for operator set rewards weighted by unique stake
+ /// - EigenDA: Calls `createAVSRewardsSubmission` for EigenDA-specific rewards
+ /// - Manual: Directly mints bEIGEN to specified recipients without RewardsCoordinator interaction
+ enum DistributionType {
+ Disabled,
+ RewardsForAllEarners,
+ OperatorSetTotalStake,
+ OperatorSetUniqueStake,
+ EigenDA,
+ Manual
+ }
+
+ /// @notice A struct containing the total minted and processed amounts for an epoch.
+ struct Epoch {
+ /// Whether the epoch has been minted.
+ bool minted;
+ /// The total number of distributions processed for the epoch.
+ uint64 totalProcessed;
+ /// The total number of distributions that have been added this epoch.
+ uint64 totalAdded;
+ }
+
+ /// @notice A Distribution structure defining how a portion of emissions should be allocated.
+ /// @dev Distributions are stored in an append-only array and processed each epoch by `pressButton`.
+ /// The weight determines the proportion of total emissions allocated to this distribution.
+ /// Active distributions are processed sequentially.
+ struct Distribution {
+ /// The bips denominated weight of the distribution.
+ uint64 weight;
+ /// The configured start epoch.
+ uint64 startEpoch;
+ /// The number of epochs to repeat the distribution (0 for infinite, 1 for single epoch, N for N epochs).
+ uint64 totalEpochs;
+ /// The type of distribution.
+ DistributionType distributionType;
+ /// The operator set (Required only for OperatorSetTotalStake and OperatorSetUniqueStake distribution types).
+ OperatorSet operatorSet;
+ /// The strategies and their respective multipliers for distributing rewards.
+ IRewardsCoordinatorTypes.StrategyAndMultiplier[][] strategiesAndMultipliers;
+ }
+}
+
+/// @title IEmissionsControllerEvents
+/// @notice Events for the IEmissionsController contract.
+interface IEmissionsControllerEvents is IEmissionsControllerTypes {
+ /// @notice Emitted when the remaining EIGEN is swept to the incentive council.
+ /// @param incentiveCouncil The address to sweep the EIGEN to.
+ /// @param amount The amount of EIGEN swept.
+ event Swept(address indexed incentiveCouncil, uint256 amount);
+
+ /// @notice Emitted when a distribution is processed.
+ /// @param distributionId The id of the distribution.
+ /// @param epoch The epoch the distribution was processed.
+ /// @param distribution The distribution.
+ event DistributionProcessed(
+ uint256 indexed distributionId,
+ uint256 indexed epoch,
+ Distribution distribution,
+ bool success
+ );
+
+ /// @notice Emitted when a distribution is added.
+ /// @param distributionId The id of the distribution.
+ /// @param epoch The epoch the distribution was added.
+ /// @param distribution The distribution.
+ event DistributionAdded(uint256 indexed distributionId, uint256 indexed epoch, Distribution distribution);
+
+ /// @notice Emitted when a distribution is updated.
+ /// @param distributionId The id of the distribution.
+ /// @param epoch The epoch the distribution was updated.
+ /// @param distribution The distribution.
+ event DistributionUpdated(uint256 indexed distributionId, uint256 indexed epoch, Distribution distribution);
+
+ /// @notice Emitted when the Incentive Council address is updated.
+ /// @param incentiveCouncil The new Incentive Council address.
+ event IncentiveCouncilUpdated(address indexed incentiveCouncil);
+}
+
+/// @title IEmissionsController
+/// @notice Interface for the EmissionsController contract that manages programmatic EIGEN emissions.
+/// @dev The EmissionsController mints EIGEN at a fixed inflation rate per epoch and distributes it
+/// according to configured distributions. It replaces the legacy ActionGenerator pattern with
+/// a more flexible distribution system controlled by the Incentive Council.
+interface IEmissionsController is IEmissionsControllerErrors, IEmissionsControllerEvents, IPausable {
+ /// -----------------------------------------------------------------------
+ /// Constants
+ /// -----------------------------------------------------------------------
+ /// @notice The EIGEN token address.
+ /// @dev Immutable/constant variable that requires an upgrade to modify.
+ function EIGEN() external view returns (IEigen);
+
+ /// @notice The BACKING_EIGEN token address.
+ /// @dev Immutable/constant variable that requires an upgrade to modify.
+ function BACKING_EIGEN() external view returns (IBackingEigen);
+
+ /// @notice The AllocationManager address.
+ /// @dev Immutable/constant variable that requires an upgrade to modify.
+ function ALLOCATION_MANAGER() external view returns (IAllocationManager);
+
+ /// @notice The RewardsCoordinator address.
+ /// @dev Immutable/constant variable that requires an upgrade to modify.
+ function REWARDS_COORDINATOR() external view returns (IRewardsCoordinator);
+
+ /// @notice The max total weight of all distributions.
+ /// @dev Constant variable that requires an upgrade to modify.
+ function MAX_TOTAL_WEIGHT() external view returns (uint256);
+
+ /// @notice The rate of inflation for emissions.
+ /// @dev Immutable/constant variable that requires an upgrade to modify.
+ function EMISSIONS_INFLATION_RATE() external view returns (uint256);
+
+ /// @notice The start time of the emissions.
+ /// @dev Immutable/constant variable that requires an upgrade to modify.
+ function EMISSIONS_START_TIME() external view returns (uint256);
+
+ /// @notice The cooldown seconds of the emissions.
+ /// @dev Immutable/constant variable that requires an upgrade to modify.
+ function EMISSIONS_EPOCH_LENGTH() external view returns (uint256);
+
+ /// -----------------------------------------------------------------------
+ /// Initialization Functions
+ /// -----------------------------------------------------------------------
+
+ /// @notice Initializes the contract.
+ /// @param initialOwner The initial owner address.
+ /// @param incentiveCouncil The initial Incentive Council address.
+ /// @param initialPausedStatus The initial paused status.
+ function initialize(
+ address initialOwner,
+ address incentiveCouncil,
+ uint256 initialPausedStatus
+ ) external;
+
+ /// -----------------------------------------------------------------------
+ /// Permissionless Trigger
+ /// -----------------------------------------------------------------------
+
+ /// @notice Sweeps the remaining EIGEN to the incentive council.
+ /// @dev This function is only callable after all distributions have been processed for the current epoch.
+ function sweep() external;
+
+ /// @notice Triggers emissions for the current epoch and processes distributions.
+ /// @dev This function mints EMISSIONS_INFLATION_RATE of bEIGEN, wraps it to EIGEN, then processes
+ /// distributions from _totalProcessed[currentEpoch] up to the specified length.
+ /// Each distribution receives a proportional amount based on its weight and submits to RewardsCoordinator.
+ /// Uses low-level calls to prevent reverts in one distribution from blocking others.
+ /// Can be called multiple times per epoch to paginate through all distributions if needed.
+ /// @dev Permissionless function that can be called by anyone when `isButtonPressable()` returns true.
+ /// @param length The number of distributions to process (upper bound for the loop).
+ function pressButton(
+ uint256 length
+ ) external;
+
+ /// -----------------------------------------------------------------------
+ /// Protocol Council Functions
+ /// -----------------------------------------------------------------------
+
+ /// @notice Sets the Incentive Council address.
+ /// @dev Only the contract owner (Protocol Council) can call this function.
+ /// The Incentive Council has exclusive rights to add, update, and disable distributions.
+ /// This separation of powers allows the Protocol Council to delegate distribution management
+ /// without giving up ownership of the contract.
+ /// @param incentiveCouncil The new Incentive Council address.
+ function setIncentiveCouncil(
+ address incentiveCouncil
+ ) external;
+
+ /// -----------------------------------------------------------------------
+ /// Incentive Council Functions
+ /// -----------------------------------------------------------------------
+
+ /// @notice Adds a new distribution to the emissions schedule.
+ /// @dev Only the Incentive Council can call this function.
+ /// The distribution is appended to the _distributions array and assigned the next available ID.
+ /// The distribution's weight is added to totalWeight, which must not exceed MAX_TOTAL_WEIGHT.
+ /// The startEpoch must be in the future to prevent immediate processing.
+ /// Cannot add distributions with DistributionType.Disabled.
+ /// Strategies must be in ascending order.
+ /// @param distribution The distribution to add.
+ /// @return distributionId The id of the added distribution.
+ function addDistribution(
+ Distribution calldata distribution
+ ) external returns (uint256 distributionId);
+
+ /// @notice Updates an existing distribution's parameters.
+ /// @dev Only the Incentive Council can call this function.
+ /// Replaces the entire distribution at the given ID with the new distribution.
+ /// Adjusts totalWeight by subtracting the old weight and adding the new weight.
+ /// Set `disabled` to true to disable the distribution.
+ /// Set `disabled` to false to re-enable the distribution.
+ /// Strategies must be in ascending order.
+ /// @param distributionId The id of the distribution to update.
+ /// @param distribution The new distribution parameters.
+ function updateDistribution(
+ uint256 distributionId,
+ Distribution calldata distribution
+ ) external;
+
+ /// -----------------------------------------------------------------------
+ /// View
+ /// -----------------------------------------------------------------------
+
+ /// @notice Returns the current Incentive Council address.
+ /// @return The Incentive Council address.
+ function incentiveCouncil() external view returns (address);
+
+ /// @notice Returns the total weight of all distributions.
+ /// @return The total weight of all distributions.
+ function totalWeight() external view returns (uint16);
+
+ /// @notice Returns the current epoch.
+ /// @return The current epoch.
+ function getCurrentEpoch() external view returns (uint256);
+
+ /// @notice Checks if the emissions can be triggered.
+ /// @return True if the cooldown has passed and the system is ready.
+ function isButtonPressable() external view returns (bool);
+
+ /// @notice Returns the next time the button will be pressable.
+ /// @return The next time the button will be pressable.
+ function nextTimeButtonPressable() external view returns (uint256);
+
+ /// @notice Returns the last time the button was pressable.
+ /// @return The last time the button was pressable.
+ function lastTimeButtonPressable() external view returns (uint256);
+
+ /// @notice Returns the total number of distributions.
+ /// @return The total number of distributions.
+ function getTotalProcessableDistributions() external view returns (uint256);
+
+ /// @notice Returns a distribution by index.
+ /// @param distributionId The id of the distribution.
+ /// @return The Distribution struct at the given index.
+ function getDistribution(
+ uint256 distributionId
+ ) external view returns (Distribution memory);
+
+ /// @notice Returns a subset of distributions.
+ /// @param start The start index of the distributions.
+ /// @param length The length of the distributions.
+ /// @return An append-only array of Distribution structs.
+ function getDistributions(
+ uint256 start,
+ uint256 length
+ ) external view returns (Distribution[] memory);
+}
diff --git a/src/contracts/interfaces/IRewardsCoordinator.sol b/src/contracts/interfaces/IRewardsCoordinator.sol
index bbf5e7cca3..49a1a44e05 100644
--- a/src/contracts/interfaces/IRewardsCoordinator.sol
+++ b/src/contracts/interfaces/IRewardsCoordinator.sol
@@ -10,6 +10,7 @@ import "./IStrategyManager.sol";
import "./IPauserRegistry.sol";
import "./IPermissionController.sol";
import "./IStrategy.sol";
+import "./IEmissionsController.sol";
interface IRewardsCoordinatorErrors {
/// @dev Thrown when msg.sender is not allowed to call a function
@@ -244,6 +245,7 @@ interface IRewardsCoordinatorTypes {
IDelegationManager delegationManager;
IStrategyManager strategyManager;
IAllocationManager allocationManager;
+ IEmissionsController emissionsController;
IPauserRegistry pauserRegistry;
IPermissionController permissionController;
uint32 CALCULATION_INTERVAL_SECONDS;
@@ -414,6 +416,17 @@ interface IRewardsCoordinatorEvents is IRewardsCoordinatorTypes {
IERC20 token,
uint256 claimedAmount
);
+
+ /// @notice Emitted when the fee recipient is set.
+ /// @param oldFeeRecipient The old fee recipient
+ /// @param newFeeRecipient The new fee recipient
+ event FeeRecipientSet(address indexed oldFeeRecipient, address indexed newFeeRecipient);
+
+ /// @notice Emitted when the opt in for protocol fee is set.
+ /// @param submitter The address of the submitter
+ /// @param oldValue The old value of the opt in for protocol fee
+ /// @param newValue The new value of the opt in for protocol fee
+ event OptInForProtocolFeeSet(address indexed submitter, bool indexed oldValue, bool indexed newValue);
}
/// @title Interface for the `IRewardsCoordinator` contract.
@@ -431,7 +444,23 @@ interface IRewardsCoordinator is IRewardsCoordinatorErrors, IRewardsCoordinatorE
uint256 initialPausedStatus,
address _rewardsUpdater,
uint32 _activationDelay,
- uint16 _defaultSplitBips
+ uint16 _defaultSplitBips,
+ address _feeRecipient
+ ) external;
+
+ /// @notice Creates a new rewards submission on behalf of the Eigen DA AVS, to be split amongst the
+ /// set of stakers delegated to operators who are registered to the `avs`
+ /// @param rewardsSubmissions The rewards submissions being created
+ /// @dev Expected to be called by the EmissionsController behalf of the Eigen DA AVS of which the submission is being made
+ /// @dev The duration of the `rewardsSubmission` cannot exceed `MAX_REWARDS_DURATION`
+ /// @dev The duration of the `rewardsSubmission` cannot be 0 and must be a multiple of `CALCULATION_INTERVAL_SECONDS`
+ /// @dev The tokens are sent to the `RewardsCoordinator` contract
+ /// @dev Strategies must be in ascending order of addresses to check for duplicates
+ /// @dev This function will revert if the `rewardsSubmission` is malformed,
+ /// e.g. if the `strategies` and `weights` arrays are of non-equal lengths
+ function createEigenDARewardsSubmission(
+ address avs,
+ RewardsSubmission[] calldata rewardsSubmissions
) external;
/// @notice Creates a new rewards submission on behalf of an AVS, to be split amongst the
@@ -459,7 +488,7 @@ interface IRewardsCoordinator is IRewardsCoordinatorErrors, IRewardsCoordinatorE
/// @notice Creates a new rewards submission for all earners across all AVSs.
/// Earners in this case indicating all operators and their delegated stakers. Undelegated stake
/// is not rewarded from this RewardsSubmission. This interface is only callable
- /// by the token hopper contract from the Eigen Foundation
+ /// by authorized rewardsForAllSubmitters, primarily the EmissionsController
/// @param rewardsSubmissions The rewards submissions being created
function createRewardsForAllEarners(
RewardsSubmission[] calldata rewardsSubmissions
@@ -606,6 +635,13 @@ interface IRewardsCoordinator is IRewardsCoordinatorErrors, IRewardsCoordinatorE
uint16 split
) external;
+ /// @notice Sets the fee recipient address which receives optional protocol fees
+ /// @dev Only callable by the contract owner
+ /// @param _feeRecipient The address of the new fee recipient
+ function setFeeRecipient(
+ address _feeRecipient
+ ) external;
+
/// @notice Sets the split for a specific operator for a specific avs
/// @param operator The operator who is setting the split
/// @param avs The avs for which the split is being set by the operator
@@ -643,6 +679,15 @@ interface IRewardsCoordinator is IRewardsCoordinatorErrors, IRewardsCoordinatorE
uint16 split
) external;
+ /// @notice Sets whether the submitter wants to pay the protocol fee on their rewards submissions.
+ /// @dev Submitters must opt-in to pay the protocol fee to be eligible for rewards.
+ /// @param submitter The address of the submitter that wants to opt-in or out of the protocol fee.
+ /// @param optInForProtocolFee Whether the submitter wants to pay the protocol fee.
+ function setOptInForProtocolFee(
+ address submitter,
+ bool optInForProtocolFee
+ ) external;
+
/// @notice Sets the permissioned `rewardsUpdater` address which can post new roots
/// @dev Only callable by the contract owner
/// @param _rewardsUpdater The address of the new rewardsUpdater
diff --git a/src/contracts/interfaces/IStrategy.sol b/src/contracts/interfaces/IStrategy.sol
index d15c17f107..b1e5eb6c51 100644
--- a/src/contracts/interfaces/IStrategy.sol
+++ b/src/contracts/interfaces/IStrategy.sol
@@ -66,6 +66,26 @@ interface IStrategy is IStrategyErrors, IStrategyEvents {
uint256 amountShares
) external returns (uint256);
+ /// @notice Hook invoked by the StrategyManager before adding deposit shares for a staker.
+ /// @dev Shares are added in the following scenarios:
+ /// - When a staker newly deposits into a strategy via StrategyManager.depositIntoStrategy
+ /// - When completing a withdrawal as shares via DelegationManager.completeQueuedWithdrawal
+ /// @param staker The address receiving shares.
+ /// @param shares The number of shares being added.
+ function beforeAddShares(
+ address staker,
+ uint256 shares
+ ) external;
+
+ /// @notice Hook invoked by the StrategyManager before removing deposit shares for a staker.
+ /// @dev Deposit shares are removed when a withdrawal is queued via DelegationManager.queueWithdrawals.
+ /// @param staker The address losing shares.
+ /// @param shares The number of shares being removed.
+ function beforeRemoveShares(
+ address staker,
+ uint256 shares
+ ) external;
+
/// @notice Used to convert a number of shares to the equivalent amount of underlying tokens for this strategy.
/// For a staker using this function and trying to calculate the amount of underlying tokens they have in total they
/// should input into `amountShares` their withdrawable shares read from the `DelegationManager` contract.
diff --git a/src/contracts/interfaces/IStrategyFactory.sol b/src/contracts/interfaces/IStrategyFactory.sol
index 9054b6827a..136265e5b4 100644
--- a/src/contracts/interfaces/IStrategyFactory.sol
+++ b/src/contracts/interfaces/IStrategyFactory.sol
@@ -4,6 +4,8 @@ pragma solidity ^0.8.27;
import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./IStrategy.sol";
+import "./IDurationVaultStrategy.sol";
+import "./ISemVerMixin.sol";
/// @title Interface for the `StrategyFactory` contract.
/// @author Layr Labs, Inc.
@@ -22,6 +24,9 @@ interface IStrategyFactory {
/// @notice Upgradeable beacon which new Strategies deployed by this contract point to
function strategyBeacon() external view returns (IBeacon);
+ /// @notice Upgradeable beacon which duration vault strategies deployed by this contract point to
+ function durationVaultBeacon() external view returns (IBeacon);
+
/// @notice Mapping token => Strategy contract for the token
/// The strategies in this mapping are deployed by the StrategyFactory.
/// The factory can only deploy a single strategy per token address
@@ -33,6 +38,11 @@ interface IStrategyFactory {
IERC20 token
) external view returns (IStrategy);
+ /// @notice Returns whether a token is blacklisted from having new strategies deployed.
+ function isBlacklisted(
+ IERC20 token
+ ) external view returns (bool);
+
/// @notice Deploy a new strategyBeacon contract for the ERC20 token.
/// @param token the token to deploy a strategy for
/// @dev A strategy contract must not yet exist for the token.
@@ -42,6 +52,17 @@ interface IStrategyFactory {
IERC20 token
) external returns (IStrategy newStrategy);
+ /// @notice Deploys a new duration-bound vault strategy contract.
+ /// @dev Enforces the same blacklist semantics as vanilla strategies.
+ function deployDurationVaultStrategy(
+ IDurationVaultStrategy.VaultConfig calldata config
+ ) external returns (IDurationVaultStrategy newVault);
+
+ /// @notice Returns all duration vaults that have ever been deployed for a given token.
+ function getDurationVaults(
+ IERC20 token
+ ) external view returns (IDurationVaultStrategy[] memory);
+
/// @notice Owner-only function to pass through a call to `StrategyManager.addStrategiesToDepositWhitelist`
function whitelistStrategies(
IStrategy[] calldata strategiesToWhitelist
@@ -52,9 +73,19 @@ interface IStrategyFactory {
IStrategy[] calldata strategiesToRemoveFromWhitelist
) external;
- /// @notice Emitted when the `strategyBeacon` is changed
- event StrategyBeaconModified(IBeacon previousBeacon, IBeacon newBeacon);
-
/// @notice Emitted whenever a slot is set in the `tokenStrategy` mapping
event StrategySetForToken(IERC20 token, IStrategy strategy);
+
+ /// @notice Emitted whenever a duration vault is deployed. The vault address uniquely identifies the deployment.
+ event DurationVaultDeployed(
+ IDurationVaultStrategy indexed vault,
+ IERC20 indexed underlyingToken,
+ address indexed vaultAdmin,
+ uint32 duration,
+ uint256 maxPerDeposit,
+ uint256 stakeCap,
+ string metadataURI,
+ address operatorSetAVS,
+ uint32 operatorSetId
+ );
}
diff --git a/src/contracts/strategies/DurationVaultStrategy.sol b/src/contracts/strategies/DurationVaultStrategy.sol
new file mode 100644
index 0000000000..a3625dbc98
--- /dev/null
+++ b/src/contracts/strategies/DurationVaultStrategy.sol
@@ -0,0 +1,421 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "./StrategyBase.sol";
+import "./DurationVaultStrategyStorage.sol";
+import "../interfaces/IDurationVaultStrategy.sol";
+import "../interfaces/IDelegationManager.sol";
+import "../interfaces/IAllocationManager.sol";
+import "../interfaces/IRewardsCoordinator.sol";
+import "../interfaces/IStrategyFactory.sol";
+import "../libraries/OperatorSetLib.sol";
+
+/// @title Duration-bound EigenLayer vault strategy with configurable deposit caps and windows.
+/// @author Layr Labs, Inc.
+/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
+contract DurationVaultStrategy is DurationVaultStrategyStorage, StrategyBase {
+ using OperatorSetLib for OperatorSet;
+
+ /// @notice Delegation manager reference used to register the vault as an operator.
+ IDelegationManager public immutable override delegationManager;
+
+ /// @notice Allocation manager reference used to register/allocate operator sets.
+ IAllocationManager public immutable override allocationManager;
+
+ /// @notice Rewards coordinator reference used to configure operator splits.
+ IRewardsCoordinator public immutable override rewardsCoordinator;
+
+ /// @notice Strategy factory reference used to check token blacklist status.
+ IStrategyFactory public immutable strategyFactory;
+
+ /// @dev Restricts function access to the vault administrator.
+ modifier onlyVaultAdmin() {
+ require(msg.sender == vaultAdmin, OnlyVaultAdmin());
+ _;
+ }
+
+ /// @dev Restricts function access to the vault arbitrator.
+ modifier onlyArbitrator() {
+ require(msg.sender == arbitrator, OnlyArbitrator());
+ _;
+ }
+
+ /// @param _strategyManager The StrategyManager contract.
+ /// @param _pauserRegistry The PauserRegistry contract.
+ /// @param _delegationManager The DelegationManager contract for operator registration.
+ /// @param _allocationManager The AllocationManager contract for operator set allocations.
+ /// @param _rewardsCoordinator The RewardsCoordinator contract for configuring splits.
+ /// @param _strategyFactory The StrategyFactory contract for token blacklist checks.
+ constructor(
+ IStrategyManager _strategyManager,
+ IPauserRegistry _pauserRegistry,
+ IDelegationManager _delegationManager,
+ IAllocationManager _allocationManager,
+ IRewardsCoordinator _rewardsCoordinator,
+ IStrategyFactory _strategyFactory
+ ) StrategyBase(_strategyManager, _pauserRegistry) {
+ require(
+ address(_delegationManager) != address(0) && address(_allocationManager) != address(0)
+ && address(_rewardsCoordinator) != address(0) && address(_strategyFactory) != address(0),
+ OperatorIntegrationInvalid()
+ );
+ delegationManager = _delegationManager;
+ allocationManager = _allocationManager;
+ rewardsCoordinator = _rewardsCoordinator;
+ strategyFactory = _strategyFactory;
+ _disableInitializers();
+ }
+
+ /// @notice Initializes the vault configuration.
+ /// @param config The vault configuration containing admin, duration, caps, and operator set info.
+ function initialize(
+ VaultConfig memory config
+ ) public initializer {
+ require(config.vaultAdmin != address(0), InvalidVaultAdmin());
+ require(config.arbitrator != address(0), InvalidArbitrator());
+ require(config.duration != 0 && config.duration <= MAX_DURATION, InvalidDuration());
+ _setTVLLimits(config.maxPerDeposit, config.stakeCap);
+ _initializeStrategyBase(config.underlyingToken);
+
+ vaultAdmin = config.vaultAdmin;
+ arbitrator = config.arbitrator;
+ duration = config.duration;
+ metadataURI = config.metadataURI;
+
+ _configureOperatorIntegration(config);
+ _state = VaultState.DEPOSITS;
+
+ emit VaultInitialized(
+ vaultAdmin,
+ arbitrator,
+ config.underlyingToken,
+ duration,
+ config.maxPerDeposit,
+ config.stakeCap,
+ metadataURI
+ );
+ }
+
+ /// @notice Locks the vault, preventing new deposits and withdrawals until maturity.
+ function lock() external override onlyVaultAdmin {
+ require(depositsOpen(), VaultAlreadyLocked());
+
+ // Verify this strategy is supported by the operator set before allocating.
+ IStrategy[] memory strategies = allocationManager.getStrategiesInOperatorSet(_operatorSet);
+ bool supported = false;
+ for (uint256 i = 0; i < strategies.length; ++i) {
+ if (strategies[i] == IStrategy(address(this))) {
+ supported = true;
+ break;
+ }
+ }
+ require(supported, StrategyNotSupportedByOperatorSet());
+
+ uint32 currentTimestamp = uint32(block.timestamp);
+ lockedAt = currentTimestamp;
+ unlockAt = currentTimestamp + duration;
+
+ _state = VaultState.ALLOCATIONS;
+
+ emit VaultLocked(lockedAt, unlockAt);
+
+ _allocateFullMagnitude();
+ }
+
+ /// @notice Marks the vault as matured once the configured duration elapses. Callable by anyone.
+ function markMatured() external override {
+ if (_state == VaultState.WITHDRAWALS) {
+ _attemptOperatorCleanup();
+ return;
+ }
+ require(_state == VaultState.ALLOCATIONS, DurationNotElapsed());
+ require(block.timestamp >= unlockAt, DurationNotElapsed());
+ _state = VaultState.WITHDRAWALS;
+ maturedAt = uint32(block.timestamp);
+ emit VaultMatured(maturedAt);
+
+ _attemptOperatorCleanup();
+ }
+
+ /// @notice Advances the vault to withdrawals early, after lock but before duration elapses.
+ /// @dev Only callable by the configured arbitrator.
+ function advanceToWithdrawals() external override onlyArbitrator {
+ if (_state == VaultState.WITHDRAWALS) {
+ _attemptOperatorCleanup();
+ return;
+ }
+ require(_state == VaultState.ALLOCATIONS, VaultNotLocked());
+ require(block.timestamp < unlockAt, DurationAlreadyElapsed());
+
+ _state = VaultState.WITHDRAWALS;
+ maturedAt = uint32(block.timestamp);
+
+ emit VaultMatured(maturedAt);
+ emit VaultAdvancedToWithdrawals(msg.sender, maturedAt);
+
+ _attemptOperatorCleanup();
+ }
+
+ /// @notice Updates the metadata URI describing the vault.
+ function updateMetadataURI(
+ string calldata newMetadataURI
+ ) external override onlyVaultAdmin {
+ metadataURI = newMetadataURI;
+ emit MetadataURIUpdated(newMetadataURI);
+ }
+
+ /// @notice Updates the delegation approver used for operator delegation approvals.
+ function updateDelegationApprover(
+ address newDelegationApprover
+ ) external override onlyVaultAdmin {
+ delegationManager.modifyOperatorDetails(address(this), newDelegationApprover);
+ }
+
+ /// @notice Updates the operator metadata URI emitted by the DelegationManager.
+ function updateOperatorMetadataURI(
+ string calldata newOperatorMetadataURI
+ ) external override onlyVaultAdmin {
+ delegationManager.updateOperatorMetadataURI(address(this), newOperatorMetadataURI);
+ }
+
+ /// @notice Sets the claimer for operator rewards accrued to the vault.
+ function setRewardsClaimer(
+ address claimer
+ ) external override onlyVaultAdmin {
+ rewardsCoordinator.setClaimerFor(address(this), claimer);
+ }
+
+ /// @notice Updates the TVL limits for max deposit per transaction and total stake cap.
+ /// @dev Only callable by the vault admin while deposits are open (before lock).
+ function updateTVLLimits(
+ uint256 newMaxPerDeposit,
+ uint256 newStakeCap
+ ) external override onlyVaultAdmin {
+ require(depositsOpen(), DepositsLocked());
+ _setTVLLimits(newMaxPerDeposit, newStakeCap);
+ }
+
+ /// @notice Allows the unpauser to update TVL limits, mirroring `StrategyBaseTVLLimits`.
+ function setTVLLimits(
+ uint256 newMaxPerDeposit,
+ uint256 newMaxTotalDeposits
+ ) external onlyUnpauser {
+ // Keep vault config changes constrained to the deposits window.
+ require(depositsOpen(), DepositsLocked());
+ _setTVLLimits(newMaxPerDeposit, newMaxTotalDeposits);
+ }
+
+ /// @notice Returns the current TVL limits (per-deposit and total stake cap).
+ /// @dev Helper for tests and parity with `StrategyBaseTVLLimits`.
+ function getTVLLimits() external view returns (uint256, uint256) {
+ return (maxPerDeposit, maxTotalDeposits);
+ }
+
+ /// @inheritdoc IDurationVaultStrategy
+ function unlockTimestamp() public view override returns (uint32) {
+ return unlockAt;
+ }
+
+ /// @inheritdoc IDurationVaultStrategy
+ function isLocked() public view override returns (bool) {
+ return _state != VaultState.DEPOSITS;
+ }
+
+ /// @inheritdoc IDurationVaultStrategy
+ function isMatured() public view override returns (bool) {
+ return _state == VaultState.WITHDRAWALS;
+ }
+
+ /// @inheritdoc IDurationVaultStrategy
+ function state() public view override returns (VaultState) {
+ return _state;
+ }
+
+ /// @inheritdoc IDurationVaultStrategy
+ function stakeCap() external view override returns (uint256) {
+ return maxTotalDeposits;
+ }
+
+ /// @inheritdoc IDurationVaultStrategy
+ function depositsOpen() public view override returns (bool) {
+ return _state == VaultState.DEPOSITS;
+ }
+
+ /// @inheritdoc IDurationVaultStrategy
+ function withdrawalsOpen() public view override returns (bool) {
+ return _state != VaultState.ALLOCATIONS;
+ }
+
+ /// @inheritdoc IStrategy
+ function beforeAddShares(
+ address staker,
+ uint256 shares
+ ) external view override(IStrategy, StrategyBase) onlyStrategyManager {
+ require(depositsOpen(), DepositsLocked());
+ require(!strategyFactory.isBlacklisted(underlyingToken), UnderlyingTokenBlacklisted());
+ require(delegationManager.delegatedTo(staker) == address(this), MustBeDelegatedToVaultOperator());
+
+ // Enforce per-deposit cap using the minted shares as proxy for underlying.
+ uint256 amountUnderlying = sharesToUnderlyingView(shares);
+ require(amountUnderlying <= maxPerDeposit, DepositExceedsMaxPerDeposit());
+
+ // Enforce total cap using operatorShares (active, non-queued shares).
+ // At this point, operatorShares hasn't been updated yet, so we add the new shares.
+ IStrategy[] memory strategies = new IStrategy[](1);
+ strategies[0] = IStrategy(address(this));
+ uint256 currentOperatorShares = delegationManager.getOperatorShares(address(this), strategies)[0];
+ uint256 postDepositUnderlying = sharesToUnderlyingView(currentOperatorShares + shares);
+ require(postDepositUnderlying <= maxTotalDeposits, BalanceExceedsMaxTotalDeposits());
+ }
+
+ /// @inheritdoc IStrategy
+ function beforeRemoveShares(
+ address,
+ uint256
+ ) external view override(IStrategy, StrategyBase) onlyStrategyManager {
+ // Queuing withdrawals is blocked during ALLOCATIONS. Withdrawals queued during
+ // DEPOSITS can complete during ALLOCATIONS since they were queued before lock.
+ require(_state != VaultState.ALLOCATIONS, WithdrawalsLockedDuringAllocations());
+ }
+
+ /// @notice Sets the maximum deposits (in underlyingToken) that this strategy will hold and accept per deposit.
+ /// @param newMaxPerDeposit The new maximum deposit amount per transaction.
+ /// @param newMaxTotalDeposits The new maximum total deposits allowed.
+ function _setTVLLimits(
+ uint256 newMaxPerDeposit,
+ uint256 newMaxTotalDeposits
+ ) internal {
+ emit MaxPerDepositUpdated(maxPerDeposit, newMaxPerDeposit);
+ emit MaxTotalDepositsUpdated(maxTotalDeposits, newMaxTotalDeposits);
+ require(newMaxPerDeposit <= newMaxTotalDeposits, MaxPerDepositExceedsMax());
+ maxPerDeposit = newMaxPerDeposit;
+ maxTotalDeposits = newMaxTotalDeposits;
+ }
+
+ /// @inheritdoc IDurationVaultStrategy
+ function operatorIntegrationConfigured() public pure override returns (bool) {
+ return true;
+ }
+
+ /// @inheritdoc IDurationVaultStrategy
+ function operatorSetInfo() external view override returns (address avs, uint32 operatorSetId) {
+ return (_operatorSet.avs, _operatorSet.id);
+ }
+
+ /// @inheritdoc IDurationVaultStrategy
+ function operatorSetRegistered() public view override returns (bool) {
+ return allocationManager.isMemberOfOperatorSet(address(this), _operatorSet);
+ }
+
+ /// @inheritdoc IDurationVaultStrategy
+ /// @dev Note: This returns true when the vault is in ALLOCATIONS state, but the actual
+ /// allocation on the AllocationManager may not be active immediately due to the
+ /// minWithdrawalDelayBlocks() delay between allocation and effect.
+ function allocationsActive() public view override returns (bool) {
+ return _state == VaultState.ALLOCATIONS;
+ }
+
+ /// @inheritdoc IStrategy
+ function explanation() external pure virtual override(IStrategy, StrategyBase) returns (string memory) {
+ return "Duration-bound vault strategy with configurable deposit caps and lock periods";
+ }
+
+ /// @notice Configures operator integration: registers as operator, registers for operator set, sets splits.
+ /// @param config The vault configuration containing operator set and delegation settings.
+ function _configureOperatorIntegration(
+ VaultConfig memory config
+ ) internal {
+ require(config.operatorSet.avs != address(0), OperatorIntegrationInvalid());
+ _operatorSet = config.operatorSet;
+
+ // Set allocation delay strictly greater than withdrawal delay to protect pre-lock queued withdrawals.
+ uint32 minWithdrawal = delegationManager.minWithdrawalDelayBlocks();
+ uint32 allocationDelay = minWithdrawal + 1;
+
+ // apply allocation delay at registration
+ delegationManager.registerAsOperator(config.delegationApprover, allocationDelay, config.operatorMetadataURI);
+
+ IAllocationManager.RegisterParams memory params;
+ params.avs = config.operatorSet.avs;
+ params.operatorSetIds = new uint32[](1);
+ params.operatorSetIds[0] = config.operatorSet.id;
+ params.data = config.operatorSetRegistrationData;
+ allocationManager.registerForOperatorSets(address(this), params);
+
+ // Set operator splits to 0 (100% of rewards go to stakers).
+ // Note: rewards can be configured at the AVS-level and operatorSet-level, so we set both.
+ rewardsCoordinator.setOperatorAVSSplit(address(this), config.operatorSet.avs, 0);
+ rewardsCoordinator.setOperatorSetSplit(address(this), config.operatorSet, 0);
+ rewardsCoordinator.setOperatorPISplit(address(this), 0);
+ }
+
+ /// @notice Allocates full magnitude (1 WAD) to the configured operator set.
+ /// @dev Reverts if there is already a pending allocation modification.
+ function _allocateFullMagnitude() internal {
+ // Ensure no pending allocation modification exists for this operator/operatorSet/strategy.
+ // Pending modifications would cause ModificationAlreadyPending() in AllocationManager.modifyAllocations.
+ IAllocationManager.Allocation memory alloc =
+ allocationManager.getAllocation(address(this), _operatorSet, IStrategy(address(this)));
+ require(alloc.effectBlock == 0, PendingAllocation());
+
+ IAllocationManager.AllocateParams[] memory params = new IAllocationManager.AllocateParams[](1);
+ params[0].operatorSet = _operatorSet;
+ params[0].strategies = new IStrategy[](1);
+ params[0].strategies[0] = IStrategy(address(this));
+ params[0].newMagnitudes = new uint64[](1);
+ params[0].newMagnitudes[0] = FULL_ALLOCATION;
+ allocationManager.modifyAllocations(address(this), params);
+ }
+
+ /// @notice Attempts to deallocate all magnitude from the configured operator set.
+ /// @dev Best-effort: failures are ignored to avoid bricking `markMatured()`.
+ function _deallocateAll() internal returns (bool) {
+ IAllocationManager.Allocation memory alloc =
+ allocationManager.getAllocation(address(this), _operatorSet, IStrategy(address(this)));
+ if (alloc.currentMagnitude == 0 && alloc.pendingDiff == 0) {
+ return true;
+ }
+ // If an allocation modification is pending, wait until it clears.
+ if (alloc.effectBlock != 0) {
+ return false;
+ }
+ IAllocationManager.AllocateParams[] memory params = new IAllocationManager.AllocateParams[](1);
+ params[0].operatorSet = _operatorSet;
+ params[0].strategies = new IStrategy[](1);
+ params[0].strategies[0] = IStrategy(address(this));
+ params[0].newMagnitudes = new uint64[](1);
+ params[0].newMagnitudes[0] = 0;
+ // This call is best-effort: failures should not brick `markMatured()` and lock user funds.
+ // We use a low-level call instead of try/catch to avoid wallet gas-estimation pitfalls.
+ (bool success,) = address(allocationManager)
+ .call(abi.encodeWithSelector(IAllocationManagerActions.modifyAllocations.selector, address(this), params));
+ return success;
+ }
+
+ /// @notice Attempts to deregister the vault from its configured operator set.
+ /// @dev Best-effort: failures are ignored to avoid bricking `markMatured()`.
+ function _deregisterFromOperatorSet() internal returns (bool) {
+ if (!allocationManager.isMemberOfOperatorSet(address(this), _operatorSet)) {
+ return true;
+ }
+ IAllocationManager.DeregisterParams memory params;
+ params.operator = address(this);
+ params.avs = _operatorSet.avs;
+ params.operatorSetIds = new uint32[](1);
+ params.operatorSetIds[0] = _operatorSet.id;
+ // This call is best-effort: failures should not brick `markMatured()` and lock user funds.
+ // We use a low-level call instead of try/catch to avoid wallet gas-estimation pitfalls.
+ (bool success,) = address(allocationManager)
+ .call(abi.encodeWithSelector(IAllocationManagerActions.deregisterFromOperatorSets.selector, params));
+ return success;
+ }
+
+ /// @notice Best-effort cleanup after maturity, with retry tracking.
+ function _attemptOperatorCleanup() internal {
+ bool deallocateSuccess = _deallocateAll();
+ emit DeallocateAttempted(deallocateSuccess);
+
+ bool deregisterSuccess = _deregisterFromOperatorSet();
+ emit DeregisterAttempted(deregisterSuccess);
+ }
+}
diff --git a/src/contracts/strategies/DurationVaultStrategyStorage.sol b/src/contracts/strategies/DurationVaultStrategyStorage.sol
new file mode 100644
index 0000000000..fa08ce0f44
--- /dev/null
+++ b/src/contracts/strategies/DurationVaultStrategyStorage.sol
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "../interfaces/IDurationVaultStrategy.sol";
+import "../libraries/OperatorSetLib.sol";
+
+/// @title Storage layout for DurationVaultStrategy.
+/// @author Layr Labs, Inc.
+/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
+abstract contract DurationVaultStrategyStorage is IDurationVaultStrategy {
+ /// @notice Constant representing the full allocation magnitude (1 WAD) for allocation manager calls.
+ uint64 internal constant FULL_ALLOCATION = 1e18;
+
+ /// @notice Maximum allowable duration (approximately 2 years).
+ uint32 internal constant MAX_DURATION = uint32(2 * 365 days);
+
+ /// @notice Address empowered to configure and lock the vault.
+ address public vaultAdmin;
+
+ /// @notice Address empowered to advance the vault to withdrawals early (after lock, before duration elapses).
+ address public arbitrator;
+
+ /// @notice The enforced lock duration once `lock` is called.
+ uint32 public duration;
+
+ /// @notice Timestamp when the vault was locked. Zero indicates the vault is not yet locked.
+ uint32 public lockedAt;
+
+ /// @notice Timestamp when the vault unlocks (set at lock time).
+ uint32 public unlockAt;
+
+ /// @notice Timestamp when the vault was marked as matured (purely informational).
+ uint32 public maturedAt;
+
+ /// @notice Tracks the lifecycle of the vault (deposits -> allocations -> withdrawals).
+ VaultState internal _state;
+
+ /// @notice Optional metadata URI describing the vault configuration.
+ string public metadataURI;
+
+ /// @notice Stored operator set metadata for integration with the allocation manager.
+ OperatorSet internal _operatorSet;
+
+ /// @notice The maximum deposit (in underlyingToken) that this strategy will accept per deposit.
+ uint256 public maxPerDeposit;
+
+ /// @notice The maximum deposits (in underlyingToken) that this strategy will hold.
+ uint256 public maxTotalDeposits;
+
+ /// @dev This empty reserved space is put in place to allow future versions to add new
+ /// variables without shifting down storage in the inheritance chain.
+ /// Storage slots used: vaultAdmin (1) + arbitrator (1) + duration/lockedAt/unlockAt/maturedAt/_state (packed, 1) +
+ /// metadataURI (1) + _operatorSet (1) + maxPerDeposit (1) + maxTotalDeposits (1) = 6.
+ /// Gap: 50 - 7 = 43.
+ uint256[43] private __gap;
+}
diff --git a/src/contracts/strategies/StrategyBase.sol b/src/contracts/strategies/StrategyBase.sol
index 170ce0ec98..e68f5940e3 100644
--- a/src/contracts/strategies/StrategyBase.sol
+++ b/src/contracts/strategies/StrategyBase.sol
@@ -99,7 +99,7 @@ contract StrategyBase is Initializable, Pausable, IStrategy {
IERC20 token,
uint256 amount
) external virtual override onlyWhenNotPaused(PAUSED_DEPOSITS) onlyStrategyManager returns (uint256 newShares) {
- // call hook to allow for any pre-deposit logic
+ // Run pre-deposit hook
_beforeDeposit(token, amount);
// copy `totalShares` value to memory, prior to any change
@@ -165,6 +165,18 @@ contract StrategyBase is Initializable, Pausable, IStrategy {
return amountOut;
}
+ /// @notice Hook invoked by the StrategyManager before adding deposit shares for a staker.
+ function beforeAddShares(
+ address, // staker
+ uint256 // shares
+ ) external virtual override onlyStrategyManager {}
+
+ /// @notice Hook invoked by the StrategyManager before removing deposit shares for a staker.
+ function beforeRemoveShares(
+ address, // staker
+ uint256 // shares
+ ) external virtual override onlyStrategyManager {}
+
/// @notice Called in the external `deposit` function, before any logic is executed. Expected to be overridden if strategies want such logic.
/// @param token The token being deposited
function _beforeDeposit(
diff --git a/src/contracts/strategies/StrategyFactory.sol b/src/contracts/strategies/StrategyFactory.sol
index 43f80ca237..0c61569735 100644
--- a/src/contracts/strategies/StrategyFactory.sol
+++ b/src/contracts/strategies/StrategyFactory.sol
@@ -5,6 +5,8 @@ import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
import "./StrategyFactoryStorage.sol";
import "./StrategyBase.sol";
+import "./DurationVaultStrategy.sol";
+import "../interfaces/IDurationVaultStrategy.sol";
import "../permissions/Pausable.sol";
/// @title Factory contract for deploying BeaconProxies of a Strategy contract implementation for arbitrary ERC20 tokens
@@ -18,23 +20,31 @@ contract StrategyFactory is StrategyFactoryStorage, OwnableUpgradeable, Pausable
/// @notice EigenLayer's StrategyManager contract
IStrategyManager public immutable strategyManager;
+ /// @notice Upgradeable beacon used for baseline strategies deployed by this contract.
+ IBeacon public immutable strategyBeacon;
+
+ /// @notice Upgradeable beacon used for duration vault strategies deployed by this contract.
+ IBeacon public immutable durationVaultBeacon;
+
/// @notice Since this contract is designed to be initializable, the constructor simply sets the immutable variables.
constructor(
IStrategyManager _strategyManager,
- IPauserRegistry _pauserRegistry
+ IPauserRegistry _pauserRegistry,
+ IBeacon _strategyBeacon,
+ IBeacon _durationVaultBeacon
) Pausable(_pauserRegistry) {
strategyManager = _strategyManager;
+ strategyBeacon = _strategyBeacon;
+ durationVaultBeacon = _durationVaultBeacon;
_disableInitializers();
}
function initialize(
address _initialOwner,
- uint256 _initialPausedStatus,
- IBeacon _strategyBeacon
+ uint256 _initialPausedStatus
) public virtual initializer {
_transferOwnership(_initialOwner);
_setPausedStatus(_initialPausedStatus);
- _setStrategyBeacon(_strategyBeacon);
}
/// @notice Deploy a new StrategyBase contract for the ERC20 token, using a beacon proxy
@@ -100,6 +110,30 @@ contract StrategyFactory is StrategyFactoryStorage, OwnableUpgradeable, Pausable
strategyManager.addStrategiesToDepositWhitelist(strategiesToWhitelist);
}
+ /// @notice Deploys a new duration vault strategy backed by the configured beacon.
+ function deployDurationVaultStrategy(
+ IDurationVaultStrategy.VaultConfig calldata config
+ ) external onlyWhenNotPaused(PAUSED_NEW_STRATEGIES) returns (IDurationVaultStrategy newVault) {
+ IERC20 underlyingToken = config.underlyingToken;
+ require(!isBlacklisted[underlyingToken], BlacklistedToken());
+
+ newVault = IDurationVaultStrategy(
+ address(
+ new BeaconProxy(
+ address(durationVaultBeacon),
+ abi.encodeWithSelector(DurationVaultStrategy.initialize.selector, config)
+ )
+ )
+ );
+
+ _registerDurationVault(underlyingToken, newVault);
+ IStrategy[] memory strategiesToWhitelist = new IStrategy[](1);
+ strategiesToWhitelist[0] = newVault;
+ strategyManager.addStrategiesToDepositWhitelist(strategiesToWhitelist);
+
+ _emitDurationVaultDeployed(newVault, underlyingToken, config);
+ }
+
/// @notice Owner-only function to pass through a call to `StrategyManager.removeStrategiesFromDepositWhitelist`
function removeStrategiesFromWhitelist(
IStrategy[] calldata strategiesToRemoveFromWhitelist
@@ -115,10 +149,37 @@ contract StrategyFactory is StrategyFactoryStorage, OwnableUpgradeable, Pausable
emit StrategySetForToken(token, strategy);
}
- function _setStrategyBeacon(
- IBeacon _strategyBeacon
+ /// @inheritdoc IStrategyFactory
+ function getDurationVaults(
+ IERC20 token
+ ) external view returns (IDurationVaultStrategy[] memory) {
+ // NOTE: Consider using the public durationVaultsByToken mapping directly
+ // for on-chain integrations to avoid potential OOG issues with large arrays.
+ return durationVaultsByToken[token];
+ }
+
+ function _registerDurationVault(
+ IERC20 token,
+ IDurationVaultStrategy vault
) internal {
- emit StrategyBeaconModified(strategyBeacon, _strategyBeacon);
- strategyBeacon = _strategyBeacon;
+ durationVaultsByToken[token].push(vault);
+ }
+
+ function _emitDurationVaultDeployed(
+ IDurationVaultStrategy vault,
+ IERC20 underlyingToken,
+ IDurationVaultStrategy.VaultConfig calldata config
+ ) internal {
+ emit DurationVaultDeployed(
+ vault,
+ underlyingToken,
+ config.vaultAdmin,
+ config.duration,
+ config.maxPerDeposit,
+ config.stakeCap,
+ config.metadataURI,
+ config.operatorSet.avs,
+ config.operatorSet.id
+ );
}
}
diff --git a/src/contracts/strategies/StrategyFactoryStorage.sol b/src/contracts/strategies/StrategyFactoryStorage.sol
index 943b820e38..a6626324c6 100644
--- a/src/contracts/strategies/StrategyFactoryStorage.sol
+++ b/src/contracts/strategies/StrategyFactoryStorage.sol
@@ -7,8 +7,9 @@ import "../interfaces/IStrategyFactory.sol";
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
abstract contract StrategyFactoryStorage is IStrategyFactory {
- /// @notice Upgradeable beacon which new Strategies deployed by this contract point to
- IBeacon public strategyBeacon;
+ /// @dev Deprecated: strategyBeacon is now immutable in StrategyFactory.
+ /// Slot preserved for storage layout compatibility with existing proxies.
+ IBeacon private __deprecated_strategyBeacon;
/// @notice Mapping token => Strategy contract for the token
/// The strategies in this mapping are deployed by the StrategyFactory.
@@ -22,8 +23,13 @@ abstract contract StrategyFactoryStorage is IStrategyFactory {
/// @notice Mapping token => Whether or not a strategy can be deployed for the token
mapping(IERC20 => bool) public isBlacklisted;
+ /// @notice Mapping token => all duration vault strategies deployed for the token.
+ mapping(IERC20 => IDurationVaultStrategy[]) public durationVaultsByToken;
+
/// @dev This empty reserved space is put in place to allow future versions to add new
/// variables without shifting down storage in the inheritance chain.
/// See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
- uint256[48] private __gap;
+ /// Storage slots used: __deprecated_strategyBeacon (1) + deployedStrategies (1) + isBlacklisted (1) +
+ /// durationVaultsByToken (1) = 4 slots. Gap: 51 - 4 = 47.
+ uint256[47] private __gap;
}
diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol
index 6e92ed0bab..9af5e01205 100644
--- a/src/test/integration/IntegrationBase.t.sol
+++ b/src/test/integration/IntegrationBase.t.sol
@@ -1204,6 +1204,11 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter {
}
}
+ function assert_Snap_OperatorSetRegistered(OperatorSet memory operatorSet, string memory err) internal {
+ assertTrue(_getPrevOperatorSetRegistered(operatorSet), err);
+ assertTrue(_getOperatorSetRegistered(operatorSet), err);
+ }
+
///
/// SNAPSHOT ASSERTIONS: BEACON CHAIN AND AVS SLASHING
///
@@ -2724,6 +2729,14 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter {
(operatorSets, allocations) = allocationManager.getStrategyAllocations(operator, strategy);
}
+ function _getPrevOperatorSetRegistered(OperatorSet memory operatorSet) internal timewarp returns (bool) {
+ return _getOperatorSetRegistered(operatorSet);
+ }
+
+ function _getOperatorSetRegistered(OperatorSet memory operatorSet) internal view returns (bool) {
+ return allocationManager.isOperatorSet(operatorSet);
+ }
+
function _getPrevIsSlashable(User operator, OperatorSet memory operatorSet) internal timewarp returns (bool) {
return _getIsSlashable(operator, operatorSet);
}
@@ -3133,4 +3146,320 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter {
(Withdrawal[] memory withdrawals,) = delegationManager.getQueuedWithdrawals(address(staker));
return withdrawals;
}
+
+ ///
+ /// EMISSIONS CONTROLLER HELPERS
+ ///
+
+ function _getTotalProcessableDistributions() internal view returns (uint) {
+ return emissionsController.getTotalProcessableDistributions();
+ }
+
+ function _getPrevTotalProcessableDistributions() internal timewarp returns (uint) {
+ return _getTotalProcessableDistributions();
+ }
+
+ function _getEmissionsControllerEigenBalance() internal view returns (uint) {
+ return EIGEN.balanceOf(address(emissionsController));
+ }
+
+ function _getPrevEmissionsControllerEigenBalance() internal timewarp returns (uint) {
+ return _getEmissionsControllerEigenBalance();
+ }
+
+ function _getIncentiveCouncilEigenBalance(address incentiveCouncil) internal view returns (uint) {
+ return EIGEN.balanceOf(incentiveCouncil);
+ }
+
+ function _getPrevIncentiveCouncilEigenBalance(address incentiveCouncil) internal timewarp returns (uint) {
+ return _getIncentiveCouncilEigenBalance(incentiveCouncil);
+ }
+
+ function _getTotalWeight() internal view returns (uint16) {
+ return emissionsController.totalWeight();
+ }
+
+ function _getPrevTotalWeight() internal timewarp returns (uint16) {
+ return _getTotalWeight();
+ }
+
+ function _getCurrentEpoch() internal view returns (uint) {
+ return emissionsController.getCurrentEpoch();
+ }
+
+ function _getPrevCurrentEpoch() internal timewarp returns (uint) {
+ return _getCurrentEpoch();
+ }
+
+ function _getDistribution(uint distributionId) internal view returns (IEmissionsControllerTypes.Distribution memory) {
+ return emissionsController.getDistribution(distributionId);
+ }
+
+ function _getPrevDistribution(uint distributionId) internal timewarp returns (IEmissionsControllerTypes.Distribution memory) {
+ return _getDistribution(distributionId);
+ }
+
+ function _getIsButtonPressable() internal view returns (bool) {
+ return emissionsController.isButtonPressable();
+ }
+
+ function _getPrevIsButtonPressable() internal timewarp returns (bool) {
+ return _getIsButtonPressable();
+ }
+
+ // ========================================
+ // EmissionsController Storage Slot Helpers
+ // ========================================
+ // These functions use vm.load() to read internal EmissionsController state directly from storage.
+ //
+ // Storage Layout for EmissionsController (from `forge inspect EmissionsController storageLayout`):
+ // - Slot 201: incentiveCouncil (address) + totalWeight (uint16)
+ // - Slot 202: _distributions (dynamic array)
+ // - Slot 203: _epochs mapping (mapping(uint256 => Epoch))
+ //
+ // For mappings: keccak256(abi.encode(key, slot))
+ // For the Epoch struct at the mapping location:
+ // Solidity packs from lowest-order bytes (right-to-left):
+ // - Byte 0 (rightmost): bool minted (1 byte)
+ // - Bytes 1-8: uint64 totalProcessed (8 bytes)
+ // - Bytes 9-16: uint64 totalAdded (8 bytes)
+ // - Bytes 17-31: unused
+ // All packed into a single 32-byte slot
+ // ========================================
+
+ /// @dev Storage slot for _epochs mapping in EmissionsController (slot 203)
+ uint private constant EPOCHS_MAPPING_SLOT = 203;
+
+ /// @dev Reads the Epoch struct from storage for a given epoch number
+ function _getEpochFromStorage(uint epoch) internal view returns (bool minted, uint64 totalProcessed, uint64 totalAdded) {
+ // Calculate storage slot for _epochs[epoch]
+ bytes32 slot = keccak256(abi.encode(epoch, EPOCHS_MAPPING_SLOT));
+
+ // Read the packed slot
+ bytes32 data = vm.load(address(emissionsController), slot);
+ uint rawData = uint(data);
+
+ // Extract fields from packed storage (right-to-left layout)
+ // minted: byte 0 (rightmost 8 bits)
+ // totalProcessed: bytes 1-8 (next 64 bits, shift right 8 bits)
+ // totalAdded: bytes 9-16 (next 64 bits, shift right 72 bits)
+
+ minted = (rawData & 0xFF) != 0;
+ totalProcessed = uint64((rawData >> 8) & 0xFFFFFFFFFFFFFFFF);
+ totalAdded = uint64((rawData >> 72) & 0xFFFFFFFFFFFFFFFF);
+
+ return (minted, totalProcessed, totalAdded);
+ }
+
+ /// @dev Helper to get total number of distributions (both processable and added this epoch)
+ /// NOTE: This calculates the length based on EmissionsController logic:
+ /// - Before emissions start: totalDistributions = totalProcessable
+ /// - After emissions start: totalDistributions = totalProcessable + totalAdded
+ function _getTotalDistributions() internal view returns (uint) {
+ uint currentEpoch = _getCurrentEpoch();
+ if (currentEpoch == type(uint).max) return _getTotalProcessableDistributions();
+ // After emissions start: _distributions.length = totalProcessable + totalAdded
+ uint totalProcessable = _getTotalProcessableDistributions();
+ uint totalAdded = _getEpochTotalAdded(currentEpoch);
+ return totalProcessable + totalAdded;
+ }
+
+ function _getPrevTotalDistributions() internal timewarp returns (uint) {
+ return _getTotalDistributions();
+ }
+
+ function _getEpochTotalAdded(uint epoch) internal view returns (uint) {
+ (,, uint64 totalAdded) = _getEpochFromStorage(epoch);
+ return uint(totalAdded);
+ }
+
+ function _getEpochTotalProcessed(uint epoch) internal view returns (uint) {
+ (, uint64 totalProcessed,) = _getEpochFromStorage(epoch);
+ return uint(totalProcessed);
+ }
+
+ function _getPrevEpochTotalProcessed(uint epoch) internal timewarp returns (uint) {
+ return _getEpochTotalProcessed(epoch);
+ }
+
+ function _getEpochMinted(uint epoch) internal view returns (bool) {
+ (bool minted,,) = _getEpochFromStorage(epoch);
+ return minted;
+ }
+
+ function _getPrevEpochMinted(uint epoch) internal timewarp returns (bool) {
+ return _getEpochMinted(epoch);
+ }
+
+ /// Assertions
+
+ function assert_Snap_Added_TotalProcessableDistributions(uint added, string memory err) internal {
+ uint prev = _getPrevTotalProcessableDistributions();
+ uint cur = _getTotalProcessableDistributions();
+ assertEq(prev + added, cur, err);
+ }
+
+ function assert_Snap_Unchanged_TotalProcessableDistributions(string memory err) internal {
+ uint prev = _getPrevTotalProcessableDistributions();
+ uint cur = _getTotalProcessableDistributions();
+ assertEq(prev, cur, err);
+ }
+
+ function assert_Snap_Added_EmissionsController_EigenBalance(uint added, string memory err) internal {
+ uint prev = _getPrevEmissionsControllerEigenBalance();
+ uint cur = _getEmissionsControllerEigenBalance();
+ assertApproxEqAbs(prev + added, cur, 100, err);
+ }
+
+ function assert_Snap_Removed_EmissionsController_EigenBalance(uint removed, string memory err) internal {
+ uint prev = _getPrevEmissionsControllerEigenBalance();
+ uint cur = _getEmissionsControllerEigenBalance();
+ assertApproxEqAbs(prev - removed, cur, 100, err);
+ }
+
+ function assert_Snap_Unchanged_EmissionsController_EigenBalance(string memory err) internal {
+ uint prev = _getPrevEmissionsControllerEigenBalance();
+ uint cur = _getEmissionsControllerEigenBalance();
+ assertEq(prev, cur, err);
+ }
+
+ function assert_Snap_Added_IncentiveCouncil_EigenBalance(address incentiveCouncil, uint added, string memory err) internal {
+ uint prev = _getPrevIncentiveCouncilEigenBalance(incentiveCouncil);
+ uint cur = _getIncentiveCouncilEigenBalance(incentiveCouncil);
+ assertApproxEqAbs(prev + added, cur, 100, err);
+ }
+
+ function assert_Snap_Unchanged_IncentiveCouncil_EigenBalance(address incentiveCouncil, string memory err) internal {
+ uint prev = _getPrevIncentiveCouncilEigenBalance(incentiveCouncil);
+ uint cur = _getIncentiveCouncilEigenBalance(incentiveCouncil);
+ assertEq(prev, cur, err);
+ }
+
+ function assert_Snap_Added_TotalWeight(uint added, string memory err) internal {
+ uint prev = _getPrevTotalWeight();
+ uint cur = _getTotalWeight();
+ assertEq(prev + added, cur, err);
+ }
+
+ function assert_Snap_Updated_TotalWeight(uint64 expected, string memory err) internal {
+ uint cur = _getTotalWeight();
+ assertEq(cur, expected, err);
+ }
+
+ function assert_Snap_Unchanged_TotalWeight(string memory err) internal {
+ uint prev = _getPrevTotalWeight();
+ uint64 cur = _getTotalWeight();
+ assertEq(prev, cur, err);
+ }
+
+ function assert_Snap_Created_Distribution(uint distributionId, string memory err) internal {
+ uint prevCount = _getPrevTotalProcessableDistributions();
+ uint curCount = _getTotalProcessableDistributions();
+ assertTrue(curCount > prevCount, err);
+ assertTrue(distributionId < curCount, err);
+ }
+
+ function assert_Snap_Updated_Distribution(
+ uint distributionId,
+ IEmissionsControllerTypes.Distribution memory expectedDistribution,
+ string memory err
+ ) internal {
+ IEmissionsControllerTypes.Distribution memory storedDistribution = _getDistribution(distributionId);
+ assertEq(uint8(storedDistribution.distributionType), uint8(expectedDistribution.distributionType), err);
+ assertEq(storedDistribution.weight, expectedDistribution.weight, err);
+ assertEq(storedDistribution.startEpoch, expectedDistribution.startEpoch, err);
+ assertEq(storedDistribution.totalEpochs, expectedDistribution.totalEpochs, err);
+ }
+
+ function assert_Snap_ButtonPressed(string memory err) internal {
+ bool prevPressable = _getPrevIsButtonPressable();
+ bool curPressable = _getIsButtonPressable();
+
+ // If button was pressable before, pressing it should either:
+ // - Keep it pressable (if there are more distributions to process), or
+ // - Make it not pressable (if all distributions processed)
+ assertTrue(prevPressable, string.concat(err, ": button should have been pressable before pressing"));
+ }
+
+ function assert_Snap_Unchanged_CurrentEpoch(string memory err) internal {
+ uint prev = _getPrevCurrentEpoch();
+ uint cur = _getCurrentEpoch();
+ assertEq(prev, cur, err);
+ }
+
+ function assert_Snap_Updated_CurrentEpoch(uint expected, string memory err) internal {
+ uint cur = _getCurrentEpoch();
+ assertEq(cur, expected, err);
+ }
+
+ function assert_Snap_Added_TotalDistributions(uint added, string memory err) internal {
+ uint prev = _getPrevTotalDistributions();
+ uint cur = _getTotalDistributions();
+ assertEq(prev + added, cur, err);
+ }
+
+ function assert_Snap_Unchanged_TotalDistributions(string memory err) internal {
+ uint prev = _getPrevTotalDistributions();
+ uint cur = _getTotalDistributions();
+ assertEq(prev, cur, err);
+ }
+
+ function assert_Snap_Unchanged_ButtonPressability(string memory err) internal {
+ bool prev = _getPrevIsButtonPressable();
+ bool cur = _getIsButtonPressable();
+ assertEq(prev, cur, err);
+ }
+
+ function assert_TotalWeight_LTE_MaxWeight(string memory err) internal view {
+ uint16 cur = _getTotalWeight();
+ assertTrue(cur <= emissionsController.MAX_TOTAL_WEIGHT(), err);
+ }
+
+ function assert_Snap_Updated_EpochTotalProcessed(uint epoch, uint expected, string memory err) internal {
+ uint cur = _getEpochTotalProcessed(epoch);
+ assertEq(cur, expected, err);
+ }
+
+ function assert_Snap_Increased_EpochTotalProcessed(uint epoch, string memory err) internal {
+ uint prev = _getPrevEpochTotalProcessed(epoch);
+ uint cur = _getEpochTotalProcessed(epoch);
+ assertTrue(cur > prev, err);
+ }
+
+ function assert_Snap_EpochMinted(uint epoch, bool expected, string memory err) internal {
+ bool cur = _getEpochMinted(epoch);
+ assertEq(cur, expected, err);
+ }
+
+ function assert_Distribution_StoredCorrectly(
+ uint distributionId,
+ IEmissionsControllerTypes.Distribution memory expected,
+ string memory err
+ ) internal view {
+ IEmissionsControllerTypes.Distribution memory stored = _getDistribution(distributionId);
+ assertEq(uint8(stored.distributionType), uint8(expected.distributionType), string.concat(err, ": distributionType"));
+ assertEq(stored.weight, expected.weight, string.concat(err, ": weight"));
+ assertEq(stored.startEpoch, expected.startEpoch, string.concat(err, ": startEpoch"));
+ assertEq(stored.totalEpochs, expected.totalEpochs, string.concat(err, ": totalEpochs"));
+ assertEq(stored.operatorSet.avs, expected.operatorSet.avs, string.concat(err, ": operatorSet.avs"));
+ assertEq(stored.operatorSet.id, expected.operatorSet.id, string.concat(err, ": operatorSet.operatorSetId"));
+ assertEq(
+ stored.strategiesAndMultipliers.length,
+ expected.strategiesAndMultipliers.length,
+ string.concat(err, ": strategiesAndMultipliers.length")
+ );
+ }
+
+ function assert_Distributions_Match_Expected(
+ uint[] memory distributionIds,
+ IEmissionsControllerTypes.Distribution[] memory expectedDistributions,
+ string memory err
+ ) internal view {
+ assertEq(distributionIds.length, expectedDistributions.length, string.concat(err, ": array length mismatch"));
+ for (uint i = 0; i < distributionIds.length; ++i) {
+ assert_Distribution_StoredCorrectly(
+ distributionIds[i], expectedDistributions[i], string.concat(err, ": dist[", vm.toString(i), "]")
+ );
+ }
+ }
}
diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol
index d3197b3611..95554ad606 100644
--- a/src/test/integration/IntegrationChecks.t.sol
+++ b/src/test/integration/IntegrationChecks.t.sol
@@ -1182,4 +1182,342 @@ contract IntegrationCheckUtils is IntegrationBase {
staker, allocateParams, slashingParams, "should have decreased withdrawable shares correctly"
);
}
+
+ /// -----------------------------------------------------------------------
+ /// EMISSIONS CONTROLLER CHECKS
+ /// -----------------------------------------------------------------------
+
+ function check_addDists_State(
+ uint[] memory distributionIds,
+ IEmissionsControllerTypes.Distribution[] memory distributions,
+ uint16 expectedTotalWeight
+ ) internal {
+ // === Input Validation ===
+ assertEq(distributionIds.length, distributions.length, "length mismatch");
+
+ // === State Invariants ===
+
+ uint currentEpoch = emissionsController.getCurrentEpoch();
+
+ // 1. Check that total weight was updated correctly.
+ assert_Snap_Updated_TotalWeight(expectedTotalWeight, "total weight != expected total weight");
+
+ // 2. Check that all checks (found in `EmissionsController._checkDistribution`) were passed before adding.
+ // 2a) If the distribution type requires an operator set, check that the operator set was registered before adding.
+ // 2b) If emissions have started, check that the start epoch is in the future (we allow adding before emissions start).
+ // 2c) Check that the total weight after adding and ensuring it does not exceed the maximum total weight (100%).
+ // 2d) Check that the rewards submissions array is not empty for non-Manual distributions.
+ // 3. Check that the distributions were stored correctly.
+ // 4. Check that N distributions were added.
+ // 5. Check that the total processable, emissions controller balance, incentive council balance, current epoch, and button pressability were unchanged.
+ uint totalWeightBefore = _getTotalWeight();
+ uint totalWeightAdded = 0;
+ for (uint i = 0; i < distributionIds.length; ++i) {
+ IEmissionsControllerTypes.Distribution memory distribution = distributions[i];
+
+ // 2a) If the distribution type requires an operator set, check that the operator set was registered before adding.
+ if (
+ distribution.distributionType == IEmissionsControllerTypes.DistributionType.OperatorSetTotalStake
+ || distribution.distributionType == IEmissionsControllerTypes.DistributionType.OperatorSetUniqueStake
+ ) assert_Snap_OperatorSetRegistered(distribution.operatorSet, "operator set must be registered");
+
+ // 2b) If emissions have started, check that the start epoch is in the future (we allow adding before emissions start).
+ if (currentEpoch != type(uint).max) assertGt(distribution.startEpoch, currentEpoch, "start epoch must be in the future");
+
+ // 2c) Check that the total weight after adding and ensuring it does not exceed the maximum total weight (100%).
+ totalWeightAdded += distribution.weight; // Check after the loop.
+
+ // 2d) Check that the rewards submissions array is not empty for non-Manual distributions.
+ if (distribution.distributionType != IEmissionsControllerTypes.DistributionType.Manual) {
+ assertGt(distribution.strategiesAndMultipliers.length, 0, "rewards submissions array is empty for non-Manual distributions");
+ }
+
+ // 3. Check that the distributions were stored correctly.
+ assert_Distribution_StoredCorrectly(distributionIds[i], distribution, "state should be updated");
+ }
+ // 2c) Check that the total weight was updated correctly.
+ assert_Snap_Added_TotalWeight(totalWeightAdded, "total weight must be added correctly");
+ assert_TotalWeight_LTE_MaxWeight("total weight must not exceed the maximum total weight");
+
+ // 4. Check that the total distributions were increased by the number of additions.
+ assert_Snap_Added_TotalDistributions(distributionIds.length, "total distributions must be added correctly");
+
+ // 5. Check that the total processable, emissions controller balance, incentive council balance, current epoch, and button pressability were unchanged.
+ if (currentEpoch == type(uint).max) {
+ assert_Snap_Added_TotalProcessableDistributions(
+ distributionIds.length, "total processable should increase before emissions start"
+ );
+ } else {
+ assert_Snap_Unchanged_TotalProcessableDistributions("total processable should be unchanged after emissions start");
+ }
+ assert_Snap_Unchanged_EmissionsController_EigenBalance("EC balance should be unchanged");
+ assert_Snap_Unchanged_IncentiveCouncil_EigenBalance(emissionsController.incentiveCouncil(), "IC balance should be unchanged");
+ assert_Snap_Unchanged_CurrentEpoch("current epoch should be unchanged");
+ assert_Snap_Unchanged_ButtonPressability("button pressability should be unchanged");
+ }
+
+ function check_updateDists_State(
+ uint[] memory distributionIds,
+ IEmissionsControllerTypes.Distribution[] memory oldDists,
+ IEmissionsControllerTypes.Distribution[] memory newDists
+ ) internal {
+ // === Input Validation ===
+ assertEq(distributionIds.length, oldDists.length, "oldDists length mismatch");
+ assertEq(distributionIds.length, newDists.length, "newDists length mismatch");
+
+ // === State Invariants ===
+
+ uint currentEpoch = emissionsController.getCurrentEpoch();
+
+ // 1. Check that total weight was updated correctly (old weights removed, new weights added).
+ uint16 totalOldWeight = 0;
+ uint16 totalNewWeight = 0;
+ for (uint i = 0; i < distributionIds.length; ++i) {
+ totalOldWeight += uint16(oldDists[i].weight);
+ totalNewWeight += uint16(newDists[i].weight);
+ }
+ uint16 prevTotalWeight = _getPrevTotalWeight();
+ uint16 expectedTotalWeight = prevTotalWeight - totalOldWeight + totalNewWeight;
+ assert_Snap_Updated_TotalWeight(expectedTotalWeight, "total weight != expected total weight");
+
+ // 2. Check that all checks (found in `EmissionsController._checkDistribution`) were passed before updating.
+ // 2a) If the distribution type requires an operator set, check that the operator set was registered before updating.
+ // 2b) If emissions have started, check that the start epoch is in the future (we allow updating before emissions start).
+ // 2c) Check that the total weight after updating and ensuring it does not exceed the maximum total weight (100%).
+ // 2d) Check that the rewards submissions array is not empty for non-Manual distributions.
+ // 3. Check that the distributions were updated correctly in storage.
+ // 4. Check that distribution IDs remain valid.
+ // 5. Check that N distributions remain (no addition or removal).
+ // 6. Check that the total processable, emissions controller balance, incentive council balance, current epoch, and button pressability were unchanged.
+ for (uint i = 0; i < distributionIds.length; ++i) {
+ IEmissionsControllerTypes.Distribution memory distribution = newDists[i];
+
+ // 2a) If the distribution type requires an operator set, check that the operator set was registered before updating.
+ if (
+ distribution.distributionType == IEmissionsControllerTypes.DistributionType.OperatorSetTotalStake
+ || distribution.distributionType == IEmissionsControllerTypes.DistributionType.OperatorSetUniqueStake
+ ) assert_Snap_OperatorSetRegistered(distribution.operatorSet, "operator set must be registered");
+
+ // 2b) If emissions have started, check that the start epoch is in the future (we allow updating before emissions start).
+ if (currentEpoch != type(uint).max) assertGt(distribution.startEpoch, currentEpoch, "start epoch must be in the future");
+
+ // 2c) Already checked above after the loop (total weight check).
+
+ // 2d) Check that the rewards submissions array is not empty for non-Manual distributions.
+ if (distribution.distributionType != IEmissionsControllerTypes.DistributionType.Manual) {
+ assertGt(distribution.strategiesAndMultipliers.length, 0, "rewards submissions array is empty for non-Manual distributions");
+ }
+
+ // 3. Check that the distributions were updated correctly in storage.
+ assert_Distribution_StoredCorrectly(distributionIds[i], distribution, "distribution should be stored correctly");
+
+ // 4. Check that distribution IDs remain valid.
+ assertTrue(distributionIds[i] < _getTotalDistributions(), "distribution ID should be valid");
+ }
+ // 2c) Check that the total weight does not exceed the maximum total weight.
+ assert_TotalWeight_LTE_MaxWeight("total weight must not exceed the maximum total weight");
+
+ // 5. Check that the total distributions were unchanged (update doesn't add/remove, just modifies).
+ assert_Snap_Unchanged_TotalDistributions("total distributions must be unchanged");
+
+ // 6. Check that the total processable, emissions controller balance, incentive council balance, current epoch, and button pressability were unchanged.
+ assert_Snap_Unchanged_TotalProcessableDistributions("total processable should be unchanged");
+ assert_Snap_Unchanged_EmissionsController_EigenBalance("EC balance should be unchanged");
+ assert_Snap_Unchanged_IncentiveCouncil_EigenBalance(emissionsController.incentiveCouncil(), "IC balance should be unchanged");
+ assert_Snap_Unchanged_CurrentEpoch("current epoch should be unchanged");
+ assert_Snap_Unchanged_ButtonPressability("button pressability should be unchanged");
+ }
+
+ function check_sweep_State(
+ uint[] memory distributionIds,
+ IEmissionsControllerTypes.Distribution[] memory distributions,
+ bool swept,
+ bool expectedSwept
+ ) internal {
+ // === Input Validation ===
+ assertEq(distributionIds.length, distributions.length, "check_sweep_State: length mismatch");
+ assertEq(swept, expectedSwept, "check_sweep_State: swept != expectedSwept");
+
+ // === State Invariants ===
+
+ address incentiveCouncil = emissionsController.incentiveCouncil();
+
+ if (swept) {
+ // When sweep occurred:
+ // 1. EmissionsController balance should be 0 or near-0 (all EIGEN swept)
+ uint ecBalance = _getEmissionsControllerEigenBalance();
+ assertLe(ecBalance, 100, "check_sweep_State: EC balance should be swept to ~0");
+ // 2. IncentiveCouncil balance increased by swept amount
+ // Note: We don't know exact amount without tracking prev balance, but it should have increased
+ uint prevICBalance = _getPrevIncentiveCouncilEigenBalance(incentiveCouncil);
+ uint curICBalance = _getIncentiveCouncilEigenBalance(incentiveCouncil);
+ assertTrue(curICBalance > prevICBalance, "check_sweep_State: incentive council balance should increase when swept");
+ // 3. Button must not be pressable (sweep only works when button not pressable)
+ assertFalse(emissionsController.isButtonPressable(), "check_sweep_State: button should not be pressable after sweep");
+ } else {
+ // When sweep did NOT occur (button was pressable or no balance):
+ // 1. EmissionsController balance unchanged
+ assert_Snap_Unchanged_EmissionsController_EigenBalance("check_sweep_State: EC balance should be unchanged when not swept");
+ // 2. IncentiveCouncil balance unchanged
+ assert_Snap_Unchanged_IncentiveCouncil_EigenBalance(
+ incentiveCouncil, "check_sweep_State: incentive council balance should be unchanged when not swept"
+ );
+ }
+
+ // === Invariants that hold regardless of sweep ===
+
+ // 4. Total weight unchanged (sweep doesn't modify distributions)
+ assert_Snap_Unchanged_TotalWeight("check_sweep_State: total weight should be unchanged");
+ // 5. Total distributions unchanged
+ assert_Snap_Unchanged_TotalDistributions("check_sweep_State: total distributions should be unchanged");
+ // 6. Total processable unchanged
+ assert_Snap_Unchanged_TotalProcessableDistributions("check_sweep_State: total processable should be unchanged");
+ // 7. Current epoch unchanged (sweep doesn't advance time)
+ assert_Snap_Unchanged_CurrentEpoch("check_sweep_State: current epoch should be unchanged");
+ // 8. Button pressability unchanged (sweep doesn't process distributions)
+ assert_Snap_Unchanged_ButtonPressability("check_sweep_State: button pressability should be unchanged");
+
+ // 9. All distributions remain unchanged
+ if (distributionIds.length > 0) assert_Distributions_Match_Expected(distributionIds, distributions, "check_sweep_State");
+ }
+
+ function check_pressButton_State(
+ uint[] memory distributionIds,
+ IEmissionsControllerTypes.Distribution[] memory distributions,
+ uint processed,
+ uint expectedProcessed
+ ) internal {
+ // === Input Validation ===
+ assertEq(distributionIds.length, distributions.length, "check_pressButton_State: length mismatch");
+ assertEq(processed, expectedProcessed, "check_pressButton_State: processed != expectedProcessed");
+
+ uint currentEpoch = emissionsController.getCurrentEpoch();
+ bool wasPrevButtonPressable = _getPrevIsButtonPressable();
+
+ // === State Invariants ===
+
+ // 1. Button must have been pressable before (otherwise pressButton should revert)
+ assertTrue(wasPrevButtonPressable, "check_pressButton_State: button must have been pressable");
+ // 2. Current epoch unchanged (pressing button doesn't advance epochs)
+ assert_Snap_Unchanged_CurrentEpoch("check_pressButton_State: current epoch should be unchanged");
+ // 3. Total weight unchanged (processing doesn't modify distributions)
+ assert_Snap_Unchanged_TotalWeight("check_pressButton_State: total weight should be unchanged");
+ // 4. Total distributions unchanged (processing doesn't add/remove distributions)
+ assert_Snap_Unchanged_TotalDistributions("check_pressButton_State: total distributions should be unchanged");
+ // 5. Total processable unchanged (same epoch, so calculation is same)
+ assert_Snap_Unchanged_TotalProcessableDistributions("check_pressButton_State: total processable should be unchanged");
+
+ // 6. IncentiveCouncil balance unchanged (sweep handles IC transfers, not pressButton)
+ // Exception: Manual distributions transfer to IC
+ // For now, we'll skip this check or make it conditional on distribution types
+
+ // 7. Epoch totalProcessed increased (we processed more distributions)
+ if (processed > 0) {
+ // assert_Snap_Increased_EpochTotalProcessed(currentEpoch, "check_pressButton_State: totalProcessed should increase");
+ }
+
+ // 8. EmissionsController balance behavior:
+ // - On first press in epoch: balance increases by INFLATION_RATE (minting)
+ // - Then decreases as distributions are processed
+ // We need to check if this was first press
+ bool wasFirstPress = !_getPrevEpochMinted(currentEpoch);
+
+ if (wasFirstPress && processed > 0) {
+ // First press: minting occurred, so balance should have increased then decreased
+ // Net effect depends on how much was distributed
+ // We can't easily assert exact amounts without tracking individual distribution amounts
+ // But we know minting happened
+ assert_Snap_EpochMinted(currentEpoch, true, "check_pressButton_State: epoch should be marked as minted");
+ }
+
+ // 9. Button pressability: if all distributions processed, button becomes not pressable
+ uint totalProcessable = emissionsController.getTotalProcessableDistributions();
+ uint totalProcessedNow = _getEpochTotalProcessed(currentEpoch);
+
+ if (totalProcessedNow >= totalProcessable) {
+ assertFalse(
+ emissionsController.isButtonPressable(),
+ "check_pressButton_State: button should not be pressable when all distributions processed"
+ );
+ } else {
+ assertTrue(
+ emissionsController.isButtonPressable(), "check_pressButton_State: button should remain pressable when distributions remain"
+ );
+ }
+
+ // 10. All distributions remain stored correctly (processing doesn't modify distribution structs)
+ if (distributionIds.length > 0) assert_Distributions_Match_Expected(distributionIds, distributions, "check_pressButton_State");
+
+ // 11. Processed count should not exceed total processable
+ assertTrue(totalProcessedNow <= totalProcessable, "check_pressButton_State: totalProcessed should not exceed totalProcessable");
+ }
+
+ function check_warpToEpoch_State(uint epoch) internal {
+ // === Primary State Verification ===
+
+ // 1. Current epoch matches target epoch
+ assertEq(epoch, emissionsController.getCurrentEpoch(), "check_warpToEpoch_State: epoch != current epoch");
+
+ // 2. Block timestamp is within the target epoch's range
+ uint epochStart = emissionsController.EMISSIONS_START_TIME() + (epoch * emissionsController.EMISSIONS_EPOCH_LENGTH());
+ uint epochEnd = epochStart + emissionsController.EMISSIONS_EPOCH_LENGTH();
+ assertTrue(
+ block.timestamp >= epochStart && block.timestamp < epochEnd,
+ "check_warpToEpoch_State: block.timestamp not within expected epoch range"
+ );
+
+ // === State Invariants ===
+
+ // 3. Total weight unchanged (time warp doesn't modify distributions)
+ assert_Snap_Unchanged_TotalWeight("check_warpToEpoch_State: total weight should be unchanged");
+
+ // 4. Total distributions unchanged (time warp doesn't add/remove distributions)
+ assert_Snap_Unchanged_TotalDistributions("check_warpToEpoch_State: total distributions should be unchanged");
+
+ // 5. EmissionsController EIGEN balance unchanged (time warp doesn't mint/transfer)
+ assert_Snap_Unchanged_EmissionsController_EigenBalance("check_warpToEpoch_State: EC balance should be unchanged");
+
+ // 6. IncentiveCouncil balance unchanged
+ assert_Snap_Unchanged_IncentiveCouncil_EigenBalance(
+ emissionsController.incentiveCouncil(), "check_warpToEpoch_State: incentive council balance should be unchanged"
+ );
+
+ // 7. Total processable may have changed (distributions added in previous epochs become processable)
+ // If we warped from before emissions start to after: totalProcessable = _distributions.length - 0
+ // If we warped between epochs: totalProcessable = _distributions.length - totalAdded[newEpoch]
+ // We can't easily assert exact value without tracking totalAdded, but we can assert it's valid
+ uint totalProcessable = emissionsController.getTotalProcessableDistributions();
+ uint totalDistributions = _getTotalDistributions();
+ assertTrue(
+ totalProcessable <= totalDistributions, "check_warpToEpoch_State: totalProcessable should not exceed total distributions"
+ );
+
+ // 8. Button pressability updated based on new epoch state
+ // At start of new epoch with processable distributions: button should be pressable
+ // At start of new epoch with no processable distributions: button should not be pressable
+ bool isButtonPressable = emissionsController.isButtonPressable();
+ if (totalProcessable > 0) {
+ assertTrue(isButtonPressable, "check_warpToEpoch_State: button should be pressable at start of new epoch with distributions");
+ } else {
+ assertFalse(isButtonPressable, "check_warpToEpoch_State: button should not be pressable with no distributions to process");
+ }
+
+ // 9. If we warped to a new epoch, the new epoch should have fresh state
+ // (totalProcessed = 0, minted = false) - but we can't check this without getters
+
+ // 10. Verify timing constraints
+ if (epoch == type(uint).max) {
+ // Before emissions start
+ assertTrue(
+ block.timestamp < emissionsController.EMISSIONS_START_TIME(),
+ "check_warpToEpoch_State: before emissions, timestamp should be < start time"
+ );
+ } else {
+ // After emissions start
+ assertTrue(
+ block.timestamp >= emissionsController.EMISSIONS_START_TIME(),
+ "check_warpToEpoch_State: after emissions, timestamp should be >= start time"
+ );
+ }
+ }
}
diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol
index e50b6325df..78824242ac 100644
--- a/src/test/integration/IntegrationDeployer.t.sol
+++ b/src/test/integration/IntegrationDeployer.t.sol
@@ -16,6 +16,7 @@ import "src/contracts/core/StrategyManager.sol";
import "src/contracts/strategies/StrategyFactory.sol";
import "src/contracts/strategies/StrategyBase.sol";
import "src/contracts/strategies/StrategyBaseTVLLimits.sol";
+import "src/contracts/strategies/DurationVaultStrategy.sol";
import "src/contracts/pods/EigenPodManager.sol";
import "src/contracts/pods/EigenPod.sol";
import "src/contracts/permissions/PauserRegistry.sol";
@@ -25,6 +26,9 @@ import "src/test/mocks/EmptyContract.sol";
import "src/test/mocks/ETHDepositMock.sol";
import "src/test/integration/mocks/BeaconChainMock.t.sol";
+import "src/contracts/token/Eigen.sol";
+import "src/contracts/token/BackingEigen.sol";
+
import "src/test/integration/users/AVS.t.sol";
import "src/test/integration/users/User.t.sol";
@@ -167,6 +171,26 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
// Deploy mocks
emptyContract = new EmptyContract();
+ // Deploy EIGEN and bEIGEN token proxies (handle circular dependency)
+ tokenProxyAdmin = new ProxyAdmin();
+ EIGEN = IEigen(address(new TransparentUpgradeableProxy(address(emptyContract), address(tokenProxyAdmin), "")));
+ bEIGEN = IBackingEigen(address(new TransparentUpgradeableProxy(address(emptyContract), address(tokenProxyAdmin), "")));
+
+ // Deploy token implementations
+ EIGENImpl = IEigen(address(new Eigen(IERC20(address(bEIGEN)), version)));
+ bEIGENImpl = IBackingEigen(address(new BackingEigen(IERC20(address(EIGEN)))));
+
+ // Upgrade token proxies to implementations
+ tokenProxyAdmin.upgrade(ITransparentUpgradeableProxy(payable(address(EIGEN))), address(EIGENImpl));
+ tokenProxyAdmin.upgrade(ITransparentUpgradeableProxy(payable(address(bEIGEN))), address(bEIGENImpl));
+
+ // Initialize tokens (cast to concrete types to access initialize)
+ address[] memory minters = new address[](0);
+ uint[] memory mintingAllowances = new uint[](0);
+ uint[] memory mintAllowedAfters = new uint[](0);
+ Eigen(address(EIGEN)).initialize(executorMultisig, minters, mintingAllowances, mintAllowedAfters);
+ BackingEigen(address(bEIGEN)).initialize(executorMultisig);
+
// Matching parameters to testnet
DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS = 50;
DEALLOCATION_DELAY = 50;
@@ -178,6 +202,14 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
REWARDS_COORDINATOR_MAX_FUTURE_LENGTH = 2_592_000;
REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP = 1_710_979_200;
+ // EmissionsController parameters (set after GENESIS_REWARDS_TIMESTAMP)
+ EMISSIONS_CONTROLLER_INFLATION_RATE = 2.3e24; // 2.3M EIGEN per epoch
+ EMISSIONS_CONTROLLER_EPOCH_LENGTH = 1 weeks;
+ // Ensure start time is aligned to day boundaries (divisible by calculation interval)
+ EMISSIONS_CONTROLLER_START_TIME = (REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + 1 weeks)
+ / REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS * REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS;
+ EMISSIONS_CONTROLLER_INCENTIVE_COUNCIL = vm.addr(0xC041C11);
+
_deployProxies();
_deployImplementations();
_upgradeProxies();
@@ -227,6 +259,16 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
string memory existingDeploymentParams = "script/configs/mainnet.json";
_parseParamsForIntegrationUpgrade(existingDeploymentParams);
+ // EmissionsController parameters (set after GENESIS_REWARDS_TIMESTAMP)
+ // These are not yet deployed on mainnet, so we need to set them for testing
+ EMISSIONS_CONTROLLER_INFLATION_RATE = 2.3e24; // 2.3M EIGEN per epoch
+ EMISSIONS_CONTROLLER_EPOCH_LENGTH = 1 weeks;
+ // For fork tests, set start time relative to current block time to avoid past epoch issues
+ // Ensure start time is aligned to day boundaries (divisible by calculation interval)
+ EMISSIONS_CONTROLLER_START_TIME = (block.timestamp + 1 weeks) / REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS
+ * REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS;
+ EMISSIONS_CONTROLLER_INCENTIVE_COUNCIL = vm.addr(0xC041C11);
+
// Place native ETH first in `allStrats`
// This ensures when we select a nonzero number of strategies from this array, we always
// have beacon chain ETH
@@ -267,14 +309,37 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
}
function _upgradeMainnetContracts() public virtual {
- cheats.startPrank(address(executorMultisig));
-
// First, deploy the new contracts as empty contracts
emptyContract = new EmptyContract();
+
+ // Deploy durationVaultBeacon and transfer ownership to executorMultisig
+ // so it can be upgraded uniformly with other beacons in _upgradeProxies()
+ if (address(durationVaultBeacon) == address(0)) {
+ durationVaultBeacon = new UpgradeableBeacon(address(emptyContract));
+ durationVaultBeacon.transferOwnership(executorMultisig);
+ }
+
+ cheats.startPrank(address(executorMultisig));
+
// Deploy new implementation contracts and upgrade all proxies to point to them
_deployProxies(); // deploy proxies (if undeployed)
_deployImplementations();
_upgradeProxies();
+
+ // Initialize EmissionsController if it's a new proxy
+ // Use try-catch in case it's already initialized
+ try emissionsController.initialize({
+ initialOwner: executorMultisig,
+ initialIncentiveCouncil: EMISSIONS_CONTROLLER_INCENTIVE_COUNCIL,
+ initialPausedStatus: 0
+ }) {}
+ catch {}
+
+ // Grant EmissionsController permission to mint bEIGEN tokens
+ bEIGEN.setIsMinter(address(emissionsController), true);
+ // Disable transfer restrictions for EIGEN token (use try-catch in case already disabled)
+ try EIGEN.disableTransferRestrictions() {} catch {}
+
cheats.stopPrank();
}
@@ -313,10 +378,15 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
}
if (address(eigenPodBeacon) == address(0)) eigenPodBeacon = new UpgradeableBeacon(address(emptyContract));
if (address(strategyBeacon) == address(0)) strategyBeacon = new UpgradeableBeacon(address(emptyContract));
+ if (address(durationVaultBeacon) == address(0)) durationVaultBeacon = new UpgradeableBeacon(address(emptyContract));
// multichain
if (address(keyRegistrar) == address(0)) {
keyRegistrar = KeyRegistrar(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")));
}
+ if (address(emissionsController) == address(0)) {
+ emissionsController =
+ EmissionsController(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")));
+ }
}
/// Deploy an implementation contract for each contract in the system
@@ -354,6 +424,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
delegationManager: delegationManager,
strategyManager: strategyManager,
allocationManager: allocationManager,
+ emissionsController: emissionsController,
pauserRegistry: eigenLayerPauserReg,
permissionController: permissionController,
CALCULATION_INTERVAL_SECONDS: REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS,
@@ -365,17 +436,31 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
);
avsDirectoryImplementation = new AVSDirectory(delegationManager, eigenLayerPauserReg, version);
eigenPodManagerImplementation = new EigenPodManager(DEPOSIT_CONTRACT, eigenPodBeacon, delegationManager, eigenLayerPauserReg);
- strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg);
+ strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg, strategyBeacon, durationVaultBeacon);
// Beacon implementations
eigenPodImplementation = new EigenPod(DEPOSIT_CONTRACT, eigenPodManager);
baseStrategyImplementation = new StrategyBase(strategyManager, eigenLayerPauserReg);
+ durationVaultImplementation = new DurationVaultStrategy(
+ strategyManager, eigenLayerPauserReg, delegationManager, allocationManager, rewardsCoordinator, strategyFactory
+ );
// Pre-longtail StrategyBaseTVLLimits implementation
// TODO - need to update ExistingDeploymentParser
// multichain
keyRegistrarImplementation = new KeyRegistrar(permissionController, allocationManager, "9.9.9");
+ emissionsControllerImplementation = new EmissionsController({
+ eigen: EIGEN,
+ backingEigen: bEIGEN,
+ allocationManager: allocationManager,
+ rewardsCoordinator: rewardsCoordinator,
+ pauserRegistry: eigenLayerPauserReg,
+ inflationRate: EMISSIONS_CONTROLLER_INFLATION_RATE,
+ startTime: EMISSIONS_CONTROLLER_START_TIME,
+ cooldownSeconds: EMISSIONS_CONTROLLER_EPOCH_LENGTH,
+ calculationIntervalSeconds: REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS
+ });
}
function _upgradeProxies() public noTracing {
@@ -423,6 +508,9 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
// StrategyBase Beacon
strategyBeacon.upgradeTo(address(baseStrategyImplementation));
+ // DurationVault Beacon
+ durationVaultBeacon.upgradeTo(address(durationVaultImplementation));
+
// Upgrade All deployed strategy contracts to new base strategy
for (uint i = 0; i < numStrategiesDeployed; i++) {
// Upgrade existing strategy
@@ -438,6 +526,11 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
eigenLayerProxyAdmin.upgrade(
ITransparentUpgradeableProxy(payable(address(permissionController))), address(permissionControllerImplementation)
);
+
+ // EmissionsController
+ eigenLayerProxyAdmin.upgrade(
+ ITransparentUpgradeableProxy(payable(address(emissionsController))), address(emissionsControllerImplementation)
+ );
}
function _initializeProxies() public noTracing {
@@ -455,7 +548,22 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser {
allocationManager.initialize({initialPausedStatus: 0});
- strategyFactory.initialize({_initialOwner: executorMultisig, _initialPausedStatus: 0, _strategyBeacon: strategyBeacon});
+ strategyFactory.initialize({_initialOwner: executorMultisig, _initialPausedStatus: 0});
+
+ emissionsController.initialize({
+ initialOwner: executorMultisig,
+ initialIncentiveCouncil: EMISSIONS_CONTROLLER_INCENTIVE_COUNCIL,
+ initialPausedStatus: 0
+ });
+
+ // Grant EmissionsController permission to mint bEIGEN tokens (only for local tests)
+ if (forkType == LOCAL) {
+ cheats.startPrank(executorMultisig);
+ bEIGEN.setIsMinter(address(emissionsController), true);
+ // Disable transfer restrictions for EIGEN token
+ EIGEN.disableTransferRestrictions();
+ cheats.stopPrank();
+ }
}
/// @dev Deploy a strategy and its underlying token, push to global lists of tokens/strategies, and whitelist
diff --git a/src/test/integration/tests/DurationVaultIntegration.t.sol b/src/test/integration/tests/DurationVaultIntegration.t.sol
new file mode 100644
index 0000000000..af093a7006
--- /dev/null
+++ b/src/test/integration/tests/DurationVaultIntegration.t.sol
@@ -0,0 +1,511 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol";
+
+import "src/contracts/interfaces/IDurationVaultStrategy.sol";
+import "src/contracts/interfaces/IStrategy.sol";
+import "src/contracts/interfaces/IDelegationManager.sol";
+import "src/contracts/interfaces/IAllocationManager.sol";
+import "src/contracts/interfaces/IRewardsCoordinator.sol";
+import "src/contracts/strategies/StrategyBaseTVLLimits.sol";
+
+import "src/test/integration/IntegrationChecks.t.sol";
+import "src/test/integration/users/User.t.sol";
+import "src/test/integration/users/AVS.t.sol";
+
+contract Integration_DurationVault is IntegrationCheckUtils {
+ struct DurationVaultContext {
+ IDurationVaultStrategy vault;
+ ERC20PresetFixedSupply asset;
+ AVS avs;
+ OperatorSet operatorSet;
+ }
+
+ uint32 internal constant DEFAULT_DURATION = 10 days;
+ uint internal constant VAULT_MAX_PER_DEPOSIT = 200 ether;
+ uint internal constant VAULT_STAKE_CAP = 1000 ether;
+
+ function test_durationVault_deposit_requires_delegation() public {
+ DurationVaultContext memory ctx = _deployDurationVault(_randomInsuranceRecipient());
+ User staker = new User("duration-no-delegation");
+
+ uint depositAmount = 50 ether;
+ ctx.asset.transfer(address(staker), depositAmount);
+
+ IStrategy[] memory strategies = _durationStrategyArray(ctx.vault);
+ uint[] memory tokenBalances = _singleAmountArray(depositAmount);
+
+ cheats.expectRevert(IDurationVaultStrategyErrors.MustBeDelegatedToVaultOperator.selector);
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+ }
+
+ function test_durationVault_queue_blocked_after_lock_but_completion_allowed_if_queued_before() public {
+ DurationVaultContext memory ctx = _deployDurationVault(_randomInsuranceRecipient());
+ User staker = new User("duration-queue-lock");
+ uint depositAmount = 80 ether;
+ ctx.asset.transfer(address(staker), depositAmount);
+
+ IStrategy[] memory strategies = _durationStrategyArray(ctx.vault);
+ uint[] memory tokenBalances = _singleAmountArray(depositAmount);
+ _delegateToVault(staker, ctx.vault);
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+
+ // Queue before lock succeeds (partial amount to leave shares for revert check).
+ uint[] memory withdrawableShares = _getStakerWithdrawableShares(staker, strategies);
+ withdrawableShares[0] = withdrawableShares[0] / 2;
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, withdrawableShares);
+
+ // Lock blocks new queues.
+ ctx.vault.lock();
+ cheats.expectRevert(IDurationVaultStrategyErrors.WithdrawalsLockedDuringAllocations.selector);
+ staker.queueWithdrawals(strategies, withdrawableShares);
+
+ // Pre-lock queued withdrawal can complete during ALLOCATIONS.
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[0]);
+ assertEq(address(tokens[0]), address(ctx.asset), "unexpected token");
+ uint expectedWithdrawal = depositAmount / 2;
+ assertEq(ctx.asset.balanceOf(address(staker)), expectedWithdrawal, "staker should recover queued portion during allocations");
+ }
+
+ function test_durationVault_allocation_delay_exceeds_withdrawal_delay_for_queued_withdrawals() public {
+ DurationVaultContext memory ctx = _deployDurationVault(_randomInsuranceRecipient());
+ User staker = new User("duration-delay-check");
+ uint depositAmount = 60 ether;
+ ctx.asset.transfer(address(staker), depositAmount);
+
+ IStrategy[] memory strategies = _durationStrategyArray(ctx.vault);
+ uint[] memory tokenBalances = _singleAmountArray(depositAmount);
+ _delegateToVault(staker, ctx.vault);
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+
+ // Queue full withdrawal before lock.
+ uint[] memory withdrawableShares = _getStakerWithdrawableShares(staker, strategies);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, withdrawableShares);
+
+ // Lock the vault; allocation delay is set to minWithdrawalDelayBlocks()+1 inside lock().
+ ctx.vault.lock();
+
+ // Fetch allocation; the effectBlock should be in the future due to allocation delay config.
+ IAllocationManagerTypes.Allocation memory alloc =
+ allocationManager.getAllocation(address(ctx.vault), ctx.operatorSet, strategies[0]);
+ uint startBlock = block.number;
+ assertTrue(alloc.effectBlock > startBlock, "allocation should be pending due to delay");
+
+ // Advance to just before allocation takes effect but after withdrawal delay.
+ uint32 withdrawalDelay = delegationManager.minWithdrawalDelayBlocks();
+ uint32 allocationDelay = uint32(alloc.effectBlock - startBlock);
+ // Roll to min(withdrawalDelay, allocationDelay - 1) to complete before activation.
+ uint32 rollBlocks = withdrawalDelay < allocationDelay ? withdrawalDelay : allocationDelay - 1;
+ cheats.roll(startBlock + rollBlocks);
+ cheats.warp(block.timestamp + 1); // keep timestamps monotonic
+
+ // Ensure allocation still pending (defensive).
+ alloc = allocationManager.getAllocation(address(ctx.vault), ctx.operatorSet, strategies[0]);
+ assertTrue(block.number < alloc.effectBlock, "allocation became active too early");
+
+ // Complete withdrawal successfully before allocation becomes slashable.
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[0]);
+ assertEq(address(tokens[0]), address(ctx.asset), "unexpected token");
+ assertEq(ctx.asset.balanceOf(address(staker)), depositAmount, "staker should recover full queued amount before allocation live");
+ }
+
+ function test_durationVault_queued_withdrawals_reduce_effective_tvl_cap() public {
+ DurationVaultContext memory ctx = _deployDurationVault(_randomInsuranceRecipient());
+ User staker = new User("duration-tvl-queue");
+
+ // First deposit.
+ uint firstDeposit = 200 ether;
+ ctx.asset.transfer(address(staker), firstDeposit);
+ IStrategy[] memory strategies = _durationStrategyArray(ctx.vault);
+ uint[] memory amounts = _singleAmountArray(firstDeposit);
+ _delegateToVault(staker, ctx.vault);
+ staker.depositIntoEigenlayer(strategies, amounts);
+
+ // Queue most of the stake; this reduces slashable TVL counted toward the cap.
+ uint[] memory withdrawableShares = _getStakerWithdrawableShares(staker, strategies);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, withdrawableShares);
+
+ // With the first deposit queued, slashable TVL is ~0, so multiple deposits up to the cap succeed.
+ uint perDeposit = 200 ether;
+ for (uint i = 0; i < 5; ++i) {
+ ctx.asset.transfer(address(staker), perDeposit);
+ amounts[0] = perDeposit;
+ staker.depositIntoEigenlayer(strategies, amounts);
+ }
+
+ // Next deposit would exceed the stake cap once queued stake is excluded.
+ ctx.asset.transfer(address(staker), perDeposit);
+ amounts[0] = perDeposit;
+ cheats.expectRevert(IStrategyErrors.BalanceExceedsMaxTotalDeposits.selector);
+ staker.depositIntoEigenlayer(strategies, amounts);
+
+ // Complete the queued withdrawal to recover the first deposit.
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[0]);
+ assertEq(address(tokens[0]), address(ctx.asset), "unexpected token");
+ assertTrue(ctx.asset.balanceOf(address(staker)) >= firstDeposit, "staker should recover first deposit");
+ }
+
+ function test_durationVaultLifecycle_flow_deposit_lock_mature() public {
+ DurationVaultContext memory ctx = _deployDurationVault(_randomInsuranceRecipient());
+ User staker = new User("duration-staker");
+
+ uint depositAmount = 120 ether;
+ ctx.asset.transfer(address(staker), depositAmount);
+
+ IStrategy[] memory strategies = _durationStrategyArray(ctx.vault);
+ uint[] memory tokenBalances = _singleAmountArray(depositAmount);
+ uint[] memory depositShares = _calculateExpectedShares(strategies, tokenBalances);
+
+ _delegateToVault(staker, ctx.vault);
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+ check_Deposit_State(staker, strategies, depositShares);
+ // Queue withdrawal prior to lock.
+ uint[] memory withdrawableShares = _getStakerWithdrawableShares(staker, strategies);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, withdrawableShares);
+
+ ctx.vault.lock();
+ assertTrue(ctx.vault.allocationsActive(), "allocations should be active after lock");
+ assertTrue(allocationManager.isOperatorSlashable(address(ctx.vault), ctx.operatorSet), "should be slashable");
+
+ // Ensure allocation becomes effective before maturity so deallocation won't hit pending modification.
+ IAllocationManagerTypes.Allocation memory allocLock =
+ allocationManager.getAllocation(address(ctx.vault), ctx.operatorSet, strategies[0]);
+ if (allocLock.effectBlock > block.number) cheats.roll(allocLock.effectBlock);
+
+ // Cannot deposit once locked.
+ uint extraDeposit = 10 ether;
+ User lateStaker = new User("duration-late-staker");
+ ctx.asset.transfer(address(lateStaker), extraDeposit);
+ uint[] memory lateTokenBalances = _singleAmountArray(extraDeposit);
+ cheats.expectRevert(IDurationVaultStrategyErrors.DepositsLocked.selector);
+ lateStaker.depositIntoEigenlayer(strategies, lateTokenBalances);
+
+ // Mature the vault and allow withdrawals.
+ cheats.warp(block.timestamp + ctx.vault.duration() + 1);
+ ctx.vault.markMatured();
+ assertTrue(ctx.vault.withdrawalsOpen(), "withdrawals must open after maturity");
+ assertFalse(ctx.vault.allocationsActive(), "allocations disabled after maturity");
+
+ // Advance past deallocation delay to ensure slashability cleared.
+ cheats.roll(block.number + allocationManager.DEALLOCATION_DELAY() + 1);
+ assertFalse(allocationManager.isOperatorSlashable(address(ctx.vault), ctx.operatorSet), "should not be slashable");
+
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[0]);
+ assertEq(address(tokens[0]), address(ctx.asset), "unexpected token returned");
+ assertEq(ctx.asset.balanceOf(address(staker)), depositAmount, "staker should recover deposit");
+ }
+
+ function test_durationVault_arbitrator_can_advance_to_withdrawals_early() public {
+ DurationVaultContext memory ctx = _deployDurationVault(_randomInsuranceRecipient());
+ User staker = new User("duration-arbitrator-staker");
+
+ uint depositAmount = 50 ether;
+ ctx.asset.transfer(address(staker), depositAmount);
+ IStrategy[] memory strategies = _durationStrategyArray(ctx.vault);
+ uint[] memory tokenBalances = _singleAmountArray(depositAmount);
+ _delegateToVault(staker, ctx.vault);
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+
+ // Arbitrator cannot advance before lock.
+ cheats.expectRevert(IDurationVaultStrategyErrors.VaultNotLocked.selector);
+ ctx.vault.advanceToWithdrawals();
+
+ ctx.vault.lock();
+ assertTrue(ctx.vault.allocationsActive(), "allocations should be active after lock");
+ assertFalse(ctx.vault.withdrawalsOpen(), "withdrawals should be closed while locked");
+
+ // Non-arbitrator cannot advance.
+ cheats.prank(address(0x1234));
+ cheats.expectRevert(IDurationVaultStrategyErrors.OnlyArbitrator.selector);
+ ctx.vault.advanceToWithdrawals();
+
+ // Arbitrator can advance after lock but before duration elapses.
+ cheats.warp(block.timestamp + 1);
+ ctx.vault.advanceToWithdrawals();
+
+ assertTrue(ctx.vault.withdrawalsOpen(), "withdrawals should open after arbitrator advance");
+ assertFalse(ctx.vault.allocationsActive(), "allocations should be inactive after arbitrator advance");
+ assertTrue(ctx.vault.isMatured(), "vault should be matured after arbitrator advance");
+
+ // Withdrawals should actually be possible in this early-advance path.
+ uint[] memory withdrawableShares = _getStakerWithdrawableShares(staker, strategies);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, withdrawableShares);
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[0]);
+ assertEq(address(tokens[0]), address(ctx.asset), "unexpected token returned");
+ assertEq(ctx.asset.balanceOf(address(staker)), depositAmount, "staker should recover deposit after arbitrator advance");
+
+ // markMatured should be a noop after the state has already transitioned.
+ ctx.vault.markMatured();
+ }
+
+ function test_durationVault_operatorIntegrationAndMetadataUpdate() public {
+ DurationVaultContext memory ctx = _deployDurationVault(_randomInsuranceRecipient());
+
+ assertTrue(delegationManager.isOperator(address(ctx.vault)), "vault must self-register as operator");
+ assertEq(delegationManager.delegatedTo(address(ctx.vault)), address(ctx.vault), "vault should self delegate");
+ assertTrue(ctx.vault.operatorSetRegistered(), "operator set should be marked registered");
+
+ (address avsAddress, uint32 operatorSetId) = ctx.vault.operatorSetInfo();
+ assertEq(avsAddress, ctx.operatorSet.avs, "avs mismatch");
+ assertEq(operatorSetId, ctx.operatorSet.id, "operator set id mismatch");
+ assertTrue(allocationManager.isOperatorSlashable(address(ctx.vault), ctx.operatorSet), "vault must be slashable");
+
+ string memory newURI = "ipfs://duration-vault/metadata";
+ cheats.expectEmit(false, false, false, true, address(ctx.vault));
+ emit IDurationVaultStrategyEvents.MetadataURIUpdated(newURI);
+ ctx.vault.updateMetadataURI(newURI);
+ assertEq(ctx.vault.metadataURI(), newURI, "metadata not updated");
+ }
+
+ function test_durationVault_TVLLimits_enforced_and_frozen_after_lock() public {
+ DurationVaultContext memory ctx = _deployDurationVault(_randomInsuranceRecipient());
+ User staker = new User("duration-tvl-staker");
+
+ uint maxPerDepositBefore = ctx.vault.maxPerDeposit();
+ uint maxStakeBefore = ctx.vault.maxTotalDeposits();
+ assertEq(maxPerDepositBefore, VAULT_MAX_PER_DEPOSIT, "initial max per deposit mismatch");
+ assertEq(maxStakeBefore, VAULT_STAKE_CAP, "initial stake cap mismatch");
+
+ uint newMaxPerDeposit = 50 ether;
+ uint newStakeCap = 100 ether;
+ ctx.vault.updateTVLLimits(newMaxPerDeposit, newStakeCap);
+
+ IStrategy[] memory strategies = _durationStrategyArray(ctx.vault);
+ uint[] memory amounts = _singleAmountArray(60 ether);
+ ctx.asset.transfer(address(staker), amounts[0]);
+ _delegateToVault(staker, ctx.vault);
+ cheats.expectRevert(IDurationVaultStrategyErrors.DepositExceedsMaxPerDeposit.selector);
+ staker.depositIntoEigenlayer(strategies, amounts);
+
+ // Deposit within limits.
+ uint firstDeposit = 50 ether;
+ ctx.asset.transfer(address(staker), firstDeposit);
+ amounts[0] = firstDeposit;
+ staker.depositIntoEigenlayer(strategies, amounts);
+
+ uint secondDeposit = 40 ether;
+ ctx.asset.transfer(address(staker), secondDeposit);
+ amounts[0] = secondDeposit;
+ staker.depositIntoEigenlayer(strategies, amounts);
+
+ // Hitting total cap reverts.
+ uint thirdDeposit = 20 ether;
+ ctx.asset.transfer(address(staker), thirdDeposit);
+ amounts[0] = thirdDeposit;
+ cheats.expectRevert(IStrategyErrors.BalanceExceedsMaxTotalDeposits.selector);
+ staker.depositIntoEigenlayer(strategies, amounts);
+
+ ctx.vault.lock();
+ cheats.expectRevert(IDurationVaultStrategyErrors.DepositsLocked.selector);
+ ctx.vault.updateTVLLimits(10 ether, 20 ether);
+ }
+
+ function test_durationVault_rewards_claim_while_locked() public {
+ DurationVaultContext memory ctx = _deployDurationVault(_randomInsuranceRecipient());
+ User staker = new User("duration-reward-staker");
+ uint depositAmount = 80 ether;
+ ctx.asset.transfer(address(staker), depositAmount);
+
+ IStrategy[] memory strategies = _durationStrategyArray(ctx.vault);
+ uint[] memory tokenBalances = _singleAmountArray(depositAmount);
+ _delegateToVault(staker, ctx.vault);
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+ ctx.vault.lock();
+
+ // Prepare reward token and fund RewardsCoordinator.
+ ERC20PresetFixedSupply rewardToken = new ERC20PresetFixedSupply("RewardToken", "RWRD", 1e24, address(this));
+ uint rewardAmount = 25 ether;
+ rewardToken.transfer(address(rewardsCoordinator), rewardAmount);
+
+ // Allow this test to submit roots.
+ cheats.prank(rewardsCoordinator.owner());
+ rewardsCoordinator.setRewardsUpdater(address(this));
+
+ // Build single-earner, single-token merkle claim.
+ (IRewardsCoordinatorTypes.RewardsMerkleClaim memory claim, bytes32 rootHash) =
+ _buildSingleLeafClaim(address(staker), rewardToken, rewardAmount);
+
+ rewardsCoordinator.submitRoot(rootHash, uint32(block.timestamp - 1));
+ claim.rootIndex = uint32(rewardsCoordinator.getDistributionRootsLength() - 1);
+
+ // Advance time past the activation delay so the root becomes claimable.
+ cheats.warp(block.timestamp + rewardsCoordinator.activationDelay() + 1);
+
+ cheats.prank(address(staker));
+ rewardsCoordinator.processClaim(claim, address(staker));
+ assertEq(rewardToken.balanceOf(address(staker)), rewardAmount, "staker failed to claim rewards");
+ }
+
+ function test_durationVault_slashing_routes_to_insurance_and_blocks_after_maturity() public {
+ address insuranceRecipient = _randomInsuranceRecipient();
+ DurationVaultContext memory ctx = _deployDurationVault(insuranceRecipient);
+ User staker = new User("duration-slash-staker");
+ uint depositAmount = 200 ether;
+ ctx.asset.transfer(address(staker), depositAmount);
+
+ IStrategy[] memory strategies = _durationStrategyArray(ctx.vault);
+ uint[] memory tokenBalances = _singleAmountArray(depositAmount);
+ _delegateToVault(staker, ctx.vault);
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+ ctx.vault.lock();
+
+ uint slashWad = 0.25e18;
+ uint expectedRedistribution = (depositAmount * slashWad) / 1e18;
+ IAllocationManager.SlashingParams memory slashParams;
+ slashParams.operator = address(ctx.vault);
+ slashParams.operatorSetId = ctx.operatorSet.id;
+ slashParams.strategies = strategies;
+ slashParams.wadsToSlash = _singleAmountArray(slashWad);
+ slashParams.description = "insurance event";
+
+ // Move past allocation delay so allocation is active when slashing.
+ IAllocationManagerTypes.Allocation memory alloc =
+ allocationManager.getAllocation(address(ctx.vault), ctx.operatorSet, strategies[0]);
+ if (alloc.effectBlock > block.number) cheats.roll(alloc.effectBlock);
+
+ (uint slashId,) = ctx.avs.slashOperator(slashParams);
+ uint redistributed =
+ strategyManager.clearBurnOrRedistributableSharesByStrategy(ctx.operatorSet, slashId, IStrategy(address(ctx.vault)));
+ assertEq(redistributed, expectedRedistribution, "unexpected redistribution amount");
+ assertEq(ctx.asset.balanceOf(insuranceRecipient), expectedRedistribution, "insurance recipient not paid");
+
+ // Mature the vault and advance beyond slashable window.
+ cheats.warp(block.timestamp + ctx.vault.duration() + 1);
+ ctx.vault.markMatured();
+ cheats.roll(block.number + allocationManager.DEALLOCATION_DELAY() + 2);
+
+ cheats.expectRevert(IAllocationManagerErrors.OperatorNotSlashable.selector);
+ ctx.avs.slashOperator(slashParams);
+ assertEq(ctx.asset.balanceOf(insuranceRecipient), expectedRedistribution, "post-maturity slash should not pay");
+ }
+
+ function test_durationVault_slashing_affectsQueuedWithdrawalsAndPaysInsurance() public {
+ address insuranceRecipient = _randomInsuranceRecipient();
+ DurationVaultContext memory ctx = _deployDurationVault(insuranceRecipient);
+ User staker = new User("duration-slash-queued");
+ uint depositAmount = 180 ether;
+ ctx.asset.transfer(address(staker), depositAmount);
+
+ IStrategy[] memory strategies = _durationStrategyArray(ctx.vault);
+ uint[] memory tokenBalances = _singleAmountArray(depositAmount);
+ _delegateToVault(staker, ctx.vault);
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+ uint[] memory withdrawableShares = _getStakerWithdrawableShares(staker, strategies);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, withdrawableShares);
+ ctx.vault.lock();
+
+ uint slashWad = 0.3e18;
+ {
+ IAllocationManager.SlashingParams memory slashParams;
+ slashParams.operator = address(ctx.vault);
+ slashParams.operatorSetId = ctx.operatorSet.id;
+ slashParams.strategies = strategies;
+ slashParams.wadsToSlash = _singleAmountArray(slashWad);
+ slashParams.description = "queued withdrawal slash";
+
+ // Move past allocation delay so allocation is active when slashing.
+ IAllocationManagerTypes.Allocation memory alloc =
+ allocationManager.getAllocation(address(ctx.vault), ctx.operatorSet, strategies[0]);
+ if (alloc.effectBlock > block.number) cheats.roll(alloc.effectBlock);
+
+ (uint slashId,) = ctx.avs.slashOperator(slashParams);
+ uint redistributed =
+ strategyManager.clearBurnOrRedistributableSharesByStrategy(ctx.operatorSet, slashId, IStrategy(address(ctx.vault)));
+ // Queued withdrawals remove shares from the operator, so expect zero redistribution.
+ assertEq(redistributed, 0, "queued slash redistribution mismatch");
+ assertEq(ctx.asset.balanceOf(insuranceRecipient), 0, "insurance recipient incorrect");
+ }
+
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[0]);
+ assertEq(address(tokens[0]), address(ctx.asset), "unexpected withdrawal token");
+ assertEq(ctx.asset.balanceOf(address(staker)), depositAmount, "staker balance after queued slash incorrect");
+ }
+
+ function _deployDurationVault(address insuranceRecipient) internal returns (DurationVaultContext memory ctx) {
+ ERC20PresetFixedSupply asset = new ERC20PresetFixedSupply("Duration Asset", "DURA", 1e24, address(this));
+ AVS avsInstance = new AVS("duration-avs");
+ avsInstance.updateAVSMetadataURI("https://avs-metadata.local");
+
+ avsInstance.createOperatorSet(new IStrategy[](0));
+ OperatorSet memory opSet = avsInstance.createRedistributingOperatorSet(new IStrategy[](0), insuranceRecipient);
+
+ IDurationVaultStrategyTypes.VaultConfig memory config;
+ config.underlyingToken = asset;
+ config.vaultAdmin = address(this);
+ config.arbitrator = address(this);
+ config.duration = DEFAULT_DURATION;
+ config.maxPerDeposit = VAULT_MAX_PER_DEPOSIT;
+ config.stakeCap = VAULT_STAKE_CAP;
+ config.metadataURI = "ipfs://duration-vault";
+ config.operatorSet = opSet;
+ config.operatorSetRegistrationData = "";
+ config.delegationApprover = address(0);
+ config.operatorMetadataURI = "ipfs://duration-vault/operator";
+
+ IDurationVaultStrategy vault = IDurationVaultStrategy(address(strategyFactory.deployDurationVaultStrategy(config)));
+
+ IStrategy[] memory strategies = _durationStrategyArray(vault);
+ avsInstance.addStrategiesToOperatorSet(opSet.id, strategies);
+
+ ctx = DurationVaultContext({vault: vault, asset: asset, avs: avsInstance, operatorSet: opSet});
+ }
+
+ function _durationStrategyArray(IDurationVaultStrategy vault) internal pure returns (IStrategy[] memory arr) {
+ arr = new IStrategy[](1);
+ arr[0] = IStrategy(address(vault));
+ }
+
+ function _singleAmountArray(uint amount) internal pure returns (uint[] memory arr) {
+ arr = new uint[](1);
+ arr[0] = amount;
+ }
+
+ function _delegateToVault(User staker, IDurationVaultStrategy vault) internal {
+ IDelegationManager.SignatureWithExpiry memory emptySig;
+ cheats.startPrank(address(staker));
+ delegationManager.delegateTo(address(vault), emptySig, bytes32(0));
+ cheats.stopPrank();
+ assertEq(delegationManager.delegatedTo(address(staker)), address(vault), "delegation failed");
+ }
+
+ function _randomInsuranceRecipient() internal view returns (address) {
+ return address(uint160(uint(keccak256(abi.encodePacked(block.timestamp, address(this))))));
+ }
+
+ function _buildSingleLeafClaim(address earner, IERC20 token, uint amount)
+ internal
+ pure
+ returns (IRewardsCoordinatorTypes.RewardsMerkleClaim memory claim, bytes32 rootHash)
+ {
+ IRewardsCoordinatorTypes.TokenTreeMerkleLeaf[] memory tokenLeaves = new IRewardsCoordinatorTypes.TokenTreeMerkleLeaf[](1);
+ tokenLeaves[0] = IRewardsCoordinatorTypes.TokenTreeMerkleLeaf({token: token, cumulativeEarnings: amount});
+ bytes32 tokenLeafHash = keccak256(abi.encodePacked(uint8(1), address(token), amount));
+ IRewardsCoordinatorTypes.EarnerTreeMerkleLeaf memory earnerLeaf =
+ IRewardsCoordinatorTypes.EarnerTreeMerkleLeaf({earner: earner, earnerTokenRoot: tokenLeafHash});
+ rootHash = keccak256(abi.encodePacked(uint8(0), earner, tokenLeafHash));
+
+ uint32[] memory tokenIndices = new uint32[](1);
+ tokenIndices[0] = 0;
+ bytes[] memory tokenProofs = new bytes[](1);
+ tokenProofs[0] = bytes("");
+
+ claim = IRewardsCoordinatorTypes.RewardsMerkleClaim({
+ rootIndex: 0,
+ earnerIndex: 0,
+ earnerTreeProof: bytes(""),
+ earnerLeaf: earnerLeaf,
+ tokenIndices: tokenIndices,
+ tokenTreeProofs: tokenProofs,
+ tokenLeaves: tokenLeaves
+ });
+ }
+}
+
diff --git a/src/test/integration/tests/EmissionsController.t.sol b/src/test/integration/tests/EmissionsController.t.sol
new file mode 100644
index 0000000000..07aa3fe698
--- /dev/null
+++ b/src/test/integration/tests/EmissionsController.t.sol
@@ -0,0 +1,569 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "src/test/integration/IntegrationChecks.t.sol";
+import "src/test/integration/users/IncentiveCouncil.t.sol";
+
+/// @notice Base contract for EmissionsController integration tests with shared setup
+contract Integration_EmissionsController_Base is IntegrationCheckUtils, IEmissionsControllerTypes {
+ using ArrayLib for *;
+
+ address incentiveCouncil;
+ IncentiveCouncil ic;
+ AVS avs;
+ OperatorSet[] operatorSets;
+ IStrategy[] strategies;
+
+ function _init() internal virtual override {
+ _configAssetTypes(HOLDS_LST);
+ OperatorSet[] memory _operatorSets;
+ // Get incentive council address
+ incentiveCouncil = emissionsController.incentiveCouncil();
+ ic = new IncentiveCouncil(emissionsController, incentiveCouncil, timeMachine);
+ // Enable emissions controller as rewards submitter
+ cheats.prank(rewardsCoordinator.owner());
+ rewardsCoordinator.setRewardsForAllSubmitter(address(emissionsController), true);
+ // Create AVS and operator for operator set distributions
+ (avs, _operatorSets) = _newRandomAVS();
+ strategies = allStrats;
+ for (uint i = 0; i < _operatorSets.length; i++) {
+ operatorSets.push(_operatorSets[i]);
+ }
+ }
+
+ function _genEvenlyDistributedWeights(uint numWeights, uint16 totalWeight) internal returns (uint16[] memory weights) {
+ weights = new uint16[](numWeights);
+ uint16 weightPerWeight = uint16(totalWeight / numWeights);
+ uint16 remainder = uint16(totalWeight % numWeights);
+
+ for (uint i = 0; i < numWeights; ++i) {
+ weights[i] = weightPerWeight;
+ // Distribute remainder across first few weights
+ if (i < remainder) weights[i] += 1;
+ }
+ return weights;
+ }
+
+ function _genRandParams() internal returns (uint64 startEpoch, uint16 totalWeight, uint numDistributions) {
+ startEpoch = uint64(_randUint({min: 0, max: 2**12 - 1}));
+ numDistributions = _randUint({min: 1, max: 32});
+ // Ensure totalWeight is at least numDistributions (each distribution needs at least 1 weight)
+ totalWeight = uint16(_randUint({min: numDistributions, max: 10_000})); // 0.01-100% (bips)
+ return (startEpoch, totalWeight, numDistributions);
+ }
+}
+
+contract Integration_EmissionsController_E2E is Integration_EmissionsController_Base {
+ /// -----------------------------------------------------------------------
+ /// ALL BEFORE emissions start
+ /// -----------------------------------------------------------------------
+ function testFuzz_addDists_pressButton_noneProcessed(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+
+ // 1. Add distributions
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributions(operatorSets, strategies, numDistributions, startEpoch, totalWeight);
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Press button (should revert `EmissionsNotStarted()`)
+ vm.expectRevert(IEmissionsControllerErrors.EmissionsNotStarted.selector);
+ ic.pressButton(numDistributions);
+ }
+
+ function testFuzz_addDists_updateDists_pressButton_noneProcessed(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+
+ // 1. Add distributions
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributions(operatorSets, strategies, numDistributions, startEpoch, totalWeight);
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Update distributions
+ Distribution[] memory updatedDistributions =
+ ic.updateDistributions(distributionIds, distributions, _genEvenlyDistributedWeights(numDistributions, totalWeight));
+ check_updateDists_State(distributionIds, distributions, updatedDistributions);
+
+ // 3. Press button
+ vm.expectRevert(IEmissionsControllerErrors.EmissionsNotStarted.selector);
+ ic.pressButton(numDistributions);
+ }
+
+ function testFuzz_addDists_pressButton_noneProcessed_sweep_noneSwept(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+
+ // 1. Add distributions
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributions(operatorSets, strategies, numDistributions, startEpoch, totalWeight);
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Press button
+ vm.expectRevert(IEmissionsControllerErrors.EmissionsNotStarted.selector);
+ ic.pressButton(numDistributions);
+
+ // 3. Sweep
+ bool swept = ic.sweep();
+ check_sweep_State(distributionIds, distributions, swept, false);
+ }
+
+ function testFuzz_addDists_updateDists_pressButton_noneProcessed_sweep_noneSwept(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+
+ // 1. Add distributions
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributions(operatorSets, strategies, numDistributions, startEpoch, totalWeight);
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Update distributions
+ Distribution[] memory updatedDistributions =
+ ic.updateDistributions(distributionIds, distributions, _genEvenlyDistributedWeights(numDistributions, totalWeight));
+ check_updateDists_State(distributionIds, distributions, updatedDistributions);
+
+ // 3. Press button
+ vm.expectRevert(IEmissionsControllerErrors.EmissionsNotStarted.selector);
+ ic.pressButton(numDistributions);
+
+ // 4. Sweep
+ bool swept = ic.sweep();
+ check_sweep_State(distributionIds, updatedDistributions, swept, false);
+ }
+
+ function testFuzz_addDists_sweep_noneSwept(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+
+ // 1. Add distributions
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributions(operatorSets, strategies, numDistributions, startEpoch, totalWeight);
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Sweep
+ bool swept = ic.sweep();
+ check_sweep_State(distributionIds, distributions, swept, false);
+ }
+
+ function testFuzz_addDists_updateDists_sweep_noneSwept(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+
+ // 1. Add distributions
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributions(operatorSets, strategies, numDistributions, startEpoch, totalWeight);
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Update distributions
+ Distribution[] memory updatedDistributions =
+ ic.updateDistributions(distributionIds, distributions, _genEvenlyDistributedWeights(numDistributions, totalWeight));
+ check_updateDists_State(distributionIds, distributions, updatedDistributions);
+
+ // 3. Sweep
+ bool swept = ic.sweep();
+ check_sweep_State(distributionIds, updatedDistributions, swept, false);
+ }
+
+ /// -----------------------------------------------------------------------
+ /// BEFORE → AFTER transition (add before, then something after)
+ /// -----------------------------------------------------------------------
+
+ function testFuzz_addDists_warp_pressButton(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+
+ // 1. Add distributions
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributions(operatorSets, strategies, numDistributions, startEpoch, totalWeight);
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Warp to start epoch
+ ic.warpToEpoch(startEpoch);
+ check_warpToEpoch_State(startEpoch);
+
+ // 3. Press button
+ uint processed = ic.pressButton(numDistributions);
+ check_pressButton_State(distributionIds, distributions, processed, numDistributions);
+
+ // 4. Press button again (should revert).
+ vm.expectRevert(IEmissionsControllerErrors.AllDistributionsProcessed.selector);
+ ic.pressButton(numDistributions);
+ }
+
+ function testFuzz_addDists_updateDists_warp_pressButton(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+
+ // 1. Add distributions
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributions(operatorSets, strategies, numDistributions, startEpoch, totalWeight);
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Update distributions
+ Distribution[] memory updatedDistributions =
+ ic.updateDistributions(distributionIds, distributions, _genEvenlyDistributedWeights(numDistributions, totalWeight));
+ check_updateDists_State(distributionIds, distributions, updatedDistributions);
+
+ // 3. Warp to start epoch
+ ic.warpToEpoch(startEpoch);
+ check_warpToEpoch_State(startEpoch);
+
+ // 4. Press button
+ uint processed = ic.pressButton(numDistributions);
+ check_pressButton_State(distributionIds, updatedDistributions, processed, numDistributions);
+
+ // 4. Press button again (should revert).
+ vm.expectRevert(IEmissionsControllerErrors.AllDistributionsProcessed.selector);
+ ic.pressButton(numDistributions);
+ }
+
+ function testFuzz_addDists_warp_pressButton_sweep(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+
+ // 1. Add distributions
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributions(operatorSets, strategies, numDistributions, startEpoch, totalWeight);
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Warp to start epoch
+ ic.warpToEpoch(startEpoch);
+ check_warpToEpoch_State(startEpoch);
+
+ // 3. Press button
+ uint processed = ic.pressButton(numDistributions);
+ check_pressButton_State(distributionIds, distributions, processed, numDistributions);
+
+ // 4. Sweep
+ bool expectedSwept = emissionsController.totalWeight() < 10_000;
+ bool swept = ic.sweep();
+ check_sweep_State(distributionIds, distributions, swept, expectedSwept);
+
+ // 5. Press button again (should revert).
+ vm.expectRevert(IEmissionsControllerErrors.AllDistributionsProcessed.selector);
+ ic.pressButton(numDistributions);
+ }
+
+ function testFuzz_addDists_updateDists_warp_pressButton_sweep(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+
+ // 1. Add distributions
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributions(operatorSets, strategies, numDistributions, startEpoch, totalWeight);
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Update distributions
+ Distribution[] memory updatedDistributions =
+ ic.updateDistributions(distributionIds, distributions, _genEvenlyDistributedWeights(numDistributions, totalWeight));
+ check_updateDists_State(distributionIds, distributions, updatedDistributions);
+
+ // 3. Warp to start epoch
+ ic.warpToEpoch(startEpoch);
+ check_warpToEpoch_State(startEpoch);
+
+ // 4. Press button
+ uint processed = ic.pressButton(numDistributions);
+ check_pressButton_State(distributionIds, updatedDistributions, processed, numDistributions);
+
+ // 5. Sweep
+ bool expectedSwept = emissionsController.totalWeight() < 10_000;
+ bool swept = ic.sweep();
+ check_sweep_State(distributionIds, updatedDistributions, swept, expectedSwept);
+
+ // 6. Press button again (should revert).
+ vm.expectRevert(IEmissionsControllerErrors.AllDistributionsProcessed.selector);
+ ic.pressButton(numDistributions);
+ }
+
+ function testFuzz_addDists_warp_updateDists_pressButton(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+
+ // 1. Add distributions
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributions(operatorSets, strategies, numDistributions, startEpoch, totalWeight);
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Warp to start epoch
+ ic.warpToEpoch(startEpoch);
+ check_warpToEpoch_State(startEpoch);
+
+ // 3. Update distributions
+ vm.expectRevert(IEmissionsControllerErrors.AllDistributionsMustBeProcessed.selector);
+ ic.updateDistributions(distributionIds, distributions, _genEvenlyDistributedWeights(numDistributions, totalWeight));
+
+ // 4. Press button
+ uint processed = ic.pressButton(numDistributions);
+ check_pressButton_State(distributionIds, distributions, processed, numDistributions);
+
+ // 5. Press button again (should revert).
+ vm.expectRevert(IEmissionsControllerErrors.AllDistributionsProcessed.selector);
+ ic.pressButton(numDistributions);
+ }
+
+ function testFuzz_addDists_warp_updateDists_pressButton_sweep(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+
+ // 1. Add distributions
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributions(operatorSets, strategies, numDistributions, startEpoch, totalWeight);
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Warp to start epoch
+ ic.warpToEpoch(startEpoch);
+ check_warpToEpoch_State(startEpoch);
+
+ // 3. Update distributions
+ vm.expectRevert(IEmissionsControllerErrors.AllDistributionsMustBeProcessed.selector);
+ ic.updateDistributions(distributionIds, distributions, _genEvenlyDistributedWeights(numDistributions, totalWeight));
+
+ // 4. Press button
+ uint processed = ic.pressButton(numDistributions);
+ check_pressButton_State(distributionIds, distributions, processed, numDistributions);
+
+ // 5. Sweep
+ bool expectedSwept = emissionsController.totalWeight() < 10_000;
+ bool swept = ic.sweep();
+ check_sweep_State(distributionIds, distributions, swept, expectedSwept);
+
+ // 6. Press button again (should revert).
+ vm.expectRevert(IEmissionsControllerErrors.AllDistributionsProcessed.selector);
+ ic.pressButton(numDistributions);
+ }
+
+ /// -----------------------------------------------------------------------
+ /// Invariants for pressButton
+ /// -----------------------------------------------------------------------
+
+ /// @dev Assert that all distributions succeed given valid inputs.
+ function testFuzz_addDists_pressButton_allDistributionTypes(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight,) = _genRandParams();
+
+ DistributionType[] memory types = new DistributionType[](5);
+ types[0] = DistributionType.RewardsForAllEarners;
+ types[1] = DistributionType.OperatorSetTotalStake;
+ types[2] = DistributionType.OperatorSetUniqueStake;
+ types[3] = DistributionType.EigenDA;
+ types[4] = DistributionType.Manual;
+
+ // 1. Add distributions with all types
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributionsWithTypes(operatorSets, strategies, types, startEpoch, totalWeight);
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Warp to start epoch
+ ic.warpToEpoch(startEpoch);
+ check_warpToEpoch_State(startEpoch);
+
+ // 3. Press button - should process all distributions
+ uint processed = ic.pressButton(types.length);
+ check_pressButton_State(distributionIds, distributions, processed, types.length);
+
+ // 4. Press button again (should revert).
+ vm.expectRevert(IEmissionsControllerErrors.AllDistributionsProcessed.selector);
+ ic.pressButton(types.length);
+ }
+
+ /// @dev Assert that the function skips disabled distributions.
+ function testFuzz_addDists_pressButton_skipsDisabledDistributions(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+ numDistributions = _randUint({min: 2, max: 32}); // Need at least 2 distributions
+ totalWeight = uint16(_randUint({min: numDistributions, max: 10_000})); // Recalculate for new numDistributions
+
+ // Create distribution types (all enabled initially)
+ DistributionType[] memory types = new DistributionType[](numDistributions);
+ uint numToDisable = _randUint({min: 1, max: numDistributions - 1}); // At least 1 disabled, at least 1 enabled
+
+ for (uint i = 0; i < numDistributions; ++i) {
+ types[i] = DistributionType(uint8(_randUint({min: 1, max: 5}))); // Non-disabled types
+ }
+
+ // 1. Add distributions (all enabled)
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributionsWithTypes(operatorSets, strategies, types, startEpoch, totalWeight);
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Update some distributions to disabled
+ for (uint i = 0; i < numToDisable; ++i) {
+ distributions[i].distributionType = DistributionType.Disabled;
+ cheats.prank(incentiveCouncil);
+ emissionsController.updateDistribution(distributionIds[i], distributions[i]);
+ }
+
+ // Note: Disabling distributions doesn't change totalWeight - it just affects processing
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 3. Warp to start epoch
+ ic.warpToEpoch(startEpoch);
+ check_warpToEpoch_State(startEpoch);
+
+ // 4. Press button - should only process non-disabled distributions
+ uint processed = ic.pressButton(numDistributions);
+ uint expectedProcessed = numDistributions - numToDisable;
+ assertEq(processed, expectedProcessed, "Should skip disabled distributions");
+ }
+
+ /// @dev Assert that the function skips distributions that have not started yet.
+ function testFuzz_addDists_pressButton_skipsNotYetStartedDistributions(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+ numDistributions = _randUint({min: 2, max: 32}); // Need at least 2 distributions
+ totalWeight = uint16(_randUint({min: numDistributions, max: 10_000})); // Recalculate for new numDistributions
+ startEpoch = uint64(_randUint({min: 2, max: 2**12 - 1})); // Ensure startEpoch > 0
+
+ // Generate random distribution types (non-disabled)
+ DistributionType[] memory types = new DistributionType[](numDistributions);
+ for (uint i = 0; i < numDistributions; ++i) {
+ types[i] = DistributionType(uint8(_randUint({min: 1, max: 5})));
+ }
+
+ // 1. Add distributions with staggered start epochs
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributionsWithTypes(operatorSets, strategies, types, startEpoch, totalWeight);
+
+ // Manually update some distributions to have later start epochs
+ uint numLaterStart = _randUint({min: 1, max: numDistributions - 1});
+ for (uint i = 0; i < numLaterStart; ++i) {
+ distributions[i].startEpoch = startEpoch + 1; // Start one epoch later
+ cheats.prank(incentiveCouncil);
+ emissionsController.updateDistribution(distributionIds[i], distributions[i]);
+ }
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Warp to start epoch (some distributions haven't started yet)
+ ic.warpToEpoch(startEpoch);
+ check_warpToEpoch_State(startEpoch);
+
+ // 3. Press button - should only process distributions that have started
+ uint processed = ic.pressButton(numDistributions);
+ uint expectedProcessed = numDistributions - numLaterStart;
+ assertEq(processed, expectedProcessed, "Should skip distributions that haven't started");
+ }
+
+ /// @dev Assert that the function skips distributions that have ended.
+ function testFuzz_addDists_pressButton_skipsEndedDistributions(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+ numDistributions = _randUint({min: 2, max: 32}); // Need at least 2 distributions
+ totalWeight = uint16(_randUint({min: numDistributions, max: 10_000})); // Recalculate for new numDistributions
+ startEpoch = uint64(_randUint({min: 1, max: 100})); // Keep epochs reasonable
+
+ // Generate random distribution types (non-disabled)
+ DistributionType[] memory types = new DistributionType[](numDistributions);
+ for (uint i = 0; i < numDistributions; ++i) {
+ types[i] = DistributionType(uint8(_randUint({min: 1, max: 5})));
+ }
+
+ // 1. Add distributions (all have totalEpochs = 1 by default, meaning they end after first epoch)
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributionsWithTypes(operatorSets, strategies, types, startEpoch, totalWeight);
+
+ // Update some distributions to have totalEpochs = 0 (infinite, so they DON'T end)
+ // The rest keep totalEpochs = 1 (end after startEpoch)
+ uint numInfinite = _randUint({min: 1, max: numDistributions - 1});
+ for (uint i = 0; i < numInfinite; ++i) {
+ distributions[i].totalEpochs = 0; // Infinite - will be active in all epochs
+ cheats.prank(incentiveCouncil);
+ emissionsController.updateDistribution(distributionIds[i], distributions[i]);
+ }
+ uint numTimeLimited = numDistributions - numInfinite;
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Warp to the first epoch where time-limited distributions are active
+ ic.warpToEpoch(startEpoch);
+ check_warpToEpoch_State(startEpoch);
+
+ // 3. Press button - all distributions should be processed
+ uint processed = ic.pressButton(numDistributions);
+ assertEq(processed, numDistributions, "All distributions should be processed in their start epoch");
+
+ // 4. Verify button is not pressable (all distributions processed for this epoch)
+ assertFalse(emissionsController.isButtonPressable(), "Button should not be pressable after all distributions processed");
+
+ // 5. Warp to the next epoch where time-limited distributions have ended
+ // Distributions with totalEpochs = 1 end when currentEpoch >= startEpoch + totalEpochs
+ // i.e., currentEpoch >= startEpoch + 1
+ ic.warpToEpoch(startEpoch + 1);
+ check_warpToEpoch_State(startEpoch + 1);
+
+ // 6. Press button - should skip ended distributions
+ // In the new epoch, only infinite distributions (totalEpochs = 0) should be processed
+ // Time-limited distributions (totalEpochs = 1) have ended
+ processed = ic.pressButton(numDistributions);
+ assertEq(processed, numInfinite, "Should skip ended distributions and only process infinite ones");
+ }
+
+ /// @dev Assert that the function skips distributions with zero weight.
+ function testFuzz_addDists_pressButton_skipsZeroWeightDistributions(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+ numDistributions = _randUint({min: 2, max: 32}); // Need at least 2 distributions
+ totalWeight = uint16(_randUint({min: numDistributions, max: 10_000})); // Recalculate for new numDistributions
+
+ // Generate random distribution types (non-disabled)
+ DistributionType[] memory types = new DistributionType[](numDistributions);
+ for (uint i = 0; i < numDistributions; ++i) {
+ types[i] = DistributionType(uint8(_randUint({min: 1, max: 5})));
+ }
+
+ // 1. Add distributions
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributionsWithTypes(operatorSets, strategies, types, startEpoch, totalWeight);
+
+ // Update some distributions to have zero weight
+ uint numZeroWeight = _randUint({min: 1, max: numDistributions - 1});
+ for (uint i = 0; i < numZeroWeight; ++i) {
+ distributions[i].weight = 0;
+ cheats.prank(incentiveCouncil);
+ emissionsController.updateDistribution(distributionIds[i], distributions[i]);
+ }
+
+ // Recalculate expected totalWeight after zero-weight updates
+ uint16 expectedTotalWeight = 0;
+ for (uint i = 0; i < distributions.length; ++i) {
+ expectedTotalWeight += uint16(distributions[i].weight);
+ }
+ check_addDists_State(distributionIds, distributions, expectedTotalWeight);
+
+ // 2. Warp to start epoch
+ ic.warpToEpoch(startEpoch);
+ check_warpToEpoch_State(startEpoch);
+
+ // 3. Press button - should skip zero-weight distributions
+ // Note: Zero-weight distributions don't emit DistributionProcessed events
+ uint processed = ic.pressButton(numDistributions);
+ uint expectedProcessed = numDistributions - numZeroWeight;
+ assertEq(processed, expectedProcessed, "Should skip zero-weight distributions");
+ }
+
+ /// @dev Assert that the function processes zero distributions when length is zero.
+ function testFuzz_addDists_pressButtonLengthZero_NoneProcessed(uint24 r) public rand(r) {
+ (uint64 startEpoch, uint16 totalWeight, uint numDistributions) = _genRandParams();
+
+ // 1. Add distributions
+ (uint[] memory distributionIds, Distribution[] memory distributions) =
+ ic.addDistributions(operatorSets, strategies, numDistributions, startEpoch, totalWeight);
+ check_addDists_State(distributionIds, distributions, totalWeight);
+
+ // 2. Warp to start epoch
+ ic.warpToEpoch(startEpoch);
+ check_warpToEpoch_State(startEpoch);
+
+ // 3. Press button with length 0 - should process zero distributions
+ uint processed = ic.pressButton(0);
+ assertEq(processed, 0, "Should process zero distributions when length is zero");
+
+ // 4. Button should still be pressable since distributions remain
+ assertTrue(emissionsController.isButtonPressable(), "Button should still be pressable");
+ }
+
+ /// -----------------------------------------------------------------------
+ /// Edge cases
+ /// -----------------------------------------------------------------------
+
+ /// @dev Assert that sweep returns false when there are no distributions and no emissions minted.
+ function testFuzz_noDistributions_pressButton_NoneProcessed_sweep_AllEmissionsShouldBeSwept(uint24 r) public rand(r) {
+ uint64 startEpoch = uint64(_randUint({min: 0, max: 100}));
+
+ // 1. Warp to start epoch (no distributions added)
+ ic.warpToEpoch(startEpoch);
+ check_warpToEpoch_State(startEpoch);
+
+ // 2. When there are no distributions, pressButton should revert with AllDistributionsProcessed
+ // because totalProcessable = 0 and totalProcessed = 0 (i.e., all 0 distributions are "processed")
+ vm.expectRevert(IEmissionsControllerErrors.AllDistributionsProcessed.selector);
+ ic.pressButton(1);
+
+ // 3. Sweep - since pressButton was never successfully called, no emissions were minted,
+ // so sweep should return false (nothing to sweep)
+ bool swept = ic.sweep();
+ assertFalse(swept, "Should not sweep when no emissions were minted");
+ }
+}
diff --git a/src/test/integration/tests/EmissionsController_ReentrancyGrief.t.sol b/src/test/integration/tests/EmissionsController_ReentrancyGrief.t.sol
new file mode 100644
index 0000000000..cb921cd889
--- /dev/null
+++ b/src/test/integration/tests/EmissionsController_ReentrancyGrief.t.sol
@@ -0,0 +1,138 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+// import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+// import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
+// import "src/test/integration/IntegrationChecks.t.sol";
+// import "src/contracts/core/EmissionsController.sol";
+// import "src/contracts/interfaces/IEmissionsController.sol";
+
+// contract MaliciousReentrantToken is ERC20 {
+// address immutable emissionsController;
+// address immutable rewardsCoordinator;
+// bool public attackEnabled;
+// bool private attacking;
+
+// constructor(address _ec, address _rc) ERC20("Malicious", "MAL") {
+// emissionsController = _ec;
+// rewardsCoordinator = _rc;
+// }
+
+// function mint(address to, uint amount) external {
+// _mint(to, amount);
+// }
+
+// function enableAttack() external {
+// attackEnabled = true;
+// }
+
+// function transferFrom(address from, address to, uint amount) public override returns (bool) {
+// if (attackEnabled && msg.sender == rewardsCoordinator && !attacking) {
+// attacking = true;
+// try EmissionsController(emissionsController).pressButton(1) {} catch {}
+// attacking = false;
+// }
+// return super.transferFrom(from, to, amount);
+// }
+// }
+
+// contract Integration_EmissionsController_ReentrancyGrief is IntegrationCheckUtils, IEmissionsControllerTypes {
+// MaliciousReentrantToken maliciousToken;
+// address attacker = address(0xBAD);
+// address incentiveCouncil;
+
+// function setUp() public virtual override {
+// super.setUp();
+
+// cheats.prank(rewardsCoordinator.owner());
+// rewardsCoordinator.setRewardsForAllSubmitter(address(emissionsController), true);
+
+// maliciousToken = new MaliciousReentrantToken(address(emissionsController), address(rewardsCoordinator));
+
+// incentiveCouncil = emissionsController.incentiveCouncil();
+// }
+
+// /// -----------------------------------------------------------------------
+// /// Helpers
+// /// -----------------------------------------------------------------------
+
+// function _addDistribution(uint64 startEpoch, uint64 totalEpochs, uint64 weight) internal {
+// IRewardsCoordinatorTypes.StrategyAndMultiplier[][] memory strategiesAndMultipliers =
+// new IRewardsCoordinatorTypes.StrategyAndMultiplier[][](1);
+// strategiesAndMultipliers[0] = new IRewardsCoordinatorTypes.StrategyAndMultiplier[](1);
+// strategiesAndMultipliers[0][0] = IRewardsCoordinatorTypes.StrategyAndMultiplier({strategy: allStrats[0], multiplier: 1e18});
+
+// cheats.prank(incentiveCouncil);
+// emissionsController.addDistribution(
+// Distribution({
+// distributionType: DistributionType.RewardsForAllEarners,
+// weight: weight,
+// operatorSet: OperatorSet({avs: address(0), id: 0}),
+// strategiesAndMultipliers: strategiesAndMultipliers,
+// startEpoch: startEpoch,
+// totalEpochs: totalEpochs
+// })
+// );
+// }
+
+// function _pressButton(uint length, uint expectedProcessed) internal {
+// vm.recordLogs();
+// emissionsController.pressButton(length);
+
+// uint processed;
+// Vm.Log[] memory logs = cheats.getRecordedLogs();
+// for (uint i = 0; i < logs.length; ++i) {
+// if (logs[i].topics.length > 0 && logs[i].topics[0] == IEmissionsControllerEvents.DistributionProcessed.selector) {
+// ++processed;
+// }
+// }
+// assertEq(processed, expectedProcessed, "processed != expectedProcessed");
+// }
+
+// /// -----------------------------------------------------------------------
+// /// Tests
+// /// -----------------------------------------------------------------------
+
+// function test_addDistribution_reenter_pressButton_sweep() public {
+// // Add simple distribution that runs for 1 epoch.
+// _addDistribution({startEpoch: 1, totalEpochs: 1, weight: 10_000});
+
+// // Attempt reentrancy attack via malicious token.
+// // Previously, these assertions would revert effectively griefing the system.
+// cheats.warp(emissionsController.EMISSIONS_START_TIME() + 1 weeks);
+// assertTrue(emissionsController.isButtonPressable(), "button should be pressable before attack");
+// _executeReentrancyAttack();
+// assertTrue(emissionsController.isButtonPressable(), "button should be pressable after attack");
+
+// // Process the distribution, expecting it to succeed.
+// _pressButton({length: 1, expectedProcessed: 1});
+
+// // Attempt to sweep, no funds should be transferred.
+// uint councilBalanceBefore = EIGEN.balanceOf(incentiveCouncil);
+// emissionsController.sweep();
+// assertEq(EIGEN.balanceOf(incentiveCouncil), councilBalanceBefore, "council balance should not have changed");
+// }
+
+// function _executeReentrancyAttack() internal {
+// maliciousToken.mint(attacker, 1);
+// maliciousToken.enableAttack();
+
+// IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory strategiesAndMultipliers =
+// new IRewardsCoordinatorTypes.StrategyAndMultiplier[](1);
+// strategiesAndMultipliers[0] = IRewardsCoordinatorTypes.StrategyAndMultiplier({strategy: allStrats[0], multiplier: 1e18});
+
+// IRewardsCoordinatorTypes.RewardsSubmission[] memory submissions = new IRewardsCoordinatorTypes.RewardsSubmission[](1);
+// submissions[0] = IRewardsCoordinatorTypes.RewardsSubmission({
+// strategiesAndMultipliers: strategiesAndMultipliers,
+// token: IERC20(address(maliciousToken)),
+// amount: 1,
+// startTimestamp: uint32((block.timestamp - 7 days) / 86_400 * 86_400),
+// duration: uint32(1 days)
+// });
+
+// cheats.startPrank(attacker);
+// maliciousToken.approve(address(rewardsCoordinator), type(uint).max);
+// rewardsCoordinator.createAVSRewardsSubmission(submissions);
+// cheats.stopPrank();
+// }
+// }
diff --git a/src/test/integration/tests/upgrade/StrategyManagerHooksUpgrade.t.sol b/src/test/integration/tests/upgrade/StrategyManagerHooksUpgrade.t.sol
new file mode 100644
index 0000000000..f232715f10
--- /dev/null
+++ b/src/test/integration/tests/upgrade/StrategyManagerHooksUpgrade.t.sol
@@ -0,0 +1,131 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "src/test/integration/UpgradeTest.t.sol";
+
+/// @title Upgrade test for StrategyManager hooks (beforeAddShares/beforeRemoveShares)
+/// @notice Verifies that deposits made before the upgrade can be queued for withdrawal
+/// and completed as shares after the upgrade, testing that the new hooks work
+/// correctly with pre-existing strategies.
+contract Integration_Upgrade_StrategyManagerHooks is UpgradeTest {
+ /// @notice Test: deposit -> upgrade -> queue withdrawal -> complete as shares
+ /// @dev Ensures the new beforeRemoveShares and beforeAddShares hooks don't break
+ /// the withdrawal flow for deposits made before the upgrade.
+ function testFuzz_deposit_upgrade_queue_completeAsShares(uint24 _random) public rand(_random) {
+ /// Pre-upgrade:
+ /// 1. Create staker with some assets
+ /// 2. Staker deposits into EigenLayer
+ (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
+
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+ uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+
+ /// Upgrade to new contracts (with beforeAddShares/beforeRemoveShares hooks)
+ _upgradeEigenLayerContracts();
+
+ /// Post-upgrade:
+ /// Queue withdrawal (tests beforeRemoveShares hook)
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+
+ /// Complete withdrawal as shares (tests beforeAddShares hook)
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint i = 0; i < withdrawals.length; i++) {
+ staker.completeWithdrawalAsShares(withdrawals[i]);
+ }
+
+ /// Verify staker has their shares back
+ for (uint i = 0; i < strategies.length; i++) {
+ uint stakerShares;
+ if (strategies[i] == BEACONCHAIN_ETH_STRAT) {
+ // Beacon chain ETH shares are tracked in EigenPodManager, not StrategyManager
+ int podShares = eigenPodManager.podOwnerDepositShares(address(staker));
+ stakerShares = podShares > 0 ? uint(podShares) : 0;
+ } else {
+ stakerShares = strategyManager.stakerDepositShares(address(staker), strategies[i]);
+ }
+ assertEq(stakerShares, shares[i], "staker should have shares restored after completing as shares");
+ }
+ }
+
+ /// @notice Test: deposit -> upgrade -> queue withdrawal -> complete as tokens
+ /// @dev Ensures the new beforeRemoveShares hook doesn't break the token withdrawal flow.
+ function testFuzz_deposit_upgrade_queue_completeAsTokens(uint24 _random) public rand(_random) {
+ /// Pre-upgrade:
+ /// 1. Create staker with some assets
+ /// 2. Staker deposits into EigenLayer
+ (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
+
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+ uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+
+ /// Upgrade to new contracts
+ _upgradeEigenLayerContracts();
+
+ /// Post-upgrade:
+ /// Queue withdrawal (tests beforeRemoveShares hook)
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+
+ /// Complete withdrawal as tokens
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+
+ // Record token balances before completing withdrawals
+ IERC20[] memory tokens = _getUnderlyingTokens(strategies);
+ uint[] memory balancesBefore = _getTokenBalances(staker, tokens);
+
+ for (uint i = 0; i < withdrawals.length; i++) {
+ staker.completeWithdrawalAsTokens(withdrawals[i]);
+ }
+
+ // Get balances after completing withdrawals
+ uint[] memory balancesAfter = _getTokenBalances(staker, tokens);
+
+ /// Verify staker has no shares and got tokens back
+ for (uint i = 0; i < strategies.length; i++) {
+ uint stakerShares = strategyManager.stakerDepositShares(address(staker), strategies[i]);
+ assertEq(stakerShares, 0, "staker should have no shares after completing as tokens");
+
+ // Verify token balance increased (skip beacon chain ETH which has different mechanics)
+ if (strategies[i] != BEACONCHAIN_ETH_STRAT) {
+ assertGt(balancesAfter[i], balancesBefore[i], "staker should have received tokens back");
+ }
+ }
+ }
+
+ /// @notice Test: queue -> upgrade -> complete as shares
+ /// @dev Ensures withdrawals queued before the upgrade can still be completed
+ /// as shares after the upgrade.
+ function testFuzz_queue_upgrade_completeAsShares(uint24 _random) public rand(_random) {
+ /// Pre-upgrade:
+ /// 1. Create staker with some assets
+ /// 2. Staker deposits into EigenLayer
+ /// 3. Queue withdrawal
+ (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
+
+ staker.depositIntoEigenlayer(strategies, tokenBalances);
+ uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
+ Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
+
+ /// Upgrade to new contracts
+ _upgradeEigenLayerContracts();
+
+ /// Post-upgrade:
+ /// Complete withdrawal as shares (tests beforeAddShares hook for pre-upgrade queued withdrawal)
+ _rollBlocksForCompleteWithdrawals(withdrawals);
+ for (uint i = 0; i < withdrawals.length; i++) {
+ staker.completeWithdrawalAsShares(withdrawals[i]);
+ }
+
+ /// Verify staker has their shares back
+ for (uint i = 0; i < strategies.length; i++) {
+ uint stakerShares;
+ if (strategies[i] == BEACONCHAIN_ETH_STRAT) {
+ // Beacon chain ETH shares are tracked in EigenPodManager, not StrategyManager
+ int podShares = eigenPodManager.podOwnerDepositShares(address(staker));
+ stakerShares = podShares > 0 ? uint(podShares) : 0;
+ } else {
+ stakerShares = strategyManager.stakerDepositShares(address(staker), strategies[i]);
+ }
+ assertEq(stakerShares, shares[i], "staker should have shares restored after completing as shares");
+ }
+ }
+}
diff --git a/src/test/integration/users/AVS.t.sol b/src/test/integration/users/AVS.t.sol
index 115bfb9a96..122bafb798 100644
--- a/src/test/integration/users/AVS.t.sol
+++ b/src/test/integration/users/AVS.t.sol
@@ -210,7 +210,7 @@ contract AVS is Logger, IAllocationManagerTypes, IAVSRegistrar {
"slashOperator",
string.concat(
"{operator: ",
- User(payable(params.operator)).NAME_COLORED(),
+ _formatActor(params.operator),
", operatorSetId: ",
cheats.toString(params.operatorSetId),
", strategy: ",
@@ -246,7 +246,7 @@ contract AVS is Logger, IAllocationManagerTypes, IAVSRegistrar {
"slashOperator",
string.concat(
"{operator: ",
- User(payable(params.operator)).NAME_COLORED(),
+ _formatActor(params.operator),
", operatorSetId: ",
cheats.toString(params.operatorSetId),
", strategy: ",
@@ -285,7 +285,7 @@ contract AVS is Logger, IAllocationManagerTypes, IAVSRegistrar {
"slashOperator",
string.concat(
"{operator: ",
- operator.NAME_COLORED(),
+ _formatActor(address(operator)),
", operatorSetId: ",
cheats.toString(operatorSetId),
", strategy: ",
@@ -412,4 +412,13 @@ contract AVS is Logger, IAllocationManagerTypes, IAVSRegistrar {
function _tryPrankAppointee_AllocationManager(bytes4 selector) internal {
return _tryPrankAppointee(address(allocationManager), selector);
}
+
+ function _formatActor(address actor) internal view returns (string memory) {
+ if (actor == address(0)) return "address(0)";
+ try Logger(actor).NAME_COLORED() returns (string memory colored) {
+ return colored;
+ } catch {
+ return cheats.toString(actor);
+ }
+ }
}
diff --git a/src/test/integration/users/IncentiveCouncil.t.sol b/src/test/integration/users/IncentiveCouncil.t.sol
new file mode 100644
index 0000000000..20a72f306c
--- /dev/null
+++ b/src/test/integration/users/IncentiveCouncil.t.sol
@@ -0,0 +1,243 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "forge-std/Test.sol";
+import "src/contracts/interfaces/IEmissionsController.sol";
+import "src/test/utils/Logger.t.sol";
+import "src/test/integration/TimeMachine.t.sol";
+
+contract IncentiveCouncil is Logger, IEmissionsControllerTypes {
+ using print for *;
+
+ modifier createSnapshot() {
+ timeMachine.createSnapshot();
+ _;
+ }
+
+ IEmissionsController immutable emissionsController;
+ address immutable incentiveCouncil;
+ TimeMachine immutable timeMachine;
+
+ constructor(IEmissionsController _emissionsController, address _incentiveCouncil, TimeMachine _timeMachine) {
+ emissionsController = _emissionsController;
+ incentiveCouncil = _incentiveCouncil;
+ timeMachine = _timeMachine;
+ }
+
+ function NAME() public view override returns (string memory) {
+ return "IncentiveCouncil";
+ }
+
+ function _randomStrategiesAndMultipliers(IStrategy[] memory strategies)
+ internal
+ returns (IRewardsCoordinatorTypes.StrategyAndMultiplier[][] memory strategiesAndMultipliers)
+ {
+ uint numStrategies = vm.randomUint({min: 1, max: strategies.length});
+ strategiesAndMultipliers = new IRewardsCoordinatorTypes.StrategyAndMultiplier[][](numStrategies);
+ uint multiplierLeft = 1e18;
+
+ for (uint i = 0; i < numStrategies; i++) {
+ strategiesAndMultipliers[i] = new IRewardsCoordinatorTypes.StrategyAndMultiplier[](1);
+ uint multiplier;
+
+ // For all strategies except the last, randomly assign multiplier
+ // ensuring we leave enough for remaining strategies (at least 1 per strategy)
+ if (i < numStrategies - 1) {
+ uint remainingStrategies = numStrategies - i - 1;
+ uint minMultiplierNeeded = remainingStrategies; // Reserve at least 1 for each remaining strategy
+ uint maxAvailable = multiplierLeft > minMultiplierNeeded ? multiplierLeft - minMultiplierNeeded : 1;
+
+ // Ensure max is at least min (1) to avoid underflow
+ if (maxAvailable < 1) maxAvailable = 1;
+
+ multiplier = vm.randomUint({min: 1, max: maxAvailable});
+ multiplierLeft -= multiplier;
+ } else {
+ // Last strategy gets all remaining multiplier
+ multiplier = multiplierLeft;
+ multiplierLeft = 0;
+ }
+
+ strategiesAndMultipliers[i][0] =
+ IRewardsCoordinatorTypes.StrategyAndMultiplier({strategy: strategies[i], multiplier: uint96(multiplier)});
+ }
+ return strategiesAndMultipliers;
+ }
+
+ function _randomOperatorSet(OperatorSet[] memory operatorSets) internal returns (OperatorSet memory operatorSet) {
+ operatorSet = operatorSets[vm.randomUint({min: 0, max: operatorSets.length - 1})];
+ return operatorSet;
+ }
+
+ function _randomDistributionType(bool allowDisabled) internal returns (DistributionType distributionType) {
+ return DistributionType(uint8(vm.randomUint({min: allowDisabled ? 0 : 1, max: 5})));
+ }
+
+ function addDistributions(
+ OperatorSet[] memory operatorSets,
+ IStrategy[] memory strategies,
+ uint numDistributions,
+ uint64 startEpoch,
+ uint16 totalWeight
+ ) public createSnapshot returns (uint[] memory distributionIds, Distribution[] memory distributions) {
+ print.method("addDistributions");
+
+ // Generate random distribution types
+ DistributionType[] memory distributionTypes = new DistributionType[](numDistributions);
+ for (uint i = 0; i < numDistributions; ++i) {
+ distributionTypes[i] = _randomDistributionType({allowDisabled: false});
+ }
+
+ (distributionIds, distributions) = _addDistributionsInternal(operatorSets, strategies, distributionTypes, startEpoch, totalWeight);
+
+ print.gasUsed();
+ return (distributionIds, distributions);
+ }
+
+ function addDistributionsWithTypes(
+ OperatorSet[] memory operatorSets,
+ IStrategy[] memory strategies,
+ DistributionType[] memory distributionTypes,
+ uint64 startEpoch,
+ uint16 totalWeight
+ ) public createSnapshot returns (uint[] memory distributionIds, Distribution[] memory distributions) {
+ print.method("addDistributionsWithTypes");
+
+ (distributionIds, distributions) = _addDistributionsInternal(operatorSets, strategies, distributionTypes, startEpoch, totalWeight);
+
+ print.gasUsed();
+ return (distributionIds, distributions);
+ }
+
+ function _addDistributionsInternal(
+ OperatorSet[] memory operatorSets,
+ IStrategy[] memory strategies,
+ DistributionType[] memory distributionTypes,
+ uint64 startEpoch,
+ uint16 totalWeight
+ ) internal returns (uint[] memory distributionIds, Distribution[] memory distributions) {
+ uint numDistributions = distributionTypes.length;
+ distributionIds = new uint[](numDistributions);
+ distributions = new Distribution[](numDistributions);
+
+ uint16 weightLeft = totalWeight;
+
+ for (uint i = 0; i < numDistributions; ++i) {
+ uint16 weight;
+
+ // For all distributions except the last, randomly assign weight
+ // ensuring we leave enough for remaining distributions (at least 1 per distribution)
+ if (i < numDistributions - 1) {
+ uint remainingDistributions = numDistributions - i - 1;
+ uint minWeightNeeded = remainingDistributions; // Reserve at least 1 for each remaining dist
+ uint maxAvailable = weightLeft > minWeightNeeded ? weightLeft - minWeightNeeded : 1;
+
+ // Ensure max is at least min (1) to avoid underflow
+ if (maxAvailable < 1) maxAvailable = 1;
+
+ weight = uint16(vm.randomUint({min: 1, max: maxAvailable}));
+ weightLeft -= weight;
+ } else {
+ // Last distribution gets all remaining weight
+ weight = weightLeft;
+ weightLeft = 0;
+ }
+
+ DistributionType distributionType = distributionTypes[i];
+
+ distributions[i] = Distribution({
+ weight: weight,
+ startEpoch: startEpoch,
+ totalEpochs: 1,
+ distributionType: distributionType,
+ operatorSet: (distributionType == DistributionType.OperatorSetTotalStake
+ || distributionType == DistributionType.OperatorSetUniqueStake || distributionType == DistributionType.EigenDA)
+ ? _randomOperatorSet(operatorSets)
+ : OperatorSet({avs: address(0), id: 0}),
+ strategiesAndMultipliers: _randomStrategiesAndMultipliers(strategies)
+ });
+
+ vm.prank(incentiveCouncil);
+ distributionIds[i] = emissionsController.addDistribution(distributions[i]);
+ }
+
+ return (distributionIds, distributions);
+ }
+
+ function updateDistributions(uint[] memory distributionIds, Distribution[] memory distributions, uint16[] memory weights)
+ public
+ createSnapshot
+ returns (Distribution[] memory updated)
+ {
+ print.method("updateDistributions");
+ // To avoid TotalWeightExceedsMax errors during sequential updates,
+ // we need to update in an order that doesn't cause intermediate totals to exceed MAX_TOTAL_WEIGHT.
+ // Strategy: First decrease weights, then increase/keep same weights.
+
+ // Store original weights for comparison
+ uint16[] memory originalWeights = new uint16[](distributions.length);
+ for (uint i = 0; i < distributions.length; ++i) {
+ originalWeights[i] = uint16(distributions[i].weight);
+ }
+
+ // First pass: decrease weights
+ for (uint i = 0; i < distributions.length; ++i) {
+ if (weights[i] < originalWeights[i]) {
+ distributions[i].weight = weights[i];
+ vm.prank(incentiveCouncil);
+ emissionsController.updateDistribution(distributionIds[i], distributions[i]);
+ }
+ }
+
+ // Second pass: increase or keep same weights
+ for (uint i = 0; i < distributions.length; ++i) {
+ if (weights[i] >= originalWeights[i]) {
+ distributions[i].weight = weights[i];
+ vm.prank(incentiveCouncil);
+ emissionsController.updateDistribution(distributionIds[i], distributions[i]);
+ }
+ }
+
+ print.gasUsed();
+ return distributions;
+ }
+
+ /// @dev Calls emissionsController.pressButton with a specified length.
+ /// @param length The number of distributions to process.
+ /// @return processed The number of distributions processed.
+ function pressButton(uint length) public createSnapshot returns (uint processed) {
+ print.method("pressButton");
+ vm.recordLogs();
+ emissionsController.pressButton(length);
+ Vm.Log[] memory logs = cheats.getRecordedLogs();
+ for (uint i = 0; i < logs.length; ++i) {
+ if (logs[i].topics.length > 0 && logs[i].topics[0] == IEmissionsControllerEvents.DistributionProcessed.selector) {
+ ++processed;
+ }
+ }
+ print.gasUsed();
+ return processed;
+ }
+
+ /// @dev Calls emissionsController.sweep.
+ function sweep() public createSnapshot returns (bool swept) {
+ print.method("sweep");
+ vm.recordLogs();
+ emissionsController.sweep();
+ Vm.Log[] memory logs = cheats.getRecordedLogs();
+ for (uint i = 0; i < logs.length; ++i) {
+ if (logs[i].topics.length > 0 && logs[i].topics[0] == IEmissionsControllerEvents.Swept.selector) return true;
+ }
+ print.gasUsed();
+ return false;
+ }
+
+ /// @dev Warps the chain to a random timestamp within an epoch.
+ /// @param epoch The epoch to warp to.
+ function warpToEpoch(uint epoch) public createSnapshot {
+ print.method("warpToEpoch");
+ uint epochLength = emissionsController.EMISSIONS_EPOCH_LENGTH();
+ uint randomExcess = vm.randomUint({min: 0, max: epochLength - 1}); // random time wtihin the epoch
+ cheats.warp(emissionsController.EMISSIONS_START_TIME() + (epoch * epochLength) + randomExcess);
+ }
+}
diff --git a/src/test/mocks/AllocationManagerMock.sol b/src/test/mocks/AllocationManagerMock.sol
index b0cfe66aa2..a2bf5a8e6b 100644
--- a/src/test/mocks/AllocationManagerMock.sol
+++ b/src/test/mocks/AllocationManagerMock.sol
@@ -3,6 +3,7 @@ pragma solidity ^0.8.9;
import "forge-std/Test.sol";
import "src/contracts/interfaces/IStrategy.sol";
+import "src/contracts/interfaces/IAllocationManager.sol";
import "src/contracts/libraries/Snapshots.sol";
import "src/contracts/libraries/OperatorSetLib.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
@@ -27,6 +28,49 @@ contract AllocationManagerMock is Test {
mapping(bytes32 operatorSetKey => mapping(address operator => mapping(IStrategy strategy => uint minimumSlashableStake))) internal
_minimumSlashableStake;
mapping(bytes32 operatorSetKey => mapping(address operator => bool)) internal _isOperatorSlashable;
+ mapping(address operator => mapping(bytes32 operatorSetKey => mapping(IStrategy strategy => IAllocationManagerTypes.Allocation)))
+ internal _allocations;
+ mapping(bytes32 operatorSetKey => mapping(address operator => bool)) internal _isMemberOfOperatorSet;
+
+ struct RegisterCall {
+ address operator;
+ address avs;
+ uint32[] operatorSetIds;
+ bytes data;
+ }
+
+ struct AllocateCall {
+ address operator;
+ address avs;
+ uint32 operatorSetId;
+ IStrategy strategy;
+ uint64 magnitude;
+ }
+
+ struct DeregisterCall {
+ address operator;
+ address avs;
+ uint32[] operatorSetIds;
+ }
+
+ RegisterCall internal _lastRegisterCall;
+ AllocateCall internal _lastAllocateCall;
+ DeregisterCall internal _lastDeregisterCall;
+
+ uint public registerForOperatorSetsCallCount;
+ uint public modifyAllocationsCallCount;
+ uint public deregisterFromOperatorSetsCallCount;
+
+ bool public revertModifyAllocations;
+ bool public revertDeregisterFromOperatorSets;
+
+ function setRevertModifyAllocations(bool shouldRevert) external {
+ revertModifyAllocations = shouldRevert;
+ }
+
+ function setRevertDeregisterFromOperatorSets(bool shouldRevert) external {
+ revertDeregisterFromOperatorSets = shouldRevert;
+ }
function getSlashCount(OperatorSet memory operatorSet) external view returns (uint) {
return _getSlashCount[operatorSet.key()];
@@ -58,6 +102,10 @@ contract AllocationManagerMock is Test {
return _isOperatorSet[operatorSet.key()];
}
+ function isMemberOfOperatorSet(address operator, OperatorSet memory operatorSet) external view returns (bool) {
+ return _isMemberOfOperatorSet[operatorSet.key()][operator];
+ }
+
function setMaxMagnitudes(address operator, IStrategy[] calldata strategies, uint64[] calldata maxMagnitudes) external {
for (uint i = 0; i < strategies.length; ++i) {
setMaxMagnitude(operator, strategies[i], maxMagnitudes[i]);
@@ -162,4 +210,75 @@ contract AllocationManagerMock is Test {
function setIsOperatorSlashable(address operator, OperatorSet memory operatorSet, bool isSlashable) external {
_isOperatorSlashable[operatorSet.key()][operator] = isSlashable;
}
+
+ function registerForOperatorSets(address operator, IAllocationManager.RegisterParams calldata params) external {
+ registerForOperatorSetsCallCount++;
+ _lastRegisterCall.operator = operator;
+ _lastRegisterCall.avs = params.avs;
+ delete _lastRegisterCall.operatorSetIds;
+ for (uint i = 0; i < params.operatorSetIds.length; ++i) {
+ _lastRegisterCall.operatorSetIds.push(params.operatorSetIds[i]);
+ _isMemberOfOperatorSet[OperatorSet({avs: params.avs, id: params.operatorSetIds[i]}).key()][operator] = true;
+ }
+ _lastRegisterCall.data = params.data;
+ }
+
+ function lastRegisterForOperatorSetsCall() external view returns (RegisterCall memory) {
+ return _lastRegisterCall;
+ }
+
+ function modifyAllocations(address operator, IAllocationManager.AllocateParams[] calldata params) external {
+ if (revertModifyAllocations) revert("AllocationManagerMock: modifyAllocations reverted");
+ modifyAllocationsCallCount++;
+ delete _lastAllocateCall;
+ _lastAllocateCall.operator = operator;
+
+ if (params.length > 0) {
+ IAllocationManager.AllocateParams calldata first = params[0];
+ _lastAllocateCall.avs = first.operatorSet.avs;
+ _lastAllocateCall.operatorSetId = first.operatorSet.id;
+ if (first.strategies.length > 0) _lastAllocateCall.strategy = first.strategies[0];
+ if (first.newMagnitudes.length > 0) _lastAllocateCall.magnitude = first.newMagnitudes[0];
+ }
+
+ // Persist allocations so `getAllocation` can return meaningful values.
+ for (uint i = 0; i < params.length; ++i) {
+ IAllocationManager.AllocateParams calldata p = params[i];
+ bytes32 key = p.operatorSet.key();
+ uint stratsLen = p.strategies.length;
+ uint magsLen = p.newMagnitudes.length;
+ for (uint j = 0; j < stratsLen && j < magsLen; ++j) {
+ _allocations[operator][key][p.strategies[j]] =
+ IAllocationManagerTypes.Allocation({currentMagnitude: p.newMagnitudes[j], pendingDiff: 0, effectBlock: 0});
+ }
+ }
+ }
+
+ function lastModifyAllocationsCall() external view returns (AllocateCall memory) {
+ return _lastAllocateCall;
+ }
+
+ function deregisterFromOperatorSets(IAllocationManager.DeregisterParams calldata params) external {
+ if (revertDeregisterFromOperatorSets) revert("AllocationManagerMock: deregisterFromOperatorSets reverted");
+ deregisterFromOperatorSetsCallCount++;
+ _lastDeregisterCall.operator = params.operator;
+ _lastDeregisterCall.avs = params.avs;
+ delete _lastDeregisterCall.operatorSetIds;
+ for (uint i = 0; i < params.operatorSetIds.length; ++i) {
+ _lastDeregisterCall.operatorSetIds.push(params.operatorSetIds[i]);
+ _isMemberOfOperatorSet[OperatorSet({avs: params.avs, id: params.operatorSetIds[i]}).key()][params.operator] = false;
+ }
+ }
+
+ function lastDeregisterFromOperatorSetsCall() external view returns (DeregisterCall memory) {
+ return _lastDeregisterCall;
+ }
+
+ function getAllocation(address operator, OperatorSet memory operatorSet, IStrategy strategy)
+ external
+ view
+ returns (IAllocationManagerTypes.Allocation memory)
+ {
+ return _allocations[operator][operatorSet.key()][strategy];
+ }
}
diff --git a/src/test/mocks/BackingEigenMock.sol b/src/test/mocks/BackingEigenMock.sol
new file mode 100644
index 0000000000..1852254d9c
--- /dev/null
+++ b/src/test/mocks/BackingEigenMock.sol
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.9;
+
+import "forge-std/Test.sol";
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+
+contract BackingEigenMock is Test, ERC20 {
+ constructor() ERC20("Backing EIGEN", "bEIGEN") {}
+
+ function mint(address to, uint amount) external {
+ _mint(to, amount);
+ }
+}
+
diff --git a/src/test/mocks/DelegationManagerMock.sol b/src/test/mocks/DelegationManagerMock.sol
index 1c4ab66cac..49907fec10 100644
--- a/src/test/mocks/DelegationManagerMock.sol
+++ b/src/test/mocks/DelegationManagerMock.sol
@@ -15,9 +15,42 @@ contract DelegationManagerMock is Test {
mapping(address => address) public delegatedTo;
mapping(address => mapping(IStrategy => uint)) public operatorShares;
+ uint32 internal _minWithdrawalDelayBlocks;
+
+ struct RegisterAsOperatorCall {
+ address operator;
+ address delegationApprover;
+ uint32 allocationDelay;
+ string metadataURI;
+ }
+
+ RegisterAsOperatorCall internal _lastRegisterAsOperatorCall;
+ uint public registerAsOperatorCallCount;
+
+ struct ModifyOperatorDetailsCall {
+ address operator;
+ address newDelegationApprover;
+ }
+
+ struct UpdateOperatorMetadataURICall {
+ address operator;
+ string metadataURI;
+ }
+
+ ModifyOperatorDetailsCall internal _lastModifyOperatorDetailsCall;
+ UpdateOperatorMetadataURICall internal _lastUpdateOperatorMetadataURICall;
+ uint public modifyOperatorDetailsCallCount;
+ uint public updateOperatorMetadataURICallCount;
+
function getDelegatableShares(address staker) external view returns (IStrategy[] memory, uint[] memory) {}
- function setMinWithdrawalDelayBlocks(uint newMinWithdrawalDelayBlocks) external {}
+ function setMinWithdrawalDelayBlocks(uint32 newMinWithdrawalDelayBlocks) external {
+ _minWithdrawalDelayBlocks = newMinWithdrawalDelayBlocks;
+ }
+
+ function minWithdrawalDelayBlocks() external view returns (uint32) {
+ return _minWithdrawalDelayBlocks;
+ }
function setStrategyWithdrawalDelayBlocks(IStrategy[] calldata strategies, uint[] calldata withdrawalDelayBlocks) external {}
@@ -67,11 +100,52 @@ contract DelegationManagerMock is Test {
delegatedTo[msg.sender] = operator;
}
+ function registerAsOperator(address delegationApprover, uint32 allocationDelay, string calldata metadataURI) external {
+ registerAsOperatorCallCount++;
+ isOperator[msg.sender] = true;
+ _lastRegisterAsOperatorCall = RegisterAsOperatorCall({
+ operator: msg.sender,
+ delegationApprover: delegationApprover,
+ allocationDelay: allocationDelay,
+ metadataURI: metadataURI
+ });
+ }
+
+ function modifyOperatorDetails(address operator, address newDelegationApprover) external {
+ modifyOperatorDetailsCallCount++;
+ _lastModifyOperatorDetailsCall = ModifyOperatorDetailsCall({operator: operator, newDelegationApprover: newDelegationApprover});
+ }
+
+ function updateOperatorMetadataURI(address operator, string calldata metadataURI) external {
+ updateOperatorMetadataURICallCount++;
+ _lastUpdateOperatorMetadataURICall = UpdateOperatorMetadataURICall({operator: operator, metadataURI: metadataURI});
+ }
+
+ function lastRegisterAsOperatorCall() external view returns (RegisterAsOperatorCall memory) {
+ return _lastRegisterAsOperatorCall;
+ }
+
+ function lastModifyOperatorDetailsCall() external view returns (ModifyOperatorDetailsCall memory) {
+ return _lastModifyOperatorDetailsCall;
+ }
+
+ function lastUpdateOperatorMetadataURICall() external view returns (UpdateOperatorMetadataURICall memory) {
+ return _lastUpdateOperatorMetadataURICall;
+ }
+
function undelegate(address staker) external returns (bytes32[] memory withdrawalRoot) {
delegatedTo[staker] = address(0);
return withdrawalRoot;
}
+ function getOperatorShares(address operator, IStrategy[] memory strategies) external view returns (uint[] memory) {
+ uint[] memory shares = new uint[](strategies.length);
+ for (uint i = 0; i < strategies.length; i++) {
+ shares[i] = operatorShares[operator][strategies[i]];
+ }
+ return shares;
+ }
+
function getOperatorsShares(address[] memory operators, IStrategy[] memory strategies) external view returns (uint[][] memory) {
uint[][] memory operatorSharesArray = new uint[][](operators.length);
for (uint i = 0; i < operators.length; i++) {
diff --git a/src/test/mocks/EigenMock.sol b/src/test/mocks/EigenMock.sol
new file mode 100644
index 0000000000..0af75641c9
--- /dev/null
+++ b/src/test/mocks/EigenMock.sol
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.9;
+
+import "forge-std/Test.sol";
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+import "./BackingEigenMock.sol";
+
+contract EigenMock is Test, ERC20 {
+ BackingEigenMock backingEigen;
+
+ constructor(BackingEigenMock _backingEigen) ERC20("EIGEN", "EIGEN") {
+ backingEigen = _backingEigen;
+ }
+
+ function wrap(uint amount) external {
+ backingEigen.transferFrom(msg.sender, address(this), amount);
+ _mint(msg.sender, amount);
+ }
+}
diff --git a/src/test/mocks/RewardsCoordinatorMock.sol b/src/test/mocks/RewardsCoordinatorMock.sol
new file mode 100644
index 0000000000..de62451b2c
--- /dev/null
+++ b/src/test/mocks/RewardsCoordinatorMock.sol
@@ -0,0 +1,63 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "forge-std/Test.sol";
+
+import "src/contracts/interfaces/IRewardsCoordinator.sol";
+import "src/contracts/libraries/OperatorSetLib.sol";
+
+contract RewardsCoordinatorMock is Test {
+ receive() external payable {}
+ fallback() external payable {}
+
+ struct SetOperatorAVSSplitCall {
+ address operator;
+ address avs;
+ uint16 split;
+ }
+
+ struct SetOperatorSetSplitCall {
+ address operator;
+ OperatorSet operatorSet;
+ uint16 split;
+ }
+
+ struct SetClaimerForCall {
+ address earner;
+ address claimer;
+ }
+
+ SetOperatorAVSSplitCall internal _lastSetOperatorAVSSplitCall;
+ SetOperatorSetSplitCall internal _lastSetOperatorSetSplitCall;
+ SetClaimerForCall internal _lastSetClaimerForCall;
+ uint public setOperatorAVSSplitCallCount;
+ uint public setOperatorSetSplitCallCount;
+ uint public setClaimerForCallCount;
+
+ function setOperatorAVSSplit(address operator, address avs, uint16 split) external {
+ setOperatorAVSSplitCallCount++;
+ _lastSetOperatorAVSSplitCall = SetOperatorAVSSplitCall({operator: operator, avs: avs, split: split});
+ }
+
+ function setOperatorSetSplit(address operator, OperatorSet calldata operatorSet, uint16 split) external {
+ setOperatorSetSplitCallCount++;
+ _lastSetOperatorSetSplitCall = SetOperatorSetSplitCall({operator: operator, operatorSet: operatorSet, split: split});
+ }
+
+ function setClaimerFor(address earner, address claimer) external {
+ setClaimerForCallCount++;
+ _lastSetClaimerForCall = SetClaimerForCall({earner: earner, claimer: claimer});
+ }
+
+ function lastSetOperatorAVSSplitCall() external view returns (SetOperatorAVSSplitCall memory) {
+ return _lastSetOperatorAVSSplitCall;
+ }
+
+ function lastSetOperatorSetSplitCall() external view returns (SetOperatorSetSplitCall memory) {
+ return _lastSetOperatorSetSplitCall;
+ }
+
+ function lastSetClaimerForCall() external view returns (SetClaimerForCall memory) {
+ return _lastSetClaimerForCall;
+ }
+}
diff --git a/src/test/mocks/StrategyFactoryMock.sol b/src/test/mocks/StrategyFactoryMock.sol
new file mode 100644
index 0000000000..1be04a3483
--- /dev/null
+++ b/src/test/mocks/StrategyFactoryMock.sol
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import "src/contracts/interfaces/IStrategyFactory.sol";
+
+/// @notice Mock StrategyFactory that returns false for isBlacklisted by default.
+contract StrategyFactoryMock {
+ mapping(IERC20 => bool) public isBlacklisted;
+
+ function setIsBlacklisted(IERC20 token, bool blacklisted) external {
+ isBlacklisted[token] = blacklisted;
+ }
+}
+
diff --git a/src/test/unit/DurationVaultStrategyUnit.t.sol b/src/test/unit/DurationVaultStrategyUnit.t.sol
new file mode 100644
index 0000000000..bcaf78bbf8
--- /dev/null
+++ b/src/test/unit/DurationVaultStrategyUnit.t.sol
@@ -0,0 +1,380 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "./StrategyBaseUnit.t.sol";
+import "../../contracts/strategies/DurationVaultStrategy.sol";
+import "../../contracts/interfaces/IDurationVaultStrategy.sol";
+import "../../contracts/interfaces/IDelegationManager.sol";
+import "../../contracts/interfaces/IAllocationManager.sol";
+import "../../contracts/interfaces/IRewardsCoordinator.sol";
+import "../../contracts/interfaces/ISignatureUtilsMixin.sol";
+import "../../contracts/libraries/OperatorSetLib.sol";
+import "../mocks/DelegationManagerMock.sol";
+import "../mocks/AllocationManagerMock.sol";
+import "../mocks/RewardsCoordinatorMock.sol";
+import "../mocks/StrategyFactoryMock.sol";
+
+contract DurationVaultStrategyUnitTests is StrategyBaseUnitTests {
+ DurationVaultStrategy public durationVaultImplementation;
+ DurationVaultStrategy public durationVault;
+ DelegationManagerMock internal delegationManagerMock;
+ AllocationManagerMock internal allocationManagerMock;
+ RewardsCoordinatorMock internal rewardsCoordinatorMock;
+ StrategyFactoryMock internal strategyFactoryMock;
+
+ // TVL limits for tests
+ uint internal maxTotalDeposits = 3200e18;
+ uint internal maxPerDeposit = 32e18;
+
+ uint32 internal defaultDuration = uint32(30 days);
+ address internal constant OPERATOR_SET_AVS = address(0xA11CE);
+ uint32 internal constant OPERATOR_SET_ID = 42;
+ address internal constant DELEGATION_APPROVER = address(0xB0B);
+ uint32 internal constant OPERATOR_ALLOCATION_DELAY = 5;
+ string internal constant OPERATOR_METADATA_URI = "ipfs://operator-metadata";
+ bytes internal constant REGISTRATION_DATA = hex"1234";
+ uint64 internal constant FULL_ALLOCATION = 1e18;
+
+ function setUp() public virtual override {
+ StrategyBaseUnitTests.setUp();
+
+ delegationManagerMock = new DelegationManagerMock();
+ // Configure min withdrawal delay so allocationDelayBlocks == OPERATOR_ALLOCATION_DELAY.
+ delegationManagerMock.setMinWithdrawalDelayBlocks(OPERATOR_ALLOCATION_DELAY - 1);
+ allocationManagerMock = new AllocationManagerMock();
+ rewardsCoordinatorMock = new RewardsCoordinatorMock();
+ strategyFactoryMock = new StrategyFactoryMock();
+
+ durationVaultImplementation = new DurationVaultStrategy(
+ strategyManager,
+ pauserRegistry,
+ IDelegationManager(address(delegationManagerMock)),
+ IAllocationManager(address(allocationManagerMock)),
+ IRewardsCoordinator(address(rewardsCoordinatorMock)),
+ IStrategyFactory(address(strategyFactoryMock))
+ );
+
+ IDurationVaultStrategyTypes.VaultConfig memory config = IDurationVaultStrategyTypes.VaultConfig({
+ underlyingToken: underlyingToken,
+ vaultAdmin: address(this),
+ arbitrator: address(this),
+ duration: defaultDuration,
+ maxPerDeposit: maxPerDeposit,
+ stakeCap: maxTotalDeposits,
+ metadataURI: "ipfs://duration-vault",
+ operatorSet: OperatorSet({avs: OPERATOR_SET_AVS, id: OPERATOR_SET_ID}),
+ operatorSetRegistrationData: REGISTRATION_DATA,
+ delegationApprover: DELEGATION_APPROVER,
+ operatorMetadataURI: OPERATOR_METADATA_URI
+ });
+
+ durationVault = DurationVaultStrategy(
+ address(
+ new TransparentUpgradeableProxy(
+ address(durationVaultImplementation),
+ address(proxyAdmin),
+ abi.encodeWithSelector(DurationVaultStrategy.initialize.selector, config)
+ )
+ )
+ );
+
+ // Set the strategy for inherited tests
+ strategy = StrategyBase(address(durationVault));
+
+ // Configure the mock to return the vault as a supported strategy in the operator set
+ IStrategy[] memory strategies = new IStrategy[](1);
+ strategies[0] = IStrategy(address(durationVault));
+ allocationManagerMock.setStrategiesInOperatorSet(OperatorSet({avs: OPERATOR_SET_AVS, id: OPERATOR_SET_ID}), strategies);
+ }
+
+ // ===================== OPERATOR INTEGRATION TESTS =====================
+
+ function testInitializeConfiguresOperatorIntegration() public {
+ DelegationManagerMock.RegisterAsOperatorCall memory delegationCall = delegationManagerMock.lastRegisterAsOperatorCall();
+ assertEq(delegationCall.operator, address(durationVault), "delegation operator mismatch");
+ assertEq(delegationCall.delegationApprover, DELEGATION_APPROVER, "delegation approver mismatch");
+ assertEq(delegationCall.allocationDelay, OPERATOR_ALLOCATION_DELAY, "allocation delay mismatch");
+ assertEq(delegationCall.metadataURI, OPERATOR_METADATA_URI, "metadata mismatch");
+
+ AllocationManagerMock.RegisterCall memory registerCall = allocationManagerMock.lastRegisterForOperatorSetsCall();
+ assertEq(registerCall.operator, address(durationVault), "register operator mismatch");
+ assertEq(registerCall.avs, OPERATOR_SET_AVS, "register AVS mismatch");
+ assertEq(registerCall.operatorSetIds.length, 1, "unexpected operatorSetIds length");
+ assertEq(registerCall.operatorSetIds[0], OPERATOR_SET_ID, "operatorSetId mismatch");
+ assertEq(registerCall.data, REGISTRATION_DATA, "registration data mismatch");
+
+ (address avs, uint32 operatorSetId) = durationVault.operatorSetInfo();
+ assertEq(avs, OPERATOR_SET_AVS, "stored AVS mismatch");
+ assertEq(operatorSetId, OPERATOR_SET_ID, "stored operatorSetId mismatch");
+ assertEq(address(durationVault.delegationManager()), address(delegationManagerMock), "delegation manager mismatch");
+ assertEq(address(durationVault.allocationManager()), address(allocationManagerMock), "allocation manager mismatch");
+ assertEq(address(durationVault.rewardsCoordinator()), address(rewardsCoordinatorMock), "rewards coordinator mismatch");
+ assertTrue(durationVault.operatorSetRegistered(), "operator set should be registered");
+
+ // Verify operator AVS rewards split is set to 0 (100% to stakers).
+ RewardsCoordinatorMock.SetOperatorAVSSplitCall memory avsSplitCall = rewardsCoordinatorMock.lastSetOperatorAVSSplitCall();
+ assertEq(avsSplitCall.operator, address(durationVault), "avs split operator mismatch");
+ assertEq(avsSplitCall.avs, OPERATOR_SET_AVS, "avs split AVS mismatch");
+ assertEq(avsSplitCall.split, 0, "operator AVS split should be 0 for 100% to stakers");
+
+ // Verify rewards split is set to 0 (100% to stakers).
+ RewardsCoordinatorMock.SetOperatorSetSplitCall memory splitCall = rewardsCoordinatorMock.lastSetOperatorSetSplitCall();
+ assertEq(splitCall.operator, address(durationVault), "split operator mismatch");
+ assertEq(splitCall.operatorSet.avs, OPERATOR_SET_AVS, "split AVS mismatch");
+ assertEq(splitCall.operatorSet.id, OPERATOR_SET_ID, "split operatorSetId mismatch");
+ assertEq(splitCall.split, 0, "operator split should be 0 for 100% to stakers");
+ }
+
+ function testLockAllocatesFullMagnitude() public {
+ assertEq(allocationManagerMock.modifyAllocationsCallCount(), 0, "precondition failed");
+
+ durationVault.lock();
+
+ assertTrue(durationVault.allocationsActive(), "allocations should be active after lock");
+ assertEq(allocationManagerMock.modifyAllocationsCallCount(), 1, "modifyAllocations not called");
+
+ AllocationManagerMock.AllocateCall memory allocateCall = allocationManagerMock.lastModifyAllocationsCall();
+ assertEq(allocateCall.operator, address(durationVault), "allocate operator mismatch");
+ assertEq(allocateCall.avs, OPERATOR_SET_AVS, "allocate AVS mismatch");
+ assertEq(allocateCall.operatorSetId, OPERATOR_SET_ID, "allocate operatorSetId mismatch");
+ assertEq(address(allocateCall.strategy), address(durationVault), "allocate strategy mismatch");
+ assertEq(allocateCall.magnitude, FULL_ALLOCATION, "allocate magnitude mismatch");
+ }
+
+ function testMarkMaturedDeallocatesAndDeregisters() public {
+ durationVault.lock();
+ cheats.warp(block.timestamp + defaultDuration + 1);
+
+ durationVault.markMatured();
+
+ assertEq(allocationManagerMock.modifyAllocationsCallCount(), 2, "deallocation not invoked");
+ AllocationManagerMock.AllocateCall memory allocateCall = allocationManagerMock.lastModifyAllocationsCall();
+ assertEq(allocateCall.magnitude, 0, "expected zero magnitude");
+
+ AllocationManagerMock.DeregisterCall memory deregisterCall = allocationManagerMock.lastDeregisterFromOperatorSetsCall();
+ assertEq(deregisterCall.operator, address(durationVault), "deregister operator mismatch");
+ assertEq(deregisterCall.avs, OPERATOR_SET_AVS, "deregister AVS mismatch");
+ assertEq(deregisterCall.operatorSetIds.length, 1, "unexpected deregister length");
+ assertEq(deregisterCall.operatorSetIds[0], OPERATOR_SET_ID, "deregister operatorSetId mismatch");
+
+ assertFalse(durationVault.allocationsActive(), "allocations should be inactive");
+ assertFalse(durationVault.operatorSetRegistered(), "operator set should be deregistered");
+ }
+
+ function testMarkMaturedBestEffortWhenAllocationManagerReverts() public {
+ durationVault.lock();
+ cheats.warp(block.timestamp + defaultDuration + 1);
+
+ allocationManagerMock.setRevertModifyAllocations(true);
+ allocationManagerMock.setRevertDeregisterFromOperatorSets(true);
+
+ // Should not revert even if AllocationManager refuses deallocation/deregistration.
+ durationVault.markMatured();
+
+ assertTrue(durationVault.withdrawalsOpen(), "withdrawals must open after maturity");
+ assertFalse(durationVault.allocationsActive(), "allocations should be inactive after maturity");
+ assertTrue(durationVault.operatorSetRegistered(), "operator set should remain registered on failure");
+
+ // Since the mock reverts before incrementing, only the initial lock allocation is recorded.
+ assertEq(allocationManagerMock.modifyAllocationsCallCount(), 1, "unexpected modifyAllocations count");
+ assertEq(allocationManagerMock.deregisterFromOperatorSetsCallCount(), 0, "unexpected deregister count");
+ }
+
+ function testMarkMaturedCanRetryOperatorCleanup() public {
+ durationVault.lock();
+ cheats.warp(block.timestamp + defaultDuration + 1);
+
+ allocationManagerMock.setRevertModifyAllocations(true);
+ allocationManagerMock.setRevertDeregisterFromOperatorSets(true);
+
+ durationVault.markMatured();
+ assertTrue(durationVault.operatorSetRegistered(), "operator set should remain registered after failure");
+
+ allocationManagerMock.setRevertModifyAllocations(false);
+ allocationManagerMock.setRevertDeregisterFromOperatorSets(false);
+
+ // markMatured is a permissionless retry path once in WITHDRAWALS.
+ durationVault.markMatured();
+
+ assertEq(allocationManagerMock.modifyAllocationsCallCount(), 2, "deallocation should be retried");
+ assertEq(allocationManagerMock.deregisterFromOperatorSetsCallCount(), 1, "deregistration should be retried");
+ assertFalse(durationVault.operatorSetRegistered(), "operator set should be deregistered after retry");
+ }
+
+ function testUpdateDelegationApprover() public {
+ address newApprover = address(0xDE1E6A7E);
+ durationVault.updateDelegationApprover(newApprover);
+
+ DelegationManagerMock.ModifyOperatorDetailsCall memory callDetails = delegationManagerMock.lastModifyOperatorDetailsCall();
+ assertEq(callDetails.operator, address(durationVault), "operator mismatch");
+ assertEq(callDetails.newDelegationApprover, newApprover, "delegation approver mismatch");
+ }
+
+ function testUpdateOperatorMetadataURI() public {
+ string memory newURI = "ipfs://updated-operator-metadata";
+ durationVault.updateOperatorMetadataURI(newURI);
+
+ DelegationManagerMock.UpdateOperatorMetadataURICall memory callDetails = delegationManagerMock.lastUpdateOperatorMetadataURICall();
+ assertEq(callDetails.operator, address(durationVault), "operator mismatch");
+ assertEq(callDetails.metadataURI, newURI, "metadata URI mismatch");
+ }
+
+ function testSetRewardsClaimer() public {
+ address claimer = address(0xC1A1A3);
+ durationVault.setRewardsClaimer(claimer);
+
+ RewardsCoordinatorMock.SetClaimerForCall memory callDetails = rewardsCoordinatorMock.lastSetClaimerForCall();
+ assertEq(callDetails.earner, address(durationVault), "earner mismatch");
+ assertEq(callDetails.claimer, claimer, "claimer mismatch");
+ }
+
+ function testAdvanceToWithdrawals_onlyArbitrator_and_onlyBeforeUnlock() public {
+ // Cannot advance before lock (even as arbitrator).
+ cheats.expectRevert(IDurationVaultStrategyErrors.VaultNotLocked.selector);
+ durationVault.advanceToWithdrawals();
+
+ durationVault.lock();
+
+ // Non-arbitrator cannot advance.
+ cheats.prank(address(0xBEEF));
+ cheats.expectRevert(IDurationVaultStrategyErrors.OnlyArbitrator.selector);
+ durationVault.advanceToWithdrawals();
+
+ // After unlockAt, arbitrator advance is not allowed.
+ cheats.warp(block.timestamp + defaultDuration + 1);
+ cheats.expectRevert(IDurationVaultStrategyErrors.DurationAlreadyElapsed.selector);
+ durationVault.advanceToWithdrawals();
+
+ // markMatured works once duration has elapsed.
+ durationVault.markMatured();
+ assertTrue(durationVault.withdrawalsOpen(), "withdrawals should open after maturity");
+ }
+
+ // ===================== VAULT STATE TESTS =====================
+
+ function testDepositsBlockedAfterLock() public {
+ durationVault.lock();
+
+ uint depositAmount = 1e18;
+
+ underlyingToken.transfer(address(durationVault), depositAmount);
+ // The deposit() call succeeds (only validates token), but beforeAddShares() reverts
+ cheats.startPrank(address(strategyManager));
+ uint shares = durationVault.deposit(underlyingToken, depositAmount);
+ cheats.expectRevert(IDurationVaultStrategyErrors.DepositsLocked.selector);
+ durationVault.beforeAddShares(address(this), shares);
+ cheats.stopPrank();
+ }
+
+ function testWithdrawalQueueingBlockedDuringAllocations() public {
+ // prepare deposit
+ uint depositAmount = 10 ether;
+ underlyingToken.transfer(address(durationVault), depositAmount);
+ cheats.prank(address(strategyManager));
+ durationVault.deposit(underlyingToken, depositAmount);
+
+ durationVault.lock();
+
+ assertTrue(durationVault.isLocked(), "vault should be locked");
+ assertFalse(durationVault.withdrawalsOpen(), "withdrawals should be closed before maturity");
+
+ uint shares = durationVault.totalShares();
+
+ // Attempt to queue withdrawal (beforeRemoveShares) during ALLOCATIONS - should revert
+ cheats.startPrank(address(strategyManager));
+ cheats.expectRevert(IDurationVaultStrategyErrors.WithdrawalsLockedDuringAllocations.selector);
+ durationVault.beforeRemoveShares(address(this), shares);
+ cheats.stopPrank();
+
+ // After maturity, queuing should be allowed
+ cheats.warp(block.timestamp + defaultDuration + 1);
+ durationVault.markMatured();
+ assertTrue(durationVault.withdrawalsOpen(), "withdrawals should open after maturity");
+
+ // Queuing now works
+ cheats.prank(address(strategyManager));
+ durationVault.beforeRemoveShares(address(this), shares);
+
+ // And completion works
+ cheats.prank(address(strategyManager));
+ durationVault.withdraw(address(this), underlyingToken, shares);
+ }
+
+ // ===================== TVL LIMITS TESTS =====================
+
+ function testSetTVLLimits(uint newMaxPerDeposit, uint newMaxTotalDeposits) public {
+ cheats.assume(newMaxPerDeposit <= newMaxTotalDeposits);
+ durationVault.updateTVLLimits(newMaxPerDeposit, newMaxTotalDeposits);
+ (uint _maxPerDeposit, uint _maxDeposits) = durationVault.getTVLLimits();
+
+ assertEq(_maxPerDeposit, newMaxPerDeposit);
+ assertEq(_maxDeposits, newMaxTotalDeposits);
+ }
+
+ function testSetInvalidMaxPerDepositAndMaxDeposits(uint newMaxPerDeposit, uint newMaxTotalDeposits) public {
+ cheats.assume(newMaxTotalDeposits < newMaxPerDeposit);
+ cheats.expectRevert(IStrategyErrors.MaxPerDepositExceedsMax.selector);
+ durationVault.updateTVLLimits(newMaxPerDeposit, newMaxTotalDeposits);
+ }
+
+ function testDepositMoreThanMaxPerDeposit() public {
+ uint newMaxPerDeposit = 1e18;
+ uint newMaxTotalDeposits = 10e18;
+ durationVault.updateTVLLimits(newMaxPerDeposit, newMaxTotalDeposits);
+
+ // Set up delegation to vault
+ address staker = address(0xBEEF);
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory emptySig;
+ cheats.prank(staker);
+ delegationManagerMock.delegateTo(address(durationVault), emptySig, bytes32(0));
+
+ uint depositAmount = newMaxPerDeposit + 1;
+ underlyingToken.transfer(address(durationVault), depositAmount);
+
+ cheats.startPrank(address(strategyManager));
+ uint shares = durationVault.deposit(underlyingToken, depositAmount);
+ cheats.expectRevert(IDurationVaultStrategyErrors.DepositExceedsMaxPerDeposit.selector);
+ durationVault.beforeAddShares(staker, shares);
+ cheats.stopPrank();
+ }
+
+ function testDepositMoreThanMaxTotalDeposits() public {
+ uint newMaxPerDeposit = 3e11;
+ uint newMaxTotalDeposits = 1e12;
+ uint numDeposits = newMaxTotalDeposits / newMaxPerDeposit;
+
+ durationVault.updateTVLLimits(newMaxPerDeposit, newMaxTotalDeposits);
+
+ // Set up delegation to vault
+ address staker = address(0xBEEF);
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory emptySig;
+ cheats.prank(staker);
+ delegationManagerMock.delegateTo(address(durationVault), emptySig, bytes32(0));
+
+ uint cumulativeShares = 0;
+ for (uint i = 0; i < numDeposits; i++) {
+ underlyingToken.transfer(address(durationVault), newMaxPerDeposit);
+ cheats.startPrank(address(strategyManager));
+ uint shares = durationVault.deposit(underlyingToken, newMaxPerDeposit);
+ // beforeAddShares checks operatorShares + new shares, so we update after each
+ durationVault.beforeAddShares(staker, shares);
+ cheats.stopPrank();
+ cumulativeShares += shares;
+ delegationManagerMock.setOperatorShares(address(durationVault), IStrategy(address(durationVault)), cumulativeShares);
+ }
+
+ // Next deposit exceeds the cap
+ underlyingToken.transfer(address(durationVault), newMaxPerDeposit);
+ cheats.startPrank(address(strategyManager));
+ uint shares = durationVault.deposit(underlyingToken, newMaxPerDeposit);
+ cheats.expectRevert(IStrategyErrors.BalanceExceedsMaxTotalDeposits.selector);
+ durationVault.beforeAddShares(staker, shares);
+ cheats.stopPrank();
+ }
+
+ function testTVLLimitsCannotBeChangedAfterLock() public {
+ durationVault.lock();
+ cheats.expectRevert(IDurationVaultStrategyErrors.DepositsLocked.selector);
+ durationVault.updateTVLLimits(1e18, 10e18);
+ }
+}
diff --git a/src/test/unit/ECDSACertificateVerifierUnit.t.sol b/src/test/unit/ECDSACertificateVerifierUnit.t.sol
index 9b238f602b..32a24337d9 100644
--- a/src/test/unit/ECDSACertificateVerifierUnit.t.sol
+++ b/src/test/unit/ECDSACertificateVerifierUnit.t.sol
@@ -481,7 +481,7 @@ contract ECDSACertificateVerifierUnitTests_verifyCertificate is ECDSACertificate
// Verification should fail - expect SignersNotOrdered because signature recovery
// with wrong message hash produces different addresses that break ordering
- vm.expectRevert(IECDSACertificateVerifierErrors.SignersNotOrdered.selector);
+ cheats.expectRevert(); // SignersNotOrdered or VerificationFailed
verifier.verifyCertificate(defaultOperatorSet, cert);
}
diff --git a/src/test/unit/EmissionsControllerUnit.t.sol b/src/test/unit/EmissionsControllerUnit.t.sol
new file mode 100644
index 0000000000..d89ba672a6
--- /dev/null
+++ b/src/test/unit/EmissionsControllerUnit.t.sol
@@ -0,0 +1,1215 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "src/contracts/core/EmissionsController.sol";
+import "src/test/utils/EigenLayerUnitTestSetup.sol";
+
+contract EmissionsControllerUnitTests is EigenLayerUnitTestSetup, IEmissionsControllerErrors, IEmissionsControllerEvents {
+ using StdStyle for *;
+ using ArrayLib for *;
+
+ uint EMISSIONS_INFLATION_RATE = 50;
+ // Use a fixed start time that's aligned with CALCULATION_INTERVAL_SECONDS (1 day = 86400)
+ // 7 days from an aligned base ensures proper alignment
+ uint EMISSIONS_START_TIME = 7 days;
+ uint EMISSIONS_EPOCH_LENGTH = 1 weeks;
+ uint REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS = 86_400;
+
+ address owner = address(0x1);
+ address incentiveCouncil = address(0x2);
+ EmissionsController emissionsController;
+
+ function setUp() public virtual override {
+ EigenLayerUnitTestSetup.setUp();
+ emissionsController = EmissionsController(
+ address(
+ new TransparentUpgradeableProxy(
+ address(
+ new EmissionsController(
+ IEigen(address(eigenMock)),
+ IBackingEigen(address(backingEigenMock)),
+ IAllocationManager(address(allocationManagerMock)),
+ IRewardsCoordinator(address(rewardsCoordinatorMock)),
+ IPauserRegistry(address(pauserRegistry)),
+ EMISSIONS_INFLATION_RATE,
+ EMISSIONS_START_TIME,
+ EMISSIONS_EPOCH_LENGTH,
+ REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS
+ )
+ ),
+ address(eigenLayerProxyAdmin),
+ abi.encodeWithSelector(EmissionsController.initialize.selector, owner, incentiveCouncil, 0)
+ )
+ )
+ );
+ }
+
+ function emptyOperatorSet() public pure returns (OperatorSet memory) {
+ return OperatorSet({avs: address(0), id: 0});
+ }
+
+ function emptyStrategiesAndMultipliers() public pure returns (IRewardsCoordinatorTypes.StrategyAndMultiplier[][] memory) {
+ return new IRewardsCoordinatorTypes.StrategyAndMultiplier[][](0);
+ }
+
+ function defaultStrategiesAndMultipliers() public pure returns (IRewardsCoordinatorTypes.StrategyAndMultiplier[][] memory) {
+ IRewardsCoordinatorTypes.StrategyAndMultiplier[][] memory submissions = new IRewardsCoordinatorTypes.StrategyAndMultiplier[][](1);
+ submissions[0] = new IRewardsCoordinatorTypes.StrategyAndMultiplier[](0);
+ return submissions;
+ }
+
+ function _getTotalDistributionsProcessed() public returns (uint) {
+ Vm.Log[] memory logs = cheats.getRecordedLogs();
+ uint processed = 0;
+ for (uint i = 0; i < logs.length; i++) {
+ if (logs[i].topics.length > 0 && logs[i].topics[0] == IEmissionsControllerEvents.DistributionProcessed.selector) {
+ ++processed;
+ }
+ }
+ return processed;
+ }
+
+ function _pressButton(uint epoch, uint length, uint expectedProcessed, bool expectedPressable) public {
+ cheats.warp(EMISSIONS_START_TIME + epoch * EMISSIONS_EPOCH_LENGTH);
+ assertEq(emissionsController.getCurrentEpoch(), epoch);
+ cheats.recordLogs();
+ emissionsController.pressButton(length);
+ assertEq(_getTotalDistributionsProcessed(), expectedProcessed, "processed != expectedProcessed");
+ assertEq(emissionsController.isButtonPressable(), expectedPressable, "isButtonPressable != expectedPressable");
+ }
+
+ function _addDefaultDistribution(uint64 startEpoch, uint64 totalEpochs, uint64 weight) public {
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: weight,
+ startEpoch: startEpoch,
+ totalEpochs: totalEpochs,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ }
+}
+
+/// -----------------------------------------------------------------------
+/// Initialization
+/// -----------------------------------------------------------------------
+
+contract EmissionsControllerUnitTests_Initialization_Setters is EmissionsControllerUnitTests {
+ function test_constructor_setters() public {
+ assertEq(address(emissionsController.EIGEN()), address(eigenMock));
+ assertEq(address(emissionsController.BACKING_EIGEN()), address(backingEigenMock));
+ assertEq(address(emissionsController.ALLOCATION_MANAGER()), address(allocationManagerMock));
+ assertEq(address(emissionsController.REWARDS_COORDINATOR()), address(rewardsCoordinatorMock));
+ assertEq(address(emissionsController.pauserRegistry()), address(pauserRegistry));
+ assertEq(emissionsController.EMISSIONS_INFLATION_RATE(), EMISSIONS_INFLATION_RATE);
+ assertEq(emissionsController.EMISSIONS_START_TIME(), EMISSIONS_START_TIME);
+ assertEq(emissionsController.EMISSIONS_EPOCH_LENGTH(), EMISSIONS_EPOCH_LENGTH);
+ }
+
+ function test_initialize_setters() public {
+ assertEq(emissionsController.owner(), owner);
+ assertEq(emissionsController.incentiveCouncil(), incentiveCouncil);
+ assertEq(emissionsController.paused(), 0);
+ }
+
+ function test_revert_initialize_AlreadyInitialized() public {
+ cheats.expectRevert("Initializable: contract is already initialized");
+ emissionsController.initialize(owner, incentiveCouncil, 0);
+ }
+}
+
+/// -----------------------------------------------------------------------
+/// Permissionless Trigger
+/// -----------------------------------------------------------------------
+
+contract EmissionsControllerUnitTests_pressButton is EmissionsControllerUnitTests {
+ /// -----------------------------------------------------------------------
+ /// Revert Tests
+ /// -----------------------------------------------------------------------
+ /// @notice Assert the function reverts when paused.
+ function test_revert_pressButton_WhenPaused() public {
+ _addDefaultDistribution({startEpoch: 0, totalEpochs: 1, weight: 10_000});
+ cheats.prank(pauser);
+ emissionsController.pauseAll();
+ cheats.warp(EMISSIONS_START_TIME);
+ cheats.expectRevert(IPausable.CurrentlyPaused.selector);
+ emissionsController.pressButton(1);
+ }
+
+ /// @notice Assert the function reverts when emissions have not started yet.
+ function test_revert_pressButton_EmissionsNotStarted() public {
+ _addDefaultDistribution({startEpoch: 0, totalEpochs: 1, weight: 10_000});
+ cheats.expectRevert(IEmissionsControllerErrors.EmissionsNotStarted.selector);
+ emissionsController.pressButton(1);
+ }
+
+ /// @notice Assert the function reverts when no distributions are left to be processed (none to start with).
+ function test_revert_pressButton_AllDistributionsProcessed_NoDistributions() public {
+ cheats.warp(EMISSIONS_START_TIME);
+ cheats.expectRevert(IEmissionsControllerErrors.AllDistributionsProcessed.selector);
+ emissionsController.pressButton(0);
+ }
+
+ /// @notice Assert the function reverts when no distributions are left to be processed (some to start with).
+ function test_revert_pressButton_AllDistributionsProcessed() public {
+ _addDefaultDistribution({startEpoch: 0, totalEpochs: 1, weight: 10_000});
+ cheats.warp(EMISSIONS_START_TIME);
+ emissionsController.pressButton(1);
+ cheats.expectRevert(IEmissionsControllerErrors.AllDistributionsProcessed.selector);
+ emissionsController.pressButton(1);
+ }
+
+ /// -----------------------------------------------------------------------
+ /// Timing Fuzz Tests
+ /// -----------------------------------------------------------------------
+
+ /// @notice Assert the function processes a single epoch distribution correctly.
+ function testFuzz_pressButton_SingleEpochDistribution(uint64 startEpoch) public {
+ startEpoch = uint64(bound(startEpoch, 0, type(uint8).max));
+ _addDefaultDistribution({startEpoch: startEpoch, totalEpochs: 1, weight: 10_000});
+ _pressButton({epoch: startEpoch, length: 1, expectedProcessed: 1, expectedPressable: false});
+ _pressButton({epoch: startEpoch + 1, length: 1, expectedProcessed: 0, expectedPressable: false});
+ }
+
+ /// @notice Assert the function processes a multiple epoch distribution correctly.
+ function testFuzz_pressButton_MultipleEpochDistribution(uint64 startEpoch, uint64 totalEpochs) public {
+ startEpoch = uint64(bound(startEpoch, 0, type(uint8).max));
+ totalEpochs = uint64(bound(totalEpochs, 2, type(uint8).max));
+ _addDefaultDistribution({startEpoch: startEpoch, totalEpochs: totalEpochs, weight: 10_000});
+ for (uint i = 0; i < totalEpochs; i++) {
+ _pressButton({epoch: startEpoch + i, length: 1, expectedProcessed: 1, expectedPressable: false});
+ }
+ _pressButton({epoch: startEpoch + totalEpochs, length: 1, expectedProcessed: 0, expectedPressable: false});
+ }
+
+ /// @notice Assert the function processes an infinite distribution correctly.
+ function testFuzz_pressButton_InfiniteDistribution(uint64 startEpoch) public {
+ startEpoch = uint64(bound(startEpoch, 0, type(uint8).max));
+ _addDefaultDistribution({startEpoch: startEpoch, totalEpochs: 0, weight: 10_000});
+ for (uint64 epoch = 0; epoch < 100; ++epoch) {
+ _pressButton({epoch: startEpoch + epoch, length: 1, expectedProcessed: 1, expectedPressable: false});
+ }
+ }
+
+ /// -----------------------------------------------------------------------
+ /// Minting Behavior Tests
+ /// -----------------------------------------------------------------------
+
+ /// @notice Assert the function mints only once per epoch.
+ function test_pressButton_MintsOnlyOncePerEpoch() public {
+ _addDefaultDistribution({startEpoch: 0, totalEpochs: 1, weight: 5000});
+ _addDefaultDistribution({startEpoch: 0, totalEpochs: 1, weight: 5000});
+
+ uint balanceBefore = eigenMock.balanceOf(address(emissionsController));
+ _pressButton({epoch: 0, length: 1, expectedProcessed: 1, expectedPressable: true});
+ uint balanceAfter = eigenMock.balanceOf(address(emissionsController));
+ assertEq(balanceAfter, balanceBefore + EMISSIONS_INFLATION_RATE);
+
+ balanceBefore = eigenMock.balanceOf(address(emissionsController));
+ _pressButton({epoch: 0, length: 1, expectedProcessed: 1, expectedPressable: false});
+ balanceAfter = eigenMock.balanceOf(address(emissionsController));
+ assertEq(balanceAfter, balanceBefore);
+ }
+
+ /// -----------------------------------------------------------------------
+ /// Distribution Skipping Tests
+ /// -----------------------------------------------------------------------
+
+ function testFuzz_pressButton_SkipsDisabledDistributions(uint64 startEpoch) public {} // TODO: implement
+
+ /// @notice Assert the function skips distributions that have not started yet.
+ function testFuzz_pressButton_SkipsNotYetStartedDistributions(uint64 startEpoch) public {
+ startEpoch = uint64(bound(startEpoch, 1, type(uint8).max));
+ _addDefaultDistribution({startEpoch: startEpoch, totalEpochs: 1, weight: 10_000});
+ for (uint64 epoch = 0; epoch < startEpoch; ++epoch) {
+ _pressButton({epoch: epoch, length: 1, expectedProcessed: 0, expectedPressable: false});
+ }
+ _pressButton({epoch: startEpoch, length: 1, expectedProcessed: 1, expectedPressable: false});
+ }
+
+ /// @notice Assert the function skips distributions that have ended.
+ function testFuzz_pressButton_SkipsEndedDistributions(uint64 startEpoch, uint64 totalEpochs) public {
+ startEpoch = uint64(bound(startEpoch, 1, type(uint8).max));
+ _addDefaultDistribution({startEpoch: startEpoch, totalEpochs: 1, weight: 10_000});
+ for (uint i = 1; i < 5; ++i) {
+ _pressButton({epoch: startEpoch + i, length: 1, expectedProcessed: 0, expectedPressable: false});
+ }
+ }
+
+ /// @notice Assert the function skips distributions with zero weight.
+ function testFuzz_pressButton_SkipsZeroWeightDistribution(uint64 startEpoch) public {
+ startEpoch = uint64(bound(startEpoch, 1, type(uint8).max));
+ _addDefaultDistribution({startEpoch: startEpoch, totalEpochs: 1, weight: 0});
+ _pressButton({epoch: startEpoch, length: 1, expectedProcessed: 0, expectedPressable: false});
+ }
+
+ /// -----------------------------------------------------------------------
+ /// Length Edge Cases
+ /// -----------------------------------------------------------------------
+
+ function test_pressButton_LengthZeroProcessesNone() public {
+ _addDefaultDistribution({startEpoch: 0, totalEpochs: 1, weight: 10_000});
+ _pressButton({epoch: 0, length: 0, expectedProcessed: 0, expectedPressable: true});
+ }
+}
+
+contract EmissionsControllerUnitTests_sweep is EmissionsControllerUnitTests {
+ /// @notice Assert the function reverts when paused.
+ function test_revert_sweep_WhenPaused() public {
+ cheats.warp(EMISSIONS_START_TIME);
+ cheats.prank(pauser);
+ emissionsController.pause(1);
+ cheats.expectRevert(IPausable.CurrentlyPaused.selector);
+ emissionsController.sweep();
+ }
+
+ /// @notice Assert the function transfers tokens to the incentive council.
+ function test_sweep_TransfersTokensToIncentiveCouncil() public {
+ _addDefaultDistribution({startEpoch: 0, totalEpochs: 1, weight: 10_000});
+ cheats.warp(EMISSIONS_START_TIME);
+ emissionsController.pressButton(1);
+
+ uint sweepAmount = 100 ether;
+ deal(address(eigenMock), address(emissionsController), sweepAmount);
+ assertEq(eigenMock.balanceOf(address(emissionsController)), sweepAmount);
+
+ uint councilBalanceBefore = eigenMock.balanceOf(incentiveCouncil);
+
+ cheats.expectEmit(true, true, true, true);
+ emit Swept(incentiveCouncil, sweepAmount);
+ emissionsController.sweep();
+
+ assertEq(eigenMock.balanceOf(address(emissionsController)), 0);
+ assertEq(eigenMock.balanceOf(incentiveCouncil), councilBalanceBefore + sweepAmount);
+ }
+
+ function test_sweep_DoesNothingWhenButtonPressable() public {
+ // Add distribution
+ _addDefaultDistribution({startEpoch: 0, totalEpochs: 1, weight: 10_000});
+
+ // Warp to epoch 0 - button is pressable
+ cheats.warp(EMISSIONS_START_TIME);
+
+ // Give some EIGEN tokens directly to the controller
+ uint sweepAmount = 100 ether;
+ deal(address(eigenMock), address(emissionsController), sweepAmount);
+
+ // Sweep should do nothing when button is pressable
+ emissionsController.sweep();
+
+ // Tokens should still be in the controller
+ assertEq(eigenMock.balanceOf(address(emissionsController)), sweepAmount);
+ }
+
+ function test_sweep_DoesNothingWhenBalanceZeroAfterButtonNotPressable() public {
+ // Don't add any distributions - button won't be pressable after start
+
+ // Warp to epoch 0
+ cheats.warp(EMISSIONS_START_TIME);
+
+ // Can't press button with no distributions
+ assertFalse(emissionsController.isButtonPressable());
+
+ // Balance is 0, sweep should do nothing (no transfer, no event)
+ uint councilBalanceBefore = eigenMock.balanceOf(incentiveCouncil);
+ assertEq(eigenMock.balanceOf(address(emissionsController)), 0);
+ emissionsController.sweep();
+ assertEq(eigenMock.balanceOf(address(emissionsController)), 0);
+ assertEq(eigenMock.balanceOf(incentiveCouncil), councilBalanceBefore);
+ }
+}
+
+/// -----------------------------------------------------------------------
+/// Owner Functions
+/// -----------------------------------------------------------------------
+
+contract EmissionsControllerUnitTests_setIncentiveCouncil is EmissionsControllerUnitTests {
+ function test_revert_setIncentiveCouncil_ZeroAddress() public {
+ cheats.prank(owner);
+ cheats.expectRevert(IPausable.InputAddressZero.selector);
+ emissionsController.setIncentiveCouncil(address(0));
+ }
+
+ function test_revert_setIncentiveCouncil_OnlyOwner(address notOwner) public {
+ cheats.assume(notOwner != owner);
+ cheats.assume(notOwner != address(eigenLayerProxyAdmin));
+ cheats.prank(notOwner);
+ cheats.expectRevert("Ownable: caller is not the owner");
+ emissionsController.setIncentiveCouncil(incentiveCouncil);
+ }
+
+ function testFuzz_setIncentiveCouncil_Correctness(address newIncentiveCouncil) public {
+ cheats.expectEmit(true, true, true, true);
+ emit IncentiveCouncilUpdated(newIncentiveCouncil);
+ cheats.prank(owner);
+ emissionsController.setIncentiveCouncil(newIncentiveCouncil);
+ assertEq(emissionsController.incentiveCouncil(), newIncentiveCouncil);
+ }
+}
+
+/// -----------------------------------------------------------------------
+/// Incentive Council Functions
+/// -----------------------------------------------------------------------
+
+contract EmissionsControllerUnitTests_addDistribution is EmissionsControllerUnitTests {
+ function test_revert_addDistribution_OnlyIncentiveCouncil() public {
+ address notIncentiveCouncil = address(0x3);
+ cheats.expectRevert(IEmissionsControllerErrors.CallerIsNotIncentiveCouncil.selector);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 10_000,
+ startEpoch: 0,
+ totalEpochs: 0,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ }
+
+ function test_revert_addDistribution_DisabledDistribution() public {
+ cheats.prank(incentiveCouncil);
+ cheats.expectRevert(IEmissionsControllerErrors.CannotAddDisabledDistribution.selector);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 10_000,
+ startEpoch: 0,
+ totalEpochs: 0,
+ distributionType: DistributionType.Disabled,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ }
+
+ function test_revert_addDistribution_RewardsSubmissionsCannotBeEmpty() public {
+ cheats.prank(incentiveCouncil);
+ cheats.expectRevert(IEmissionsControllerErrors.RewardsSubmissionsCannotBeEmpty.selector);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 10_000,
+ startEpoch: 0,
+ totalEpochs: 0,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: emptyStrategiesAndMultipliers()
+ })
+ );
+ }
+
+ function test_revert_addDistribution_StartEpochMustBeInTheFuture() public {
+ cheats.warp(EMISSIONS_START_TIME);
+ cheats.prank(incentiveCouncil);
+ cheats.expectRevert(IEmissionsControllerErrors.StartEpochMustBeInTheFuture.selector);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 10_000,
+ startEpoch: 0,
+ totalEpochs: 0,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ }
+
+ function testFuzz_revert_addDistribution_TotalWeightExceedsMax(uint weight) public {
+ weight = bound(weight, 10_001, type(uint64).max);
+ cheats.prank(incentiveCouncil);
+ cheats.expectRevert(IEmissionsControllerErrors.TotalWeightExceedsMax.selector);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: uint64(weight),
+ startEpoch: 0,
+ totalEpochs: 0,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ }
+
+ function test_revert_addDistribution_TotalWeightExceedsMax_MultipleDistributions() public {
+ // Add first distribution with weight 6000
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 6000,
+ startEpoch: 0,
+ totalEpochs: 0,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Attempt to add second distribution with weight 5000, total would be 11000 > 10000
+ cheats.prank(incentiveCouncil);
+ cheats.expectRevert(IEmissionsControllerErrors.TotalWeightExceedsMax.selector);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 5000,
+ startEpoch: 0,
+ totalEpochs: 0,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ }
+
+ function testFuzz_addDistribution_Correctness(uint weight, uint8 distributionTypeUint8) public {
+ weight = bound(weight, 0, 10_000);
+ DistributionType distributionType = DistributionType(
+ bound(uint8(distributionTypeUint8), uint8(DistributionType.RewardsForAllEarners), uint8(type(DistributionType).max))
+ );
+
+ uint nextDistributionId = emissionsController.getTotalProcessableDistributions();
+
+ // Use defaultStrategiesAndMultipliers for non-Manual types, empty for Manual
+ IRewardsCoordinatorTypes.StrategyAndMultiplier[][] memory strategiesAndMultipliers =
+ distributionType == DistributionType.Manual ? emptyStrategiesAndMultipliers() : defaultStrategiesAndMultipliers();
+
+ Distribution memory addedDistribution = Distribution({
+ weight: uint64(weight),
+ startEpoch: 0,
+ totalEpochs: 0,
+ distributionType: distributionType,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: strategiesAndMultipliers
+ });
+
+ allocationManagerMock.setIsOperatorSet(addedDistribution.operatorSet, true);
+
+ cheats.expectEmit(true, true, true, true);
+ emit DistributionAdded(nextDistributionId, type(uint).max, addedDistribution);
+ cheats.prank(incentiveCouncil);
+ uint distributionId = emissionsController.addDistribution(addedDistribution);
+
+ Distribution memory distribution = emissionsController.getDistribution(distributionId);
+ assertEq(distributionId, nextDistributionId);
+ assertEq(emissionsController.getTotalProcessableDistributions(), 1);
+ assertEq(distribution.weight, weight);
+ assertEq(uint8(distribution.distributionType), uint8(distributionType));
+ }
+
+ function test_revert_addDistribution_AllDistributionsMustBeProcessed() public {
+ // Add first distribution before emissions start
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 5000,
+ startEpoch: 0,
+ totalEpochs: 1,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Warp to after emissions start (epoch 0)
+ cheats.warp(EMISSIONS_START_TIME);
+
+ // Now there's 1 distribution but 0 processed, button is pressable
+ assertTrue(emissionsController.isButtonPressable());
+
+ // Attempt to add another distribution before processing the first one should revert
+ cheats.prank(incentiveCouncil);
+ cheats.expectRevert(IEmissionsControllerErrors.AllDistributionsMustBeProcessed.selector);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 3000,
+ startEpoch: 1,
+ totalEpochs: 1,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ }
+}
+
+contract EmissionsControllerUnitTests_updateDistribution is EmissionsControllerUnitTests {
+ function test_revert_updateDistribution_OnlyIncentiveCouncil() public {
+ address notIncentiveCouncil = address(0x3);
+ cheats.assume(notIncentiveCouncil != incentiveCouncil);
+ cheats.prank(notIncentiveCouncil);
+ cheats.expectRevert(IEmissionsControllerErrors.CallerIsNotIncentiveCouncil.selector);
+ emissionsController.updateDistribution(
+ 0,
+ Distribution({
+ weight: 10_000,
+ startEpoch: 0,
+ totalEpochs: 0,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ }
+
+ function test_revert_updateDistribution_NonExistentDistribution() public {
+ cheats.prank(incentiveCouncil);
+ cheats.expectRevert(stdError.indexOOBError); // team may want an explicit check for this
+ emissionsController.updateDistribution(
+ 0,
+ Distribution({
+ weight: 10_000,
+ startEpoch: 0,
+ totalEpochs: 0,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ }
+
+ function test_revert_updateDistribution_RewardsSubmissionsCannotBeEmpty() public {
+ cheats.prank(incentiveCouncil);
+ uint distributionId = emissionsController.addDistribution(
+ Distribution({
+ weight: 5000,
+ startEpoch: 0,
+ totalEpochs: 0,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ cheats.prank(incentiveCouncil);
+ cheats.expectRevert(IEmissionsControllerErrors.RewardsSubmissionsCannotBeEmpty.selector);
+ emissionsController.updateDistribution(
+ distributionId,
+ Distribution({
+ weight: 5000,
+ startEpoch: 0,
+ totalEpochs: 0,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: emptyStrategiesAndMultipliers()
+ })
+ );
+ }
+
+ // NOTE: Fuzz test removed - covered by test_revert_updateDistribution_TotalWeightExceedsMax_MultipleDistributions
+
+ function test_revert_updateDistribution_TotalWeightExceedsMax_MultipleDistributions() public {
+ // Add first distribution with weight 6000
+ cheats.prank(incentiveCouncil);
+ uint distributionId1 = emissionsController.addDistribution(
+ Distribution({
+ weight: 6000,
+ startEpoch: 0,
+ totalEpochs: 0,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Add second distribution with weight 3000
+ cheats.prank(incentiveCouncil);
+ uint distributionId2 = emissionsController.addDistribution(
+ Distribution({
+ weight: 3000,
+ startEpoch: 0,
+ totalEpochs: 0,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Attempt to update second distribution to weight 5000, total would be 11000 > 10000
+ cheats.prank(incentiveCouncil);
+ cheats.expectRevert(IEmissionsControllerErrors.TotalWeightExceedsMax.selector);
+ emissionsController.updateDistribution(
+ distributionId2,
+ Distribution({
+ weight: 5000,
+ startEpoch: 0,
+ totalEpochs: 0,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ }
+
+ function test_revert_updateDistribution_AllDistributionsMustBeProcessed() public {
+ // Add first distribution before emissions start
+ cheats.prank(incentiveCouncil);
+ uint distributionId = emissionsController.addDistribution(
+ Distribution({
+ weight: 5000,
+ startEpoch: 0,
+ totalEpochs: 1,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Warp to after emissions start (epoch 0)
+ cheats.warp(EMISSIONS_START_TIME);
+
+ // Now there's 1 distribution but 0 processed, button is pressable
+ assertTrue(emissionsController.isButtonPressable());
+
+ // Attempt to update the distribution before processing it should revert
+ cheats.prank(incentiveCouncil);
+ cheats.expectRevert(IEmissionsControllerErrors.AllDistributionsMustBeProcessed.selector);
+ emissionsController.updateDistribution(
+ distributionId,
+ Distribution({
+ weight: 3000,
+ startEpoch: 1,
+ totalEpochs: 1,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ }
+}
+
+/// -----------------------------------------------------------------------
+/// View Functions
+/// -----------------------------------------------------------------------
+
+contract EmissionsControllerUnitTests_getCurrentEpoch is EmissionsControllerUnitTests {
+ function test_getCurrentEpoch_MaxBeforeStart() public {
+ assertEq(emissionsController.getCurrentEpoch(), type(uint).max);
+ }
+
+ function test_getCurrentEpoch_ZeroAtStart() public {
+ vm.warp(EMISSIONS_START_TIME);
+ assertEq(emissionsController.getCurrentEpoch(), 0);
+ }
+
+ function test_getCurrentEpoch_MonotonicallyIncreasingFromZero() public {
+ vm.warp(EMISSIONS_START_TIME);
+ uint n = 10;
+ for (uint i = 1; i < n; i++) {
+ assertEq(emissionsController.getCurrentEpoch(), i - 1);
+ cheats.warp(block.timestamp + EMISSIONS_EPOCH_LENGTH);
+ assertEq(emissionsController.getCurrentEpoch(), i);
+ }
+ }
+}
+
+contract EmissionsControllerUnitTests_isButtonPressable is EmissionsControllerUnitTests {
+ function test_isButtonPressable_NoDistributions() public {
+ // Before emissions start, no distributions
+ assertFalse(emissionsController.isButtonPressable());
+
+ // After emissions start, still no distributions
+ cheats.warp(EMISSIONS_START_TIME);
+ assertFalse(emissionsController.isButtonPressable());
+ }
+
+ function test_isButtonPressable_WithDistributions() public {
+ // Add a distribution
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 5000,
+ startEpoch: 0,
+ totalEpochs: 1,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Should be pressable after emissions start
+ cheats.warp(EMISSIONS_START_TIME);
+ assertTrue(emissionsController.isButtonPressable());
+ }
+
+ function test_isButtonPressable_AfterProcessing() public {
+ // Add a distribution
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 5000,
+ startEpoch: 0,
+ totalEpochs: 1,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Warp to emissions start
+ cheats.warp(EMISSIONS_START_TIME);
+ assertTrue(emissionsController.isButtonPressable());
+
+ // Process all distributions
+ emissionsController.pressButton(1);
+
+ // Should not be pressable after processing all
+ assertFalse(emissionsController.isButtonPressable());
+ }
+
+ function test_isButtonPressable_BeforeEmissionsStart_WithDistributions() public {
+ // Add a distribution before emissions start
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 5000,
+ startEpoch: 0,
+ totalEpochs: 0, // infinite duration
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Before emissions start, getCurrentEpoch() returns type(uint256).max
+ // This accesses _epochs[type(uint256).max] which is uninitialized
+ // Button should NOT be pressable before emissions start
+ assertEq(emissionsController.getCurrentEpoch(), type(uint).max, "Current epoch should be max before start");
+ assertEq(emissionsController.getTotalProcessableDistributions(), 1, "Should have 1 distribution");
+ assertFalse(emissionsController.isButtonPressable(), "Button should not be pressable before emissions start");
+ }
+}
+
+contract EmissionsControllerUnitTests_nextTimeButtonPressable is EmissionsControllerUnitTests {
+ function test_nextTimeButtonPressable_BeforeStart() public {
+ assertEq(emissionsController.nextTimeButtonPressable(), EMISSIONS_START_TIME);
+ }
+
+ function test_nextTimeButtonPressable_AtStart() public {
+ // At emissions start (epoch 0)
+ cheats.warp(EMISSIONS_START_TIME);
+ assertEq(emissionsController.nextTimeButtonPressable(), EMISSIONS_START_TIME + EMISSIONS_EPOCH_LENGTH);
+ }
+
+ function test_nextTimeButtonPressable_AfterMultipleEpochs() public {
+ // Warp to epoch 5
+ cheats.warp(EMISSIONS_START_TIME + 5 * EMISSIONS_EPOCH_LENGTH);
+ assertEq(emissionsController.getCurrentEpoch(), 5);
+ assertEq(emissionsController.nextTimeButtonPressable(), EMISSIONS_START_TIME + 6 * EMISSIONS_EPOCH_LENGTH);
+ }
+
+ function testFuzz_nextTimeButtonPressable_Correctness(uint numEpochs) public {
+ numEpochs = bound(numEpochs, 0, 1000);
+
+ // Warp to arbitrary epoch
+ cheats.warp(EMISSIONS_START_TIME + numEpochs * EMISSIONS_EPOCH_LENGTH);
+ uint currentEpoch = emissionsController.getCurrentEpoch();
+ assertEq(currentEpoch, numEpochs);
+
+ // Next button press time should be start of next epoch
+ assertEq(emissionsController.nextTimeButtonPressable(), EMISSIONS_START_TIME + (currentEpoch + 1) * EMISSIONS_EPOCH_LENGTH);
+ }
+}
+
+contract EmissionsControllerUnitTests_lastTimeButtonPressable is EmissionsControllerUnitTests {
+ function test_lastTimeButtonPressable_BeforeStart() public {
+ assertEq(emissionsController.lastTimeButtonPressable(), type(uint).max);
+ }
+
+ function test_lastTimeButtonPressable_AtStart() public {
+ // At emissions start (epoch 0)
+ cheats.warp(EMISSIONS_START_TIME);
+ assertEq(emissionsController.lastTimeButtonPressable(), EMISSIONS_START_TIME);
+ }
+
+ function test_lastTimeButtonPressable_AfterMultipleEpochs() public {
+ // Warp to middle of epoch 5
+ cheats.warp(EMISSIONS_START_TIME + 5 * EMISSIONS_EPOCH_LENGTH + EMISSIONS_EPOCH_LENGTH / 2);
+ assertEq(emissionsController.getCurrentEpoch(), 5);
+ // Last time pressable should be start of epoch 5
+ assertEq(emissionsController.lastTimeButtonPressable(), EMISSIONS_START_TIME + 5 * EMISSIONS_EPOCH_LENGTH);
+ }
+
+ function testFuzz_lastTimeButtonPressable_Correctness(uint numEpochs) public {
+ numEpochs = bound(numEpochs, 0, 1000);
+
+ // Warp to arbitrary epoch
+ cheats.warp(EMISSIONS_START_TIME + numEpochs * EMISSIONS_EPOCH_LENGTH);
+ uint currentEpoch = emissionsController.getCurrentEpoch();
+ assertEq(currentEpoch, numEpochs);
+
+ // Last button press time should be start of current epoch
+ assertEq(emissionsController.lastTimeButtonPressable(), EMISSIONS_START_TIME + currentEpoch * EMISSIONS_EPOCH_LENGTH);
+ }
+}
+
+contract EmissionsControllerUnitTests_getTotalProcessableDistributions is EmissionsControllerUnitTests {
+ function test_getTotalProcessableDistributions_InitiallyZero() public {
+ assertEq(emissionsController.getTotalProcessableDistributions(), 0);
+ }
+
+ function test_getTotalProcessableDistributions_AfterAdding() public {
+ // Add first distribution
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 3000,
+ startEpoch: 0,
+ totalEpochs: 1,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ assertEq(emissionsController.getTotalProcessableDistributions(), 1);
+
+ // Add second distribution
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 2000,
+ startEpoch: 0,
+ totalEpochs: 1,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ assertEq(emissionsController.getTotalProcessableDistributions(), 2);
+ }
+
+ function testFuzz_getTotalProcessableDistributions_Correctness(uint8 count) public {
+ count = uint8(bound(count, 0, 50)); // Reasonable upper bound for gas
+
+ for (uint i = 0; i < count; i++) {
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 100,
+ startEpoch: 0,
+ totalEpochs: 1,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ }
+
+ assertEq(emissionsController.getTotalProcessableDistributions(), count);
+ }
+}
+
+contract EmissionsControllerUnitTests_getDistribution is EmissionsControllerUnitTests {
+ function test_revert_getDistribution_NonExistent() public {
+ cheats.expectRevert(stdError.indexOOBError);
+ emissionsController.getDistribution(0);
+ }
+
+ function test_getDistribution_SingleDistribution() public {
+ // Add a distribution
+ cheats.prank(incentiveCouncil);
+ uint distributionId = emissionsController.addDistribution(
+ Distribution({
+ weight: 5000,
+ startEpoch: 0,
+ totalEpochs: 10,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Retrieve and verify
+ Distribution memory retrieved = emissionsController.getDistribution(distributionId);
+ assertEq(retrieved.weight, 5000);
+ assertEq(retrieved.startEpoch, 0);
+ assertEq(retrieved.totalEpochs, 10);
+ assertEq(uint8(retrieved.distributionType), uint8(DistributionType.RewardsForAllEarners));
+ }
+
+ function test_getDistribution_MultipleDistributions() public {
+ allocationManagerMock.setIsOperatorSet(emptyOperatorSet(), true);
+
+ // Add multiple distributions with different parameters
+ cheats.prank(incentiveCouncil);
+ uint distributionId0 = emissionsController.addDistribution(
+ Distribution({
+ weight: 3000,
+ startEpoch: 0,
+ totalEpochs: 5,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ cheats.prank(incentiveCouncil);
+ uint distributionId1 = emissionsController.addDistribution(
+ Distribution({
+ weight: 4000,
+ startEpoch: 1,
+ totalEpochs: 7,
+ distributionType: DistributionType.OperatorSetTotalStake,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Verify first distribution
+ Distribution memory retrieved0 = emissionsController.getDistribution(distributionId0);
+ assertEq(retrieved0.weight, 3000);
+ assertEq(retrieved0.startEpoch, 0);
+ assertEq(retrieved0.totalEpochs, 5);
+ assertEq(uint8(retrieved0.distributionType), uint8(DistributionType.RewardsForAllEarners));
+
+ // Verify second distribution
+ Distribution memory retrieved1 = emissionsController.getDistribution(distributionId1);
+ assertEq(retrieved1.weight, 4000);
+ assertEq(retrieved1.startEpoch, 1);
+ assertEq(retrieved1.totalEpochs, 7);
+ assertEq(uint8(retrieved1.distributionType), uint8(DistributionType.OperatorSetTotalStake));
+ }
+
+ function test_getDistribution_AfterUpdate() public {
+ allocationManagerMock.setIsOperatorSet(emptyOperatorSet(), true);
+
+ // Add a distribution
+ cheats.prank(incentiveCouncil);
+ uint distributionId = emissionsController.addDistribution(
+ Distribution({
+ weight: 3000,
+ startEpoch: 0,
+ totalEpochs: 5,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Update the distribution (new weight 4000 is still within limits)
+ cheats.prank(incentiveCouncil);
+ emissionsController.updateDistribution(
+ distributionId,
+ Distribution({
+ weight: 4000,
+ startEpoch: 2,
+ totalEpochs: 13,
+ distributionType: DistributionType.OperatorSetUniqueStake,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Verify updated values
+ Distribution memory retrieved = emissionsController.getDistribution(distributionId);
+ assertEq(retrieved.weight, 4000);
+ assertEq(retrieved.startEpoch, 2);
+ assertEq(retrieved.totalEpochs, 13);
+ assertEq(uint8(retrieved.distributionType), uint8(DistributionType.OperatorSetUniqueStake));
+ }
+}
+
+contract EmissionsControllerUnitTests_getDistributions is EmissionsControllerUnitTests {
+ /// @notice Test that getDistributions bounds the length parameter to avoid out-of-bounds errors.
+ /// @dev This is a regression test for the length bounding feature added to getDistributions.
+ function test_getDistributions_LengthBounding() public {
+ // Add 2 distributions
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 3000,
+ startEpoch: 0,
+ totalEpochs: 5,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 2000,
+ startEpoch: 0,
+ totalEpochs: 5,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Request length that exceeds available distributions from start=0
+ // Should return 2 distributions instead of reverting
+ Distribution[] memory distributions = emissionsController.getDistributions(0, 5);
+ assertEq(distributions.length, 2, "Returned array should have requested length");
+
+ // Request length that exceeds available distributions from start=1
+ // Should return 1 distribution instead of reverting
+ distributions = emissionsController.getDistributions(1, 5);
+ assertEq(distributions.length, 1, "Returned array should have requested length");
+ }
+
+ function test_getDistributions_All() public {
+ allocationManagerMock.setIsOperatorSet(emptyOperatorSet(), true);
+
+ // Add multiple distributions
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 3000,
+ startEpoch: 0,
+ totalEpochs: 5,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 4000,
+ startEpoch: 1,
+ totalEpochs: 7,
+ distributionType: DistributionType.OperatorSetTotalStake,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 2000,
+ startEpoch: 2,
+ totalEpochs: 8,
+ distributionType: DistributionType.OperatorSetUniqueStake,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Get all distributions
+ Distribution[] memory distributions = emissionsController.getDistributions(0, 3);
+
+ assertEq(distributions.length, 3);
+ assertEq(distributions[0].weight, 3000);
+ assertEq(distributions[1].weight, 4000);
+ assertEq(distributions[2].weight, 2000);
+ }
+
+ function test_getDistributions_Subset() public {
+ // Add multiple distributions (total weight: 100 * 5 = 500, well under 10000 limit)
+ for (uint i = 0; i < 5; i++) {
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: uint64(100 * (i + 1)),
+ startEpoch: 0,
+ totalEpochs: 5,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ }
+
+ // Get subset starting at index 1, length 3
+ Distribution[] memory distributions = emissionsController.getDistributions(1, 3);
+
+ assertEq(distributions.length, 3);
+ assertEq(distributions[0].weight, 200); // Index 1
+ assertEq(distributions[1].weight, 300); // Index 2
+ assertEq(distributions[2].weight, 400); // Index 3
+ }
+
+ function test_getDistributions_EmptyArray() public {
+ // Add some distributions
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 3000,
+ startEpoch: 0,
+ totalEpochs: 5,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Get 0 length
+ Distribution[] memory distributions = emissionsController.getDistributions(0, 0);
+ assertEq(distributions.length, 0);
+ }
+
+ function test_getDistributions_SingleElement() public {
+ allocationManagerMock.setIsOperatorSet(emptyOperatorSet(), true);
+
+ // Add multiple distributions
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 3000,
+ startEpoch: 0,
+ totalEpochs: 5,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: 4000,
+ startEpoch: 1,
+ totalEpochs: 7,
+ distributionType: DistributionType.OperatorSetTotalStake,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+
+ // Get single element at index 1
+ Distribution[] memory distributions = emissionsController.getDistributions(1, 1);
+
+ assertEq(distributions.length, 1);
+ assertEq(distributions[0].weight, 4000);
+ assertEq(uint8(distributions[0].distributionType), uint8(DistributionType.OperatorSetTotalStake));
+ }
+
+ function testFuzz_getDistributions_Correctness(uint8 totalCount, uint8 start, uint8 length) public {
+ // Limit totalCount to 10 to avoid exceeding MAX_TOTAL_WEIGHT (10000)
+ // Each distribution has weight 100 * (i+1), so max weight per distribution is 100 * 10 = 1000
+ // Total max weight = 100 + 200 + ... + 1000 = 5500, well under 10000
+ totalCount = uint8(bound(totalCount, 1, 10));
+ start = uint8(bound(start, 0, totalCount - 1));
+ // Ensure we don't go out of bounds
+ uint8 maxLength = totalCount - start;
+ length = uint8(bound(length, 0, maxLength));
+
+ // Add distributions
+ for (uint i = 0; i < totalCount; i++) {
+ cheats.prank(incentiveCouncil);
+ emissionsController.addDistribution(
+ Distribution({
+ weight: uint64(100 * (i + 1)),
+ startEpoch: 0,
+ totalEpochs: 5,
+ distributionType: DistributionType.RewardsForAllEarners,
+ operatorSet: emptyOperatorSet(),
+ strategiesAndMultipliers: defaultStrategiesAndMultipliers()
+ })
+ );
+ }
+
+ // Get subset
+ Distribution[] memory distributions = emissionsController.getDistributions(start, length);
+
+ assertEq(distributions.length, length);
+
+ // Verify each element
+ for (uint i = 0; i < length; i++) {
+ assertEq(distributions[i].weight, 100 * (start + i + 1));
+ }
+ }
+}
diff --git a/src/test/unit/RewardsCoordinatorUnit.t.sol b/src/test/unit/RewardsCoordinatorUnit.t.sol
index a3e659b75f..7bc5ed3248 100644
--- a/src/test/unit/RewardsCoordinatorUnit.t.sol
+++ b/src/test/unit/RewardsCoordinatorUnit.t.sol
@@ -105,6 +105,7 @@ contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordin
address defaultClaimer = address(1002);
address rewardsForAllSubmitter = address(1003);
address defaultAppointee = address(1004);
+ address feeRecipient = address(1005);
function setUp() public virtual override {
// Setup
@@ -116,6 +117,7 @@ contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordin
delegationManager: IDelegationManager(address(delegationManagerMock)),
strategyManager: IStrategyManager(address(strategyManagerMock)),
allocationManager: IAllocationManager(address(allocationManagerMock)),
+ emissionsController: IEmissionsController(address(vm.addr(0x123123ff))),
pauserRegistry: pauserRegistry,
permissionController: IPermissionController(address(permissionController)),
CALCULATION_INTERVAL_SECONDS: CALCULATION_INTERVAL_SECONDS,
@@ -137,7 +139,8 @@ contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordin
0, // 0 is initialPausedStatus
rewardsUpdater,
activationDelay,
- defaultSplitBips
+ defaultSplitBips,
+ feeRecipient
)
)
)
@@ -433,6 +436,61 @@ contract RewardsCoordinatorUnitTests_initializeAndSetters is RewardsCoordinatorU
cheats.expectRevert("Ownable: caller is not the owner");
rewardsCoordinator.setRewardsForAllSubmitter(submitter, newValue);
}
+
+ function testFuzz_setFeeRecipient(address newFeeRecipient) public {
+ cheats.startPrank(rewardsCoordinator.owner());
+ cheats.expectEmit(true, true, true, true, address(rewardsCoordinator));
+ emit FeeRecipientSet(feeRecipient, newFeeRecipient);
+ rewardsCoordinator.setFeeRecipient(newFeeRecipient);
+ assertEq(newFeeRecipient, rewardsCoordinator.feeRecipient(), "feeRecipient not set");
+ cheats.stopPrank();
+ }
+
+ function testFuzz_setFeeRecipient_Revert_WhenNotOwner(address caller, address newFeeRecipient)
+ public
+ filterFuzzedAddressInputs(caller)
+ {
+ cheats.assume(caller != rewardsCoordinator.owner());
+ cheats.prank(caller);
+ cheats.expectRevert("Ownable: caller is not the owner");
+ rewardsCoordinator.setFeeRecipient(newFeeRecipient);
+ }
+
+ function test_setFeeRecipient_Revert_WhenAddressZero() public {
+ cheats.prank(rewardsCoordinator.owner());
+ cheats.expectRevert(InvalidAddressZero.selector);
+ rewardsCoordinator.setFeeRecipient(address(0));
+ }
+}
+
+contract RewardsCoordinatorUnitTests_setOptInForProtocolFee is RewardsCoordinatorUnitTests {
+ function testFuzz_setOptInForProtocolFee(address submitter, bool optIn) public filterFuzzedAddressInputs(submitter) {
+ cheats.assume(submitter != address(0));
+
+ cheats.startPrank(submitter);
+ cheats.expectEmit(true, true, true, true, address(rewardsCoordinator));
+ emit OptInForProtocolFeeSet(submitter, rewardsCoordinator.isOptedInForProtocolFee(submitter), optIn);
+ rewardsCoordinator.setOptInForProtocolFee(submitter, optIn);
+ assertEq(optIn, rewardsCoordinator.isOptedInForProtocolFee(submitter), "isOptedInForProtocolFee not set");
+ cheats.stopPrank();
+ }
+
+ function testFuzz_setOptInForProtocolFee_UAM(address submitter, bool optIn) public filterFuzzedAddressInputs(submitter) {
+ cheats.assume(submitter != address(0));
+
+ // Set UAM
+ cheats.prank(submitter);
+ permissionController.setAppointee(
+ submitter, defaultAppointee, address(rewardsCoordinator), IRewardsCoordinator.setOptInForProtocolFee.selector
+ );
+
+ cheats.startPrank(defaultAppointee);
+ cheats.expectEmit(true, true, true, true, address(rewardsCoordinator));
+ emit OptInForProtocolFeeSet(submitter, rewardsCoordinator.isOptedInForProtocolFee(submitter), optIn);
+ rewardsCoordinator.setOptInForProtocolFee(submitter, optIn);
+ assertEq(optIn, rewardsCoordinator.isOptedInForProtocolFee(submitter), "isOptedInForProtocolFee not set");
+ cheats.stopPrank();
+ }
}
contract RewardsCoordinatorUnitTests_setOperatorAVSSplit is RewardsCoordinatorUnitTests {
@@ -1387,6 +1445,296 @@ contract RewardsCoordinatorUnitTests_createAVSRewardsSubmission is RewardsCoordi
);
}
}
+
+ /// @notice Test fee deduction when submitter opts in for protocol fees
+ function testFuzz_createAVSRewardsSubmission_WithProtocolFee_OptedIn(address avs, uint startTimestamp, uint duration, uint amount)
+ public
+ filterFuzzedAddressInputs(avs)
+ {
+ cheats.assume(avs != address(0));
+ cheats.prank(rewardsCoordinator.owner());
+
+ // 1. Bound fuzz inputs to valid ranges and amounts
+ IERC20 rewardToken = new ERC20PresetFixedSupply("dog wif hat", "MOCK1", mockTokenInitialSupply, avs);
+ amount = bound(amount, 1, mockTokenInitialSupply);
+ duration = bound(duration, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION);
+ duration = duration - (duration % CALCULATION_INTERVAL_SECONDS);
+ startTimestamp = bound(
+ startTimestamp,
+ uint(_maxTimestamp(GENESIS_REWARDS_TIMESTAMP, uint32(block.timestamp) - MAX_RETROACTIVE_LENGTH)) + CALCULATION_INTERVAL_SECONDS
+ - 1,
+ block.timestamp + uint(MAX_FUTURE_LENGTH)
+ );
+ startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS);
+
+ // 2. Opt in for protocol fees
+ cheats.prank(avs);
+ rewardsCoordinator.setOptInForProtocolFee(avs, true);
+
+ // 3. Create rewards submission input param
+ RewardsSubmission[] memory rewardsSubmissions = new RewardsSubmission[](1);
+ rewardsSubmissions[0] = RewardsSubmission({
+ strategiesAndMultipliers: defaultStrategyAndMultipliers,
+ token: rewardToken,
+ amount: amount,
+ startTimestamp: uint32(startTimestamp),
+ duration: uint32(duration)
+ });
+
+ // 4. Calculate expected fee: 20% of amount
+ uint feeAmount = (amount * 2000) / 10_000;
+
+ // 5. Call createAVSRewardsSubmission() and verify balances
+ {
+ uint avsBalanceBefore = rewardToken.balanceOf(avs);
+ uint rcBalanceBefore = rewardToken.balanceOf(address(rewardsCoordinator));
+ uint feeBalanceBefore = rewardToken.balanceOf(feeRecipient);
+
+ cheats.startPrank(avs);
+ rewardToken.approve(address(rewardsCoordinator), amount);
+ rewardsCoordinator.createAVSRewardsSubmission(rewardsSubmissions);
+ cheats.stopPrank();
+
+ // Verify balances
+ assertEq(rewardToken.balanceOf(avs), avsBalanceBefore - amount, "AVS balance incorrect");
+ assertEq(
+ rewardToken.balanceOf(address(rewardsCoordinator)),
+ rcBalanceBefore + amount - feeAmount,
+ "RewardsCoordinator balance incorrect"
+ );
+ assertEq(rewardToken.balanceOf(feeRecipient), feeBalanceBefore + feeAmount, "Fee recipient balance incorrect");
+ }
+ }
+
+ /// @notice Test no fee deduction when submitter doesn't opt in for protocol fees
+ function testFuzz_createAVSRewardsSubmission_WithProtocolFee_NotOptedIn(address avs, uint startTimestamp, uint duration, uint amount)
+ public
+ filterFuzzedAddressInputs(avs)
+ {
+ cheats.assume(avs != address(0));
+ cheats.prank(rewardsCoordinator.owner());
+
+ // 1. Bound fuzz inputs to valid ranges and amounts
+ IERC20 rewardToken = new ERC20PresetFixedSupply("dog wif hat", "MOCK1", mockTokenInitialSupply, avs);
+ amount = bound(amount, 1, mockTokenInitialSupply);
+ duration = bound(duration, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION);
+ duration = duration - (duration % CALCULATION_INTERVAL_SECONDS);
+ startTimestamp = bound(
+ startTimestamp,
+ uint(_maxTimestamp(GENESIS_REWARDS_TIMESTAMP, uint32(block.timestamp) - MAX_RETROACTIVE_LENGTH)) + CALCULATION_INTERVAL_SECONDS
+ - 1,
+ block.timestamp + uint(MAX_FUTURE_LENGTH)
+ );
+ startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS);
+
+ // 2. Ensure submitter is not opted in (default state)
+ assertEq(rewardsCoordinator.isOptedInForProtocolFee(avs), false, "Submitter should not be opted in by default");
+
+ // 3. Create rewards submission and verify balances
+ RewardsSubmission[] memory rewardsSubmissions = new RewardsSubmission[](1);
+ rewardsSubmissions[0] = RewardsSubmission({
+ strategiesAndMultipliers: defaultStrategyAndMultipliers,
+ token: rewardToken,
+ amount: amount,
+ startTimestamp: uint32(startTimestamp),
+ duration: uint32(duration)
+ });
+
+ {
+ uint avsBalanceBefore = rewardToken.balanceOf(avs);
+ uint rcBalanceBefore = rewardToken.balanceOf(address(rewardsCoordinator));
+ uint feeBalanceBefore = rewardToken.balanceOf(feeRecipient);
+
+ cheats.startPrank(avs);
+ rewardToken.approve(address(rewardsCoordinator), amount);
+ rewardsCoordinator.createAVSRewardsSubmission(rewardsSubmissions);
+ cheats.stopPrank();
+
+ // Verify balances - no fee should be taken
+ assertEq(rewardToken.balanceOf(avs), avsBalanceBefore - amount, "AVS balance incorrect");
+ assertEq(rewardToken.balanceOf(address(rewardsCoordinator)), rcBalanceBefore + amount, "RC balance incorrect");
+ assertEq(rewardToken.balanceOf(feeRecipient), feeBalanceBefore, "Fee recipient balance should not change");
+ }
+ }
+
+ /// @notice Test that protocol fee uses msg.sender for AVS rewards submission
+ function test_ProtocolFee_UsesMessageSender_AVS() public {
+ address avs = defaultAVS;
+
+ uint amount = 1e18;
+ IERC20 rewardToken = new ERC20PresetFixedSupply("test", "TEST", amount * 2, avs);
+
+ // Opt in the AVS (who is also msg.sender here) for protocol fees
+ cheats.prank(avs);
+ rewardsCoordinator.setOptInForProtocolFee(avs, true);
+
+ RewardsSubmission[] memory rewardsSubmissions = new RewardsSubmission[](1);
+ rewardsSubmissions[0] = RewardsSubmission({
+ strategiesAndMultipliers: defaultStrategyAndMultipliers,
+ token: rewardToken,
+ amount: amount,
+ startTimestamp: uint32(block.timestamp),
+ duration: CALCULATION_INTERVAL_SECONDS
+ });
+
+ uint feeBalanceBefore = rewardToken.balanceOf(feeRecipient);
+ uint rcBalanceBefore = rewardToken.balanceOf(address(rewardsCoordinator));
+
+ cheats.startPrank(avs);
+ rewardToken.approve(address(rewardsCoordinator), amount);
+ rewardsCoordinator.createAVSRewardsSubmission(rewardsSubmissions);
+ cheats.stopPrank();
+
+ // Fee should be taken because msg.sender (AVS) is opted in
+ uint expectedFee = (amount * 2000) / 10_000; // 20% fee
+ assertEq(rewardToken.balanceOf(feeRecipient), feeBalanceBefore + expectedFee, "Protocol fee should be taken");
+ assertEq(
+ rewardToken.balanceOf(address(rewardsCoordinator)),
+ rcBalanceBefore + amount - expectedFee,
+ "RewardsCoordinator should receive amount minus fee"
+ );
+ }
+}
+
+contract RewardsCoordinatorUnitTests_createEigenDARewardsSubmission is RewardsCoordinatorUnitTests {
+ // Revert when not called by emissionsController
+ function testFuzz_Revert_WhenNotEmissionsController(address unauthorizedCaller) public filterFuzzedAddressInputs(unauthorizedCaller) {
+ address emissionsController = address(vm.addr(0x123123ff));
+ cheats.assume(unauthorizedCaller != emissionsController);
+
+ cheats.prank(unauthorizedCaller);
+ cheats.expectRevert(UnauthorizedCaller.selector);
+ RewardsSubmission[] memory rewardsSubmissions;
+ rewardsCoordinator.createEigenDARewardsSubmission(address(defaultAVS), rewardsSubmissions);
+ }
+
+ // Test that emissionsController can successfully call
+ function test_EmissionsControllerCanCall() public {
+ address emissionsController = address(vm.addr(0x123123ff));
+ address avs = defaultAVS;
+
+ // Setup token and approval - AVS needs to have the tokens since it's the one submitting rewards
+ IERC20 rewardToken = new ERC20PresetFixedSupply("dog wif hat", "MOCK1", mockTokenInitialSupply, emissionsController);
+ uint amount = 1e18;
+
+ RewardsSubmission[] memory rewardsSubmissions = new RewardsSubmission[](1);
+ rewardsSubmissions[0] = RewardsSubmission({
+ strategiesAndMultipliers: defaultStrategyAndMultipliers,
+ token: rewardToken,
+ amount: amount,
+ startTimestamp: uint32(block.timestamp),
+ duration: CALCULATION_INTERVAL_SECONDS
+ });
+
+ // EmissionsController approves the rewards coordinator on each processed distribution.
+ // We mock that here.
+ cheats.prank(emissionsController);
+ rewardToken.approve(address(rewardsCoordinator), amount);
+
+ // Call from emissionsController should succeed
+ cheats.prank(emissionsController);
+ rewardsCoordinator.createEigenDARewardsSubmission(avs, rewardsSubmissions);
+
+ // Verify the rewards submission was created
+ assertEq(rewardToken.balanceOf(address(rewardsCoordinator)), amount);
+ }
+
+ /// @notice Test that protocol fee is based on msg.sender, not the AVS address
+ /// This test catches the bug where isOptedInForProtocolFee was checked against the wrong address
+ function test_ProtocolFee_UsesMessageSender_NotAVS() public {
+ address emissionsController = address(vm.addr(0x123123ff));
+ address avs = defaultAVS;
+
+ // Setup token - EmissionsController has the tokens since it's the one paying
+ IERC20 rewardToken = new ERC20PresetFixedSupply("dog wif hat", "MOCK1", mockTokenInitialSupply, emissionsController);
+ uint amount = 1e18;
+
+ // Opt in the EmissionsController (msg.sender) for protocol fees
+ cheats.prank(emissionsController);
+ rewardsCoordinator.setOptInForProtocolFee(emissionsController, true);
+
+ // Verify the AVS is NOT opted in (this is the key difference)
+ assertEq(rewardsCoordinator.isOptedInForProtocolFee(avs), false, "AVS should not be opted in");
+ assertEq(rewardsCoordinator.isOptedInForProtocolFee(emissionsController), true, "EmissionsController should be opted in");
+
+ RewardsSubmission[] memory rewardsSubmissions = new RewardsSubmission[](1);
+ rewardsSubmissions[0] = RewardsSubmission({
+ strategiesAndMultipliers: defaultStrategyAndMultipliers,
+ token: rewardToken,
+ amount: amount,
+ startTimestamp: uint32(block.timestamp),
+ duration: CALCULATION_INTERVAL_SECONDS
+ });
+
+ // EmissionsController approves and submits
+ cheats.startPrank(emissionsController);
+ rewardToken.approve(address(rewardsCoordinator), amount);
+
+ uint rcBalanceBefore = rewardToken.balanceOf(address(rewardsCoordinator));
+ uint feeBalanceBefore = rewardToken.balanceOf(feeRecipient);
+
+ rewardsCoordinator.createEigenDARewardsSubmission(avs, rewardsSubmissions);
+ cheats.stopPrank();
+
+ // Calculate expected fee (20% = 2000 bips)
+ uint expectedFee = (amount * 2000) / 10_000;
+
+ // Fee should be taken because msg.sender (EmissionsController) is opted in
+ // even though the AVS parameter is not opted in
+ assertEq(
+ rewardToken.balanceOf(address(rewardsCoordinator)),
+ rcBalanceBefore + amount - expectedFee,
+ "Protocol fee should be taken based on msg.sender opt-in status"
+ );
+ assertEq(rewardToken.balanceOf(feeRecipient), feeBalanceBefore + expectedFee, "Fee recipient should receive the protocol fee");
+ }
+
+ /// @notice Test that when AVS is opted in but msg.sender is not, fee should NOT be taken
+ /// This is the inverse case that would also fail with the bug
+ function test_ProtocolFee_AVSOptedIn_CallerNot_NoFee() public {
+ address emissionsController = address(vm.addr(0x123123ff));
+ address avs = defaultAVS;
+
+ // Setup token - EmissionsController has the tokens
+ IERC20 rewardToken = new ERC20PresetFixedSupply("dog wif hat", "MOCK1", mockTokenInitialSupply, emissionsController);
+ uint amount = 1e18;
+
+ // Opt in the AVS for protocol fees, but NOT the EmissionsController
+ cheats.prank(avs);
+ rewardsCoordinator.setOptInForProtocolFee(avs, true);
+
+ // Verify opt-in states
+ assertEq(rewardsCoordinator.isOptedInForProtocolFee(avs), true, "AVS should be opted in");
+ assertEq(rewardsCoordinator.isOptedInForProtocolFee(emissionsController), false, "EmissionsController should not be opted in");
+
+ RewardsSubmission[] memory rewardsSubmissions = new RewardsSubmission[](1);
+ rewardsSubmissions[0] = RewardsSubmission({
+ strategiesAndMultipliers: defaultStrategyAndMultipliers,
+ token: rewardToken,
+ amount: amount,
+ startTimestamp: uint32(block.timestamp),
+ duration: CALCULATION_INTERVAL_SECONDS
+ });
+
+ // EmissionsController approves and submits
+ cheats.startPrank(emissionsController);
+ rewardToken.approve(address(rewardsCoordinator), amount);
+
+ uint rcBalanceBefore = rewardToken.balanceOf(address(rewardsCoordinator));
+ uint feeBalanceBefore = rewardToken.balanceOf(feeRecipient);
+
+ rewardsCoordinator.createEigenDARewardsSubmission(avs, rewardsSubmissions);
+ cheats.stopPrank();
+
+ // Fee should NOT be taken because msg.sender (EmissionsController) is not opted in
+ // even though the AVS parameter is opted in
+ assertEq(
+ rewardToken.balanceOf(address(rewardsCoordinator)),
+ rcBalanceBefore + amount,
+ "No protocol fee should be taken - msg.sender not opted in"
+ );
+ assertEq(rewardToken.balanceOf(feeRecipient), feeBalanceBefore, "Fee recipient balance should not change");
+ }
}
contract RewardsCoordinatorUnitTests_createRewardsForAllSubmission is RewardsCoordinatorUnitTests {
@@ -2139,7 +2487,8 @@ contract RewardsCoordinatorUnitTests_createOperatorDirectedAVSRewardsSubmission
cheats.prank(rewardsCoordinator.owner());
// 1. Bound fuzz inputs to valid ranges and amounts
- amount = bound(amount, 1e38, type(uint).max - 5e18);
+ // Bound amount to be above MAX_REWARDS_AMOUNT but not so large it causes overflow in arithmetic operations
+ amount = bound(amount, 1e38, 1e38 + 1e30);
IERC20 rewardToken = new ERC20PresetFixedSupply("dog wif hat", "MOCK1", mockTokenInitialSupply, avs);
duration = bound(duration, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION);
duration = duration - (duration % CALCULATION_INTERVAL_SECONDS);
@@ -2151,13 +2500,15 @@ contract RewardsCoordinatorUnitTests_createOperatorDirectedAVSRewardsSubmission
);
startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS);
- // 2. Create operator directed rewards submission input param
+ // 2. Create operator directed rewards submission with single operator to avoid overflow in sum
+ OperatorReward[] memory largeOperatorRewards = new OperatorReward[](1);
+ largeOperatorRewards[0] = OperatorReward(defaultOperatorRewards[0].operator, amount);
+
OperatorDirectedRewardsSubmission[] memory operatorDirectedRewardsSubmissions = new OperatorDirectedRewardsSubmission[](1);
- defaultOperatorRewards[0].amount = amount;
operatorDirectedRewardsSubmissions[0] = OperatorDirectedRewardsSubmission({
strategiesAndMultipliers: defaultStrategyAndMultipliers,
token: rewardToken,
- operatorRewards: defaultOperatorRewards,
+ operatorRewards: largeOperatorRewards,
startTimestamp: uint32(startTimestamp),
duration: uint32(duration),
description: ""
@@ -2695,31 +3046,286 @@ contract RewardsCoordinatorUnitTests_createOperatorDirectedAVSRewardsSubmission
);
}
}
-}
-contract RewardsCoordinatorUnitTests_createOperatorDirectedOperatorSetRewardsSubmission is RewardsCoordinatorUnitTests {
- OperatorSet operatorSet;
- // used for stack too deep
+ /// @notice Test fee deduction for operator directed submissions when opted in
+ function testFuzz_createOperatorDirectedAVSRewardsSubmission_WithProtocolFee_OptedIn(address avs, uint startTimestamp, uint duration)
+ public
+ filterFuzzedAddressInputs(avs)
+ {
+ cheats.assume(avs != address(0));
- struct FuzzOperatorDirectedAVSRewardsSubmission {
- address avs;
- uint startTimestamp;
- uint duration;
- }
+ // 1. Bound fuzz inputs to valid ranges and amounts
+ IERC20 rewardToken = new ERC20PresetFixedSupply("dog wif hat", "MOCK1", mockTokenInitialSupply, avs);
+ duration = bound(duration, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION);
+ duration = duration - (duration % CALCULATION_INTERVAL_SECONDS);
+ startTimestamp = bound(
+ startTimestamp,
+ uint(_maxTimestamp(GENESIS_REWARDS_TIMESTAMP, uint32(block.timestamp) - MAX_RETROACTIVE_LENGTH)) + CALCULATION_INTERVAL_SECONDS
+ - 1,
+ block.timestamp - duration - 1
+ );
+ startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS);
- OperatorReward[] defaultOperatorRewards;
+ // 2. Opt in for protocol fees
+ cheats.prank(avs);
+ rewardsCoordinator.setOptInForProtocolFee(avs, true);
- function setUp() public virtual override {
- RewardsCoordinatorUnitTests.setUp();
+ // 3. Create operator directed rewards submission and verify
+ OperatorDirectedRewardsSubmission[] memory operatorDirectedRewardsSubmissions = new OperatorDirectedRewardsSubmission[](1);
+ operatorDirectedRewardsSubmissions[0] = OperatorDirectedRewardsSubmission({
+ strategiesAndMultipliers: defaultStrategyAndMultipliers,
+ token: rewardToken,
+ operatorRewards: defaultOperatorRewards,
+ startTimestamp: uint32(startTimestamp),
+ duration: uint32(duration),
+ description: ""
+ });
- address[] memory operators = new address[](3);
- operators[0] = makeAddr("operator1");
- operators[1] = makeAddr("operator2");
- operators[2] = makeAddr("operator3");
- operators = _sortAddressArrayAsc(operators);
+ uint totalAmount = _getTotalRewardsAmount(defaultOperatorRewards);
+ uint expectedFee;
+ {
+ // Calculate expected fee: 20% of each operator reward
+ for (uint i = 0; i < defaultOperatorRewards.length; i++) {
+ expectedFee += (defaultOperatorRewards[i].amount * 2000) / 10_000;
+ }
+ }
- defaultOperatorRewards.push(OperatorReward(operators[0], 1e18));
- defaultOperatorRewards.push(OperatorReward(operators[1], 2e18));
+ {
+ uint avsBalanceBefore = rewardToken.balanceOf(avs);
+ uint rcBalanceBefore = rewardToken.balanceOf(address(rewardsCoordinator));
+ uint feeBalanceBefore = rewardToken.balanceOf(feeRecipient);
+
+ cheats.startPrank(avs);
+ rewardToken.approve(address(rewardsCoordinator), totalAmount);
+ rewardsCoordinator.createOperatorDirectedAVSRewardsSubmission(avs, operatorDirectedRewardsSubmissions);
+ cheats.stopPrank();
+
+ // Verify balances
+ assertEq(rewardToken.balanceOf(avs), avsBalanceBefore - totalAmount, "AVS balance incorrect");
+ assertEq(
+ rewardToken.balanceOf(address(rewardsCoordinator)), rcBalanceBefore + totalAmount - expectedFee, "RC balance incorrect"
+ );
+ assertEq(rewardToken.balanceOf(feeRecipient), feeBalanceBefore + expectedFee, "Fee balance incorrect");
+ }
+ }
+
+ /// @notice Test no fee deduction for operator directed submissions when not opted in
+ function testFuzz_createOperatorDirectedAVSRewardsSubmission_WithProtocolFee_NotOptedIn(address avs, uint startTimestamp, uint duration)
+ public
+ filterFuzzedAddressInputs(avs)
+ {
+ cheats.assume(avs != address(0));
+
+ // 1. Bound fuzz inputs to valid ranges and amounts
+ IERC20 rewardToken = new ERC20PresetFixedSupply("dog wif hat", "MOCK1", mockTokenInitialSupply, avs);
+ duration = bound(duration, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION);
+ duration = duration - (duration % CALCULATION_INTERVAL_SECONDS);
+ startTimestamp = bound(
+ startTimestamp,
+ uint(_maxTimestamp(GENESIS_REWARDS_TIMESTAMP, uint32(block.timestamp) - MAX_RETROACTIVE_LENGTH)) + CALCULATION_INTERVAL_SECONDS
+ - 1,
+ block.timestamp - duration - 1
+ );
+ startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS);
+
+ // 2. Ensure submitter is not opted in (default state)
+ assertEq(rewardsCoordinator.isOptedInForProtocolFee(avs), false, "Submitter should not be opted in by default");
+
+ // 3. Create operator directed rewards submission and verify
+ OperatorDirectedRewardsSubmission[] memory operatorDirectedRewardsSubmissions = new OperatorDirectedRewardsSubmission[](1);
+ operatorDirectedRewardsSubmissions[0] = OperatorDirectedRewardsSubmission({
+ strategiesAndMultipliers: defaultStrategyAndMultipliers,
+ token: rewardToken,
+ operatorRewards: defaultOperatorRewards,
+ startTimestamp: uint32(startTimestamp),
+ duration: uint32(duration),
+ description: ""
+ });
+
+ uint totalAmount = _getTotalRewardsAmount(defaultOperatorRewards);
+ {
+ uint avsBalanceBefore = rewardToken.balanceOf(avs);
+ uint rcBalanceBefore = rewardToken.balanceOf(address(rewardsCoordinator));
+ uint feeBalanceBefore = rewardToken.balanceOf(feeRecipient);
+
+ cheats.startPrank(avs);
+ rewardToken.approve(address(rewardsCoordinator), totalAmount);
+ rewardsCoordinator.createOperatorDirectedAVSRewardsSubmission(avs, operatorDirectedRewardsSubmissions);
+ cheats.stopPrank();
+
+ // Verify balances - no fee should be taken
+ assertEq(rewardToken.balanceOf(avs), avsBalanceBefore - totalAmount, "AVS balance incorrect");
+ assertEq(rewardToken.balanceOf(address(rewardsCoordinator)), rcBalanceBefore + totalAmount, "RC balance incorrect");
+ assertEq(rewardToken.balanceOf(feeRecipient), feeBalanceBefore, "Fee recipient balance should not change");
+ }
+ }
+
+ /// @notice Test that MAX_REWARDS_AMOUNT is checked BEFORE protocol fee, not after
+ /// This test catches the bug where operator-directed rewards were checking the max after the fee
+ function test_MaxRewardAmount_CheckedBeforeFee_OperatorDirected() public {
+ address avs = defaultAVS;
+
+ // Use an amount that is JUST under MAX_REWARDS_AMOUNT (1e38)
+ // After a 10% protocol fee, it would be well under the max
+ uint amountJustUnderMax = 1e38 - 1e36; // 99e36
+
+ IERC20 rewardToken = new ERC20PresetFixedSupply("test", "TEST", amountJustUnderMax * 2, avs);
+
+ // Operator-directed submissions must be retroactive (already ended)
+ uint32 startTimestamp = uint32(block.timestamp - 2 * CALCULATION_INTERVAL_SECONDS);
+
+ // Opt in for protocol fees
+ cheats.prank(avs);
+ rewardsCoordinator.setOptInForProtocolFee(avs, true);
+
+ // Create operator rewards that sum to just under MAX_REWARDS_AMOUNT
+ OperatorReward[] memory operatorRewards = new OperatorReward[](1);
+ operatorRewards[0] = OperatorReward({operator: address(0x1111), amount: amountJustUnderMax});
+
+ OperatorDirectedRewardsSubmission[] memory submissions = new OperatorDirectedRewardsSubmission[](1);
+ submissions[0] = OperatorDirectedRewardsSubmission({
+ strategiesAndMultipliers: defaultStrategyAndMultipliers,
+ token: rewardToken,
+ operatorRewards: operatorRewards,
+ startTimestamp: startTimestamp,
+ duration: CALCULATION_INTERVAL_SECONDS,
+ description: ""
+ });
+
+ // This should succeed because we check BEFORE the fee
+ cheats.startPrank(avs);
+ rewardToken.approve(address(rewardsCoordinator), amountJustUnderMax);
+ rewardsCoordinator.createOperatorDirectedAVSRewardsSubmission(avs, submissions);
+ cheats.stopPrank();
+
+ // Verify the submission was created successfully
+ uint expectedFee = (amountJustUnderMax * 2000) / 10_000; // 20% fee
+ assertEq(
+ rewardToken.balanceOf(address(rewardsCoordinator)),
+ amountJustUnderMax - expectedFee,
+ "Submission should succeed with amount under max before fee"
+ );
+ }
+
+ /// @notice Test that amounts just OVER MAX_REWARDS_AMOUNT revert even if they would be under after fee
+ /// This ensures consistency with other submission types
+ function test_Revert_MaxRewardAmount_ExceedsBeforeFee() public {
+ address avs = defaultAVS;
+
+ // Use an amount that exceeds MAX_REWARDS_AMOUNT (1e38)
+ // Even though after 20% fee it would be under max, it should still revert
+ uint amountOverMax = 1e38 + 1e36; // 101e36
+
+ IERC20 rewardToken = new ERC20PresetFixedSupply("test", "TEST", amountOverMax * 2, avs);
+
+ // Operator-directed submissions must be retroactive (already ended)
+ uint32 startTimestamp = uint32(block.timestamp - 2 * CALCULATION_INTERVAL_SECONDS);
+
+ // Opt in for protocol fees
+ cheats.prank(avs);
+ rewardsCoordinator.setOptInForProtocolFee(avs, true);
+
+ // Create operator rewards that sum to over MAX_REWARDS_AMOUNT
+ OperatorReward[] memory operatorRewards = new OperatorReward[](1);
+ operatorRewards[0] = OperatorReward({operator: address(0x1111), amount: amountOverMax});
+
+ OperatorDirectedRewardsSubmission[] memory submissions = new OperatorDirectedRewardsSubmission[](1);
+ submissions[0] = OperatorDirectedRewardsSubmission({
+ strategiesAndMultipliers: defaultStrategyAndMultipliers,
+ token: rewardToken,
+ operatorRewards: operatorRewards,
+ startTimestamp: startTimestamp,
+ duration: CALCULATION_INTERVAL_SECONDS,
+ description: ""
+ });
+
+ // This should revert because amount exceeds max BEFORE fee
+ cheats.startPrank(avs);
+ rewardToken.approve(address(rewardsCoordinator), amountOverMax);
+ cheats.expectRevert(AmountExceedsMax.selector);
+ rewardsCoordinator.createOperatorDirectedAVSRewardsSubmission(avs, submissions);
+ cheats.stopPrank();
+ }
+
+ /// @notice Test that protocol fee uses msg.sender for operator-directed submissions too
+ function test_ProtocolFee_UsesMessageSender_OperatorDirected() public {
+ address thirdPartySubmitter = address(vm.addr(0x999999));
+ address avs = defaultAVS;
+
+ uint amount = 1e18;
+ IERC20 rewardToken = new ERC20PresetFixedSupply("test", "TEST", amount * 2, thirdPartySubmitter);
+
+ // Operator-directed submissions must be retroactive (already ended)
+ uint32 startTimestamp = uint32(block.timestamp - 2 * CALCULATION_INTERVAL_SECONDS);
+
+ // Grant permission for thirdPartySubmitter to act on behalf of AVS
+ cheats.prank(avs);
+ permissionController.setAppointee(
+ avs, thirdPartySubmitter, address(rewardsCoordinator), IRewardsCoordinator.createOperatorDirectedAVSRewardsSubmission.selector
+ );
+
+ // Opt in the submitter (msg.sender), not the AVS
+ cheats.prank(thirdPartySubmitter);
+ rewardsCoordinator.setOptInForProtocolFee(thirdPartySubmitter, true);
+
+ // Verify states
+ assertEq(rewardsCoordinator.isOptedInForProtocolFee(avs), false, "AVS should not be opted in");
+ assertEq(rewardsCoordinator.isOptedInForProtocolFee(thirdPartySubmitter), true, "Submitter should be opted in");
+
+ OperatorReward[] memory operatorRewards = new OperatorReward[](1);
+ operatorRewards[0] = OperatorReward({operator: address(0x1111), amount: amount});
+
+ OperatorDirectedRewardsSubmission[] memory submissions = new OperatorDirectedRewardsSubmission[](1);
+ submissions[0] = OperatorDirectedRewardsSubmission({
+ strategiesAndMultipliers: defaultStrategyAndMultipliers,
+ token: rewardToken,
+ operatorRewards: operatorRewards,
+ startTimestamp: startTimestamp,
+ duration: CALCULATION_INTERVAL_SECONDS,
+ description: ""
+ });
+
+ uint feeBalanceBefore = rewardToken.balanceOf(feeRecipient);
+
+ // Third party submits on behalf of AVS
+ cheats.startPrank(thirdPartySubmitter);
+ rewardToken.approve(address(rewardsCoordinator), amount);
+ rewardsCoordinator.createOperatorDirectedAVSRewardsSubmission(avs, submissions);
+ cheats.stopPrank();
+
+ // Fee should be taken because msg.sender is opted in
+ uint expectedFee = (amount * 2000) / 10_000; // 20% fee
+ assertEq(
+ rewardToken.balanceOf(feeRecipient),
+ feeBalanceBefore + expectedFee,
+ "Protocol fee should be taken based on msg.sender opt-in status"
+ );
+ }
+}
+
+contract RewardsCoordinatorUnitTests_createOperatorDirectedOperatorSetRewardsSubmission is RewardsCoordinatorUnitTests {
+ OperatorSet operatorSet;
+ // used for stack too deep
+
+ struct FuzzOperatorDirectedAVSRewardsSubmission {
+ address avs;
+ uint startTimestamp;
+ uint duration;
+ }
+
+ OperatorReward[] defaultOperatorRewards;
+
+ function setUp() public virtual override {
+ RewardsCoordinatorUnitTests.setUp();
+
+ address[] memory operators = new address[](3);
+ operators[0] = makeAddr("operator1");
+ operators[1] = makeAddr("operator2");
+ operators[2] = makeAddr("operator3");
+ operators = _sortAddressArrayAsc(operators);
+
+ defaultOperatorRewards.push(OperatorReward(operators[0], 1e18));
+ defaultOperatorRewards.push(OperatorReward(operators[1], 2e18));
defaultOperatorRewards.push(OperatorReward(operators[2], 3e18));
// Set the timestamp to when Rewards v2 will realisticly go out (i.e 6 months)
@@ -2729,17 +3335,12 @@ contract RewardsCoordinatorUnitTests_createOperatorDirectedOperatorSetRewardsSub
}
/// @dev Sort to ensure that the array is in ascending order for addresses
- function _sortAddressArrayAsc(address[] memory arr) internal pure returns (address[] memory) {
- uint l = arr.length;
- for (uint i = 0; i < l; i++) {
- for (uint j = i + 1; j < l; j++) {
- if (arr[i] > arr[j]) {
- address temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- }
- }
+ function _sortAddressArrayAsc(address[] memory arr) internal returns (address[] memory) {
+ uint[] memory casted;
+ assembly {
+ casted := arr
}
+ casted = cheats.sort(casted);
return arr;
}
@@ -3033,7 +3634,8 @@ contract RewardsCoordinatorUnitTests_createOperatorDirectedOperatorSetRewardsSub
cheats.prank(rewardsCoordinator.owner());
// 1. Bound fuzz inputs to valid ranges and amounts
- amount = bound(amount, 1e38, type(uint).max - 5e18);
+ // Bound amount to be above MAX_REWARDS_AMOUNT but not so large it causes overflow in arithmetic operations
+ amount = bound(amount, 1e38, 1e38 + 1e30);
IERC20 rewardToken = new ERC20PresetFixedSupply("dog wif hat", "MOCK1", mockTokenInitialSupply, avs);
duration = bound(duration, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION);
duration = duration - (duration % CALCULATION_INTERVAL_SECONDS);
@@ -3045,13 +3647,15 @@ contract RewardsCoordinatorUnitTests_createOperatorDirectedOperatorSetRewardsSub
);
startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS);
- // 2. Create operator directed rewards submission input param
+ // 2. Create operator directed rewards submission with single operator to avoid overflow in sum
+ OperatorReward[] memory largeOperatorRewards = new OperatorReward[](1);
+ largeOperatorRewards[0] = OperatorReward(defaultOperatorRewards[0].operator, amount);
+
OperatorDirectedRewardsSubmission[] memory operatorDirectedRewardsSubmissions = new OperatorDirectedRewardsSubmission[](1);
- defaultOperatorRewards[0].amount = amount;
operatorDirectedRewardsSubmissions[0] = OperatorDirectedRewardsSubmission({
strategiesAndMultipliers: defaultStrategyAndMultipliers,
token: rewardToken,
- operatorRewards: defaultOperatorRewards,
+ operatorRewards: largeOperatorRewards,
startTimestamp: uint32(startTimestamp),
duration: uint32(duration),
description: ""
@@ -4275,6 +4879,120 @@ contract RewardsCoordinatorUnitTests_createUniqueStakeRewardsSubmission is Rewar
"RewardsCoordinator balance not incremented by amount"
);
}
+
+ /// @notice Test fee deduction for createUniqueStakeRewardsSubmission when opted in
+ function testFuzz_createUniqueStakeRewardsSubmission_WithProtocolFee_OptedIn(
+ address avs,
+ uint startTimestamp,
+ uint duration,
+ uint amount
+ ) public filterFuzzedAddressInputs(avs) {
+ cheats.assume(avs != address(0));
+
+ // Setup operator set
+ OperatorSet memory operatorSet = OperatorSet(avs, 1);
+ allocationManagerMock.setIsOperatorSet(operatorSet, true);
+
+ // 1. Bound fuzz inputs to valid ranges and amounts
+ IERC20 rewardToken = new ERC20PresetFixedSupply("dog wif hat", "MOCK1", mockTokenInitialSupply, avs);
+ amount = bound(amount, 1, mockTokenInitialSupply);
+ duration = bound(duration, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION);
+ duration = duration - (duration % CALCULATION_INTERVAL_SECONDS);
+ startTimestamp = bound(
+ startTimestamp,
+ uint(_maxTimestamp(GENESIS_REWARDS_TIMESTAMP, uint32(block.timestamp) - MAX_RETROACTIVE_LENGTH)) + CALCULATION_INTERVAL_SECONDS
+ - 1,
+ block.timestamp + uint(MAX_FUTURE_LENGTH)
+ );
+ startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS);
+
+ // 2. Opt in for protocol fees
+ cheats.prank(avs);
+ rewardsCoordinator.setOptInForProtocolFee(avs, true);
+
+ // 3. Create rewards submission and verify
+ RewardsSubmission[] memory rewardsSubmissions = new RewardsSubmission[](1);
+ rewardsSubmissions[0] = RewardsSubmission({
+ strategiesAndMultipliers: defaultStrategyAndMultipliers,
+ token: rewardToken,
+ amount: amount,
+ startTimestamp: uint32(startTimestamp),
+ duration: uint32(duration)
+ });
+
+ uint feeAmount = (amount * 2000) / 10_000;
+ {
+ uint avsBalanceBefore = rewardToken.balanceOf(avs);
+ uint rcBalanceBefore = rewardToken.balanceOf(address(rewardsCoordinator));
+ uint feeBalanceBefore = rewardToken.balanceOf(feeRecipient);
+
+ cheats.startPrank(avs);
+ rewardToken.approve(address(rewardsCoordinator), amount);
+ rewardsCoordinator.createUniqueStakeRewardsSubmission(operatorSet, rewardsSubmissions);
+ cheats.stopPrank();
+
+ // Verify balances
+ assertEq(rewardToken.balanceOf(avs), avsBalanceBefore - amount, "AVS balance incorrect");
+ assertEq(rewardToken.balanceOf(address(rewardsCoordinator)), rcBalanceBefore + amount - feeAmount, "RC balance incorrect");
+ assertEq(rewardToken.balanceOf(feeRecipient), feeBalanceBefore + feeAmount, "Fee balance incorrect");
+ }
+ }
+
+ /// @notice Test no fee deduction for createUniqueStakeRewardsSubmission when not opted in
+ function testFuzz_createUniqueStakeRewardsSubmission_WithProtocolFee_NotOptedIn(
+ address avs,
+ uint startTimestamp,
+ uint duration,
+ uint amount
+ ) public filterFuzzedAddressInputs(avs) {
+ cheats.assume(avs != address(0));
+
+ // Setup operator set
+ OperatorSet memory operatorSet = OperatorSet(avs, 1);
+ allocationManagerMock.setIsOperatorSet(operatorSet, true);
+
+ // 1. Bound fuzz inputs to valid ranges and amounts
+ IERC20 rewardToken = new ERC20PresetFixedSupply("dog wif hat", "MOCK1", mockTokenInitialSupply, avs);
+ amount = bound(amount, 1, mockTokenInitialSupply);
+ duration = bound(duration, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION);
+ duration = duration - (duration % CALCULATION_INTERVAL_SECONDS);
+ startTimestamp = bound(
+ startTimestamp,
+ uint(_maxTimestamp(GENESIS_REWARDS_TIMESTAMP, uint32(block.timestamp) - MAX_RETROACTIVE_LENGTH)) + CALCULATION_INTERVAL_SECONDS
+ - 1,
+ block.timestamp + uint(MAX_FUTURE_LENGTH)
+ );
+ startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS);
+
+ // 2. Ensure submitter is not opted in (default state)
+ assertEq(rewardsCoordinator.isOptedInForProtocolFee(avs), false, "Submitter should not be opted in by default");
+
+ // 3. Create rewards submission and verify
+ RewardsSubmission[] memory rewardsSubmissions = new RewardsSubmission[](1);
+ rewardsSubmissions[0] = RewardsSubmission({
+ strategiesAndMultipliers: defaultStrategyAndMultipliers,
+ token: rewardToken,
+ amount: amount,
+ startTimestamp: uint32(startTimestamp),
+ duration: uint32(duration)
+ });
+
+ {
+ uint avsBalanceBefore = rewardToken.balanceOf(avs);
+ uint rcBalanceBefore = rewardToken.balanceOf(address(rewardsCoordinator));
+ uint feeBalanceBefore = rewardToken.balanceOf(feeRecipient);
+
+ cheats.startPrank(avs);
+ rewardToken.approve(address(rewardsCoordinator), amount);
+ rewardsCoordinator.createUniqueStakeRewardsSubmission(operatorSet, rewardsSubmissions);
+ cheats.stopPrank();
+
+ // Verify balances - no fee should be taken
+ assertEq(rewardToken.balanceOf(avs), avsBalanceBefore - amount, "AVS balance incorrect");
+ assertEq(rewardToken.balanceOf(address(rewardsCoordinator)), rcBalanceBefore + amount, "RC balance incorrect");
+ assertEq(rewardToken.balanceOf(feeRecipient), feeBalanceBefore, "Fee recipient balance should not change");
+ }
+ }
}
contract RewardsCoordinatorUnitTests_createTotalStakeRewardsSubmission is RewardsCoordinatorUnitTests {
@@ -4914,6 +5632,120 @@ contract RewardsCoordinatorUnitTests_createTotalStakeRewardsSubmission is Reward
"RewardsCoordinator balance not incremented by amount"
);
}
+
+ /// @notice Test fee deduction for createTotalStakeRewardsSubmission when opted in
+ function testFuzz_createTotalStakeRewardsSubmission_WithProtocolFee_OptedIn(
+ address avs,
+ uint startTimestamp,
+ uint duration,
+ uint amount
+ ) public filterFuzzedAddressInputs(avs) {
+ cheats.assume(avs != address(0));
+
+ // Setup operator set
+ OperatorSet memory operatorSet = OperatorSet(avs, 1);
+ allocationManagerMock.setIsOperatorSet(operatorSet, true);
+
+ // 1. Bound fuzz inputs to valid ranges and amounts
+ IERC20 rewardToken = new ERC20PresetFixedSupply("dog wif hat", "MOCK1", mockTokenInitialSupply, avs);
+ amount = bound(amount, 1, mockTokenInitialSupply);
+ duration = bound(duration, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION);
+ duration = duration - (duration % CALCULATION_INTERVAL_SECONDS);
+ startTimestamp = bound(
+ startTimestamp,
+ uint(_maxTimestamp(GENESIS_REWARDS_TIMESTAMP, uint32(block.timestamp) - MAX_RETROACTIVE_LENGTH)) + CALCULATION_INTERVAL_SECONDS
+ - 1,
+ block.timestamp + uint(MAX_FUTURE_LENGTH)
+ );
+ startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS);
+
+ // 2. Opt in for protocol fees
+ cheats.prank(avs);
+ rewardsCoordinator.setOptInForProtocolFee(avs, true);
+
+ // 3. Create rewards submission and verify
+ RewardsSubmission[] memory rewardsSubmissions = new RewardsSubmission[](1);
+ rewardsSubmissions[0] = RewardsSubmission({
+ strategiesAndMultipliers: defaultStrategyAndMultipliers,
+ token: rewardToken,
+ amount: amount,
+ startTimestamp: uint32(startTimestamp),
+ duration: uint32(duration)
+ });
+
+ uint feeAmount = (amount * 2000) / 10_000;
+ {
+ uint avsBalanceBefore = rewardToken.balanceOf(avs);
+ uint rcBalanceBefore = rewardToken.balanceOf(address(rewardsCoordinator));
+ uint feeBalanceBefore = rewardToken.balanceOf(feeRecipient);
+
+ cheats.startPrank(avs);
+ rewardToken.approve(address(rewardsCoordinator), amount);
+ rewardsCoordinator.createTotalStakeRewardsSubmission(operatorSet, rewardsSubmissions);
+ cheats.stopPrank();
+
+ // Verify balances
+ assertEq(rewardToken.balanceOf(avs), avsBalanceBefore - amount, "AVS balance incorrect");
+ assertEq(rewardToken.balanceOf(address(rewardsCoordinator)), rcBalanceBefore + amount - feeAmount, "RC balance incorrect");
+ assertEq(rewardToken.balanceOf(feeRecipient), feeBalanceBefore + feeAmount, "Fee balance incorrect");
+ }
+ }
+
+ /// @notice Test no fee deduction for createTotalStakeRewardsSubmission when not opted in
+ function testFuzz_createTotalStakeRewardsSubmission_WithProtocolFee_NotOptedIn(
+ address avs,
+ uint startTimestamp,
+ uint duration,
+ uint amount
+ ) public filterFuzzedAddressInputs(avs) {
+ cheats.assume(avs != address(0));
+
+ // Setup operator set
+ OperatorSet memory operatorSet = OperatorSet(avs, 1);
+ allocationManagerMock.setIsOperatorSet(operatorSet, true);
+
+ // 1. Bound fuzz inputs to valid ranges and amounts
+ IERC20 rewardToken = new ERC20PresetFixedSupply("dog wif hat", "MOCK1", mockTokenInitialSupply, avs);
+ amount = bound(amount, 1, mockTokenInitialSupply);
+ duration = bound(duration, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION);
+ duration = duration - (duration % CALCULATION_INTERVAL_SECONDS);
+ startTimestamp = bound(
+ startTimestamp,
+ uint(_maxTimestamp(GENESIS_REWARDS_TIMESTAMP, uint32(block.timestamp) - MAX_RETROACTIVE_LENGTH)) + CALCULATION_INTERVAL_SECONDS
+ - 1,
+ block.timestamp + uint(MAX_FUTURE_LENGTH)
+ );
+ startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS);
+
+ // 2. Ensure submitter is not opted in (default state)
+ assertEq(rewardsCoordinator.isOptedInForProtocolFee(avs), false, "Submitter should not be opted in by default");
+
+ // 3. Create rewards submission and verify
+ RewardsSubmission[] memory rewardsSubmissions = new RewardsSubmission[](1);
+ rewardsSubmissions[0] = RewardsSubmission({
+ strategiesAndMultipliers: defaultStrategyAndMultipliers,
+ token: rewardToken,
+ amount: amount,
+ startTimestamp: uint32(startTimestamp),
+ duration: uint32(duration)
+ });
+
+ {
+ uint avsBalanceBefore = rewardToken.balanceOf(avs);
+ uint rcBalanceBefore = rewardToken.balanceOf(address(rewardsCoordinator));
+ uint feeBalanceBefore = rewardToken.balanceOf(feeRecipient);
+
+ cheats.startPrank(avs);
+ rewardToken.approve(address(rewardsCoordinator), amount);
+ rewardsCoordinator.createTotalStakeRewardsSubmission(operatorSet, rewardsSubmissions);
+ cheats.stopPrank();
+
+ // Verify balances - no fee should be taken
+ assertEq(rewardToken.balanceOf(avs), avsBalanceBefore - amount, "AVS balance incorrect");
+ assertEq(rewardToken.balanceOf(address(rewardsCoordinator)), rcBalanceBefore + amount, "RC balance incorrect");
+ assertEq(rewardToken.balanceOf(feeRecipient), feeBalanceBefore, "Fee recipient balance should not change");
+ }
+ }
}
contract RewardsCoordinatorUnitTests_submitRoot is RewardsCoordinatorUnitTests {
diff --git a/src/test/unit/StrategyFactoryUnit.t.sol b/src/test/unit/StrategyFactoryUnit.t.sol
index 873883ce0e..e34251e346 100644
--- a/src/test/unit/StrategyFactoryUnit.t.sol
+++ b/src/test/unit/StrategyFactoryUnit.t.sol
@@ -5,8 +5,15 @@ import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol";
import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
import "src/contracts/strategies/StrategyFactory.sol";
+import "src/contracts/strategies/DurationVaultStrategy.sol";
+import "../../contracts/interfaces/IDurationVaultStrategy.sol";
+import "../../contracts/interfaces/IDelegationManager.sol";
+import "../../contracts/interfaces/IAllocationManager.sol";
+import "../../contracts/interfaces/IRewardsCoordinator.sol";
+import "../../contracts/libraries/OperatorSetLib.sol";
import "src/test/utils/EigenLayerUnitTestSetup.sol";
import "../../contracts/permissions/PauserRegistry.sol";
+import "../mocks/RewardsCoordinatorMock.sol";
/// @notice Unit testing of the StrategyFactory contract.
/// Contracts tested: StrategyFactory
@@ -17,18 +24,22 @@ contract StrategyFactoryUnitTests is EigenLayerUnitTestSetup {
// Contract dependencies
StrategyBase public strategyImplementation;
+ DurationVaultStrategy public durationVaultImplementation;
UpgradeableBeacon public strategyBeacon;
+ UpgradeableBeacon public durationVaultBeacon;
ERC20PresetFixedSupply public underlyingToken;
-
uint initialSupply = 1e36;
address initialOwner = address(this);
address beaconProxyOwner = address(this);
address notOwner = address(7_777_777);
uint initialPausedStatus = 0;
-
- /// @notice Emitted when the `strategyBeacon` is changed
- event StrategyBeaconModified(IBeacon previousBeacon, IBeacon newBeacon);
+ address internal constant OPERATOR_SET_AVS = address(0xABCD);
+ uint32 internal constant OPERATOR_SET_ID = 9;
+ address internal constant DELEGATION_APPROVER = address(0x5151);
+ uint32 internal constant OPERATOR_ALLOCATION_DELAY = 4;
+ string internal constant OPERATOR_METADATA_URI = "ipfs://factory-duration-vault";
+ bytes internal constant REGISTRATION_DATA = hex"F00D";
/// @notice Emitted whenever a slot is set in the `deployedStrategies` mapping
event StrategySetForToken(IERC20 token, IStrategy strategy);
@@ -37,6 +48,8 @@ contract StrategyFactoryUnitTests is EigenLayerUnitTestSetup {
function setUp() public virtual override {
EigenLayerUnitTestSetup.setUp();
+ // Ensure allocation delay matches expected OPERATOR_ALLOCATION_DELAY when vaults register.
+ delegationManagerMock.setMinWithdrawalDelayBlocks(OPERATOR_ALLOCATION_DELAY - 1);
address[] memory pausers = new address[](1);
pausers[0] = pauser;
@@ -49,17 +62,37 @@ contract StrategyFactoryUnitTests is EigenLayerUnitTestSetup {
strategyBeacon = new UpgradeableBeacon(address(strategyImplementation));
strategyBeacon.transferOwnership(beaconProxyOwner);
- strategyFactoryImplementation = new StrategyFactory(IStrategyManager(address(strategyManagerMock)), pauserRegistry);
+ rewardsCoordinatorMock = new RewardsCoordinatorMock();
+ // Deploy strategyFactory proxy first (with placeholder impl) so DurationVaultStrategy can reference it
+ StrategyFactory placeholderFactoryImpl =
+ new StrategyFactory(IStrategyManager(address(strategyManagerMock)), pauserRegistry, strategyBeacon, IBeacon(address(0)));
strategyFactory = StrategyFactory(
address(
new TransparentUpgradeableProxy(
- address(strategyFactoryImplementation),
+ address(placeholderFactoryImpl),
address(eigenLayerProxyAdmin),
- abi.encodeWithSelector(StrategyFactory.initialize.selector, initialOwner, initialPausedStatus, strategyBeacon)
+ abi.encodeWithSelector(StrategyFactory.initialize.selector, initialOwner, initialPausedStatus)
)
)
);
+
+ // Now deploy DurationVaultStrategy with the factory reference
+ durationVaultImplementation = new DurationVaultStrategy(
+ IStrategyManager(address(strategyManagerMock)),
+ pauserRegistry,
+ IDelegationManager(address(delegationManagerMock)),
+ IAllocationManager(address(allocationManagerMock)),
+ IRewardsCoordinator(address(rewardsCoordinatorMock)),
+ IStrategyFactory(address(strategyFactory))
+ );
+ durationVaultBeacon = new UpgradeableBeacon(address(durationVaultImplementation));
+ durationVaultBeacon.transferOwnership(beaconProxyOwner);
+
+ // Upgrade strategyFactory to final impl with correct beacon
+ strategyFactoryImplementation =
+ new StrategyFactory(IStrategyManager(address(strategyManagerMock)), pauserRegistry, strategyBeacon, durationVaultBeacon);
+ eigenLayerProxyAdmin.upgrade(ITransparentUpgradeableProxy(address(strategyFactory)), address(strategyFactoryImplementation));
}
function test_initialization() public view {
@@ -90,11 +123,7 @@ contract StrategyFactoryUnitTests is EigenLayerUnitTestSetup {
function test_initialize_revert_reinitialization() public {
cheats.expectRevert("Initializable: contract is already initialized");
- strategyFactory.initialize({
- _initialOwner: initialOwner,
- _initialPausedStatus: initialPausedStatus,
- _strategyBeacon: strategyBeacon
- });
+ strategyFactory.initialize({_initialOwner: initialOwner, _initialPausedStatus: initialPausedStatus});
}
function test_deployNewStrategy() public {
@@ -116,6 +145,59 @@ contract StrategyFactoryUnitTests is EigenLayerUnitTestSetup {
strategyFactory.deployNewStrategy(underlyingToken);
}
+ function test_deployDurationVaultStrategy() public {
+ IDurationVaultStrategyTypes.VaultConfig memory config = IDurationVaultStrategyTypes.VaultConfig({
+ underlyingToken: underlyingToken,
+ vaultAdmin: address(this),
+ arbitrator: address(this),
+ duration: uint32(30 days),
+ maxPerDeposit: 10 ether,
+ stakeCap: 100 ether,
+ metadataURI: "ipfs://duration",
+ operatorSet: OperatorSet({avs: OPERATOR_SET_AVS, id: OPERATOR_SET_ID}),
+ operatorSetRegistrationData: REGISTRATION_DATA,
+ delegationApprover: DELEGATION_APPROVER,
+ operatorMetadataURI: OPERATOR_METADATA_URI
+ });
+
+ DurationVaultStrategy vault = DurationVaultStrategy(address(strategyFactory.deployDurationVaultStrategy(config)));
+
+ IDurationVaultStrategy[] memory deployedVaults = strategyFactory.getDurationVaults(underlyingToken);
+ require(deployedVaults.length == 1, "vault not tracked");
+ require(address(deployedVaults[0]) == address(vault), "vault mismatch");
+ assertTrue(strategyManagerMock.strategyIsWhitelistedForDeposit(vault), "duration vault not whitelisted");
+ }
+
+ function test_deployDurationVaultStrategy_withExistingStrategy() public {
+ StrategyBase base = StrategyBase(address(strategyFactory.deployNewStrategy(underlyingToken)));
+ require(strategyFactory.deployedStrategies(underlyingToken) == base, "base strategy missing");
+
+ IDurationVaultStrategyTypes.VaultConfig memory config = IDurationVaultStrategyTypes.VaultConfig({
+ underlyingToken: underlyingToken,
+ vaultAdmin: address(this),
+ arbitrator: address(this),
+ duration: uint32(7 days),
+ maxPerDeposit: 5 ether,
+ stakeCap: 50 ether,
+ metadataURI: "ipfs://duration",
+ operatorSet: OperatorSet({avs: OPERATOR_SET_AVS, id: OPERATOR_SET_ID}),
+ operatorSetRegistrationData: REGISTRATION_DATA,
+ delegationApprover: DELEGATION_APPROVER,
+ operatorMetadataURI: OPERATOR_METADATA_URI
+ });
+
+ strategyFactory.deployDurationVaultStrategy(config);
+
+ IDurationVaultStrategy[] memory deployedVaults = strategyFactory.getDurationVaults(underlyingToken);
+ require(deployedVaults.length == 1, "duration vault missing");
+ assertTrue(
+ strategyManagerMock.strategyIsWhitelistedForDeposit(IDurationVaultStrategy(address(deployedVaults[0]))), "vault not whitelisted"
+ );
+
+ // Base mapping should remain untouched.
+ require(strategyFactory.deployedStrategies(underlyingToken) == base, "base strategy overwritten");
+ }
+
function test_blacklistTokens(IERC20 token) public {
IERC20[] memory tokens = new IERC20[](1);
tokens[0] = token;
diff --git a/src/test/unit/StrategyManagerDurationUnit.t.sol b/src/test/unit/StrategyManagerDurationUnit.t.sol
new file mode 100644
index 0000000000..72816d4666
--- /dev/null
+++ b/src/test/unit/StrategyManagerDurationUnit.t.sol
@@ -0,0 +1,186 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.27;
+
+import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol";
+
+import "src/contracts/core/StrategyManager.sol";
+import "src/contracts/strategies/DurationVaultStrategy.sol";
+import "src/contracts/interfaces/IDurationVaultStrategy.sol";
+import "src/contracts/interfaces/IStrategy.sol";
+import "src/contracts/interfaces/IDelegationManager.sol";
+import "src/contracts/interfaces/ISignatureUtilsMixin.sol";
+import "src/contracts/interfaces/IAllocationManager.sol";
+import "src/contracts/interfaces/IRewardsCoordinator.sol";
+import "src/contracts/libraries/OperatorSetLib.sol";
+import "src/test/utils/EigenLayerUnitTestSetup.sol";
+import "src/test/mocks/RewardsCoordinatorMock.sol";
+import "src/test/mocks/StrategyFactoryMock.sol";
+
+contract StrategyManagerDurationUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEvents {
+ StrategyManager public strategyManagerImplementation;
+ StrategyManager public strategyManager;
+
+ DurationVaultStrategy public durationVaultImplementation;
+ IDurationVaultStrategy public durationVault;
+
+ StrategyFactoryMock public strategyFactoryMock;
+ ERC20PresetFixedSupply public underlyingToken;
+
+ address internal constant STAKER = address(0xBEEF);
+ uint internal constant INITIAL_SUPPLY = 1e36;
+ address internal constant OPERATOR_SET_AVS = address(0xF00D);
+ uint32 internal constant OPERATOR_SET_ID = 7;
+ address internal constant DELEGATION_APPROVER = address(0xCAFE);
+ uint32 internal constant OPERATOR_ALLOCATION_DELAY = 3;
+ string internal constant OPERATOR_METADATA_URI = "ipfs://strategy-manager-vault";
+ bytes internal constant REGISTRATION_DATA = hex"DEADBEEF";
+
+ function setUp() public override {
+ EigenLayerUnitTestSetup.setUp();
+ // Align allocation delay with expected OPERATOR_ALLOCATION_DELAY for duration vault registration.
+ delegationManagerMock.setMinWithdrawalDelayBlocks(OPERATOR_ALLOCATION_DELAY - 1);
+
+ strategyManagerImplementation = new StrategyManager(
+ IAllocationManager(address(allocationManagerMock)), IDelegationManager(address(delegationManagerMock)), pauserRegistry, "9.9.9"
+ );
+
+ strategyManager = StrategyManager(
+ address(
+ new TransparentUpgradeableProxy(
+ address(strategyManagerImplementation),
+ address(eigenLayerProxyAdmin),
+ abi.encodeWithSelector(StrategyManager.initialize.selector, address(this), address(this), 0)
+ )
+ )
+ );
+
+ underlyingToken = new ERC20PresetFixedSupply("Mock Token", "MOCK", INITIAL_SUPPLY, address(this));
+ rewardsCoordinatorMock = new RewardsCoordinatorMock();
+ strategyFactoryMock = new StrategyFactoryMock();
+
+ durationVaultImplementation = new DurationVaultStrategy(
+ IStrategyManager(address(strategyManager)),
+ pauserRegistry,
+ IDelegationManager(address(delegationManagerMock)),
+ IAllocationManager(address(allocationManagerMock)),
+ IRewardsCoordinator(address(rewardsCoordinatorMock)),
+ IStrategyFactory(address(strategyFactoryMock))
+ );
+
+ IDurationVaultStrategyTypes.VaultConfig memory cfg = IDurationVaultStrategyTypes.VaultConfig({
+ underlyingToken: IERC20(address(underlyingToken)),
+ vaultAdmin: address(this),
+ arbitrator: address(this),
+ duration: uint32(30 days),
+ maxPerDeposit: 1_000_000 ether,
+ stakeCap: 10_000_000 ether,
+ metadataURI: "ipfs://duration-vault-test",
+ operatorSet: OperatorSet({avs: OPERATOR_SET_AVS, id: OPERATOR_SET_ID}),
+ operatorSetRegistrationData: REGISTRATION_DATA,
+ delegationApprover: DELEGATION_APPROVER,
+ operatorMetadataURI: OPERATOR_METADATA_URI
+ });
+
+ durationVault = IDurationVaultStrategy(
+ address(
+ new TransparentUpgradeableProxy(
+ address(durationVaultImplementation),
+ address(eigenLayerProxyAdmin),
+ abi.encodeWithSelector(DurationVaultStrategy.initialize.selector, cfg)
+ )
+ )
+ );
+
+ // Configure the mock to return the vault as a supported strategy in the operator set
+ IStrategy[] memory strategies = new IStrategy[](1);
+ strategies[0] = IStrategy(address(durationVault));
+ allocationManagerMock.setStrategiesInOperatorSet(OperatorSet({avs: OPERATOR_SET_AVS, id: OPERATOR_SET_ID}), strategies);
+
+ IStrategy[] memory whitelist = new IStrategy[](1);
+ whitelist[0] = IStrategy(address(durationVault));
+
+ cheats.prank(strategyManager.owner());
+ strategyManager.addStrategiesToDepositWhitelist(whitelist);
+ }
+
+ function testDepositIntoDurationVaultViaStrategyManager() public {
+ uint amount = 10 ether;
+ underlyingToken.transfer(STAKER, amount);
+
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory emptySig;
+ cheats.prank(STAKER);
+ delegationManagerMock.delegateTo(address(durationVault), emptySig, bytes32(0));
+
+ cheats.startPrank(STAKER);
+ underlyingToken.approve(address(strategyManager), amount);
+ cheats.expectEmit(true, true, true, true, address(strategyManager));
+ emit Deposit(STAKER, IStrategy(address(durationVault)), amount);
+ strategyManager.depositIntoStrategy(IStrategy(address(durationVault)), IERC20(address(underlyingToken)), amount);
+ cheats.stopPrank();
+
+ uint shares = strategyManager.stakerDepositShares(STAKER, IStrategy(address(durationVault)));
+ assertEq(shares, amount, "staker shares mismatch");
+ }
+
+ function testDepositRevertsAfterVaultLock() public {
+ durationVault.lock();
+
+ uint amount = 5 ether;
+ underlyingToken.transfer(STAKER, amount);
+
+ cheats.startPrank(STAKER);
+ underlyingToken.approve(address(strategyManager), amount);
+ cheats.expectRevert(IDurationVaultStrategyErrors.DepositsLocked.selector);
+ strategyManager.depositIntoStrategy(IStrategy(address(durationVault)), IERC20(address(underlyingToken)), amount);
+ cheats.stopPrank();
+ }
+
+ function _depositFor(address staker, uint amount) internal {
+ underlyingToken.transfer(staker, amount);
+ ISignatureUtilsMixinTypes.SignatureWithExpiry memory emptySig;
+ cheats.prank(staker);
+ delegationManagerMock.delegateTo(address(durationVault), emptySig, bytes32(0));
+ cheats.startPrank(staker);
+ underlyingToken.approve(address(strategyManager), amount);
+ strategyManager.depositIntoStrategy(IStrategy(address(durationVault)), IERC20(address(underlyingToken)), amount);
+ cheats.stopPrank();
+ }
+
+ function testWithdrawalsBlockedViaStrategyManagerBeforeMaturity() public {
+ uint amount = 8 ether;
+ _depositFor(STAKER, amount);
+ durationVault.lock();
+
+ uint shares = strategyManager.stakerDepositShares(STAKER, IStrategy(address(durationVault)));
+
+ // Withdrawal blocking now happens at the queueing stage (removeDepositShares -> beforeRemoveShares),
+ // not at the withdrawal execution stage (withdrawSharesAsTokens).
+ cheats.prank(address(delegationManagerMock));
+ cheats.expectRevert(IDurationVaultStrategyErrors.WithdrawalsLockedDuringAllocations.selector);
+ strategyManager.removeDepositShares(STAKER, IStrategy(address(durationVault)), shares);
+ }
+
+ function testWithdrawalsAllowedAfterMaturity() public {
+ uint amount = 6 ether;
+ _depositFor(STAKER, amount);
+ durationVault.lock();
+
+ cheats.warp(block.timestamp + durationVault.duration() + 1);
+ durationVault.markMatured();
+
+ uint shares = strategyManager.stakerDepositShares(STAKER, IStrategy(address(durationVault)));
+
+ cheats.prank(address(delegationManagerMock));
+ strategyManager.removeDepositShares(STAKER, IStrategy(address(durationVault)), shares);
+
+ uint balanceBefore = underlyingToken.balanceOf(STAKER);
+
+ cheats.prank(address(delegationManagerMock));
+ strategyManager.withdrawSharesAsTokens(STAKER, IStrategy(address(durationVault)), IERC20(address(underlyingToken)), shares);
+
+ assertEq(strategyManager.stakerDepositShares(STAKER, IStrategy(address(durationVault))), 0, "shares should be zero after removal");
+ assertEq(underlyingToken.balanceOf(STAKER), balanceBefore + amount, "staker did not receive withdrawn tokens");
+ }
+}
diff --git a/src/test/utils/EigenLayerUnitTestSetup.sol b/src/test/utils/EigenLayerUnitTestSetup.sol
index f1fbdc02ea..069af29ccd 100644
--- a/src/test/utils/EigenLayerUnitTestSetup.sol
+++ b/src/test/utils/EigenLayerUnitTestSetup.sol
@@ -16,6 +16,9 @@ import "src/test/mocks/AllocationManagerMock.sol";
import "src/test/mocks/StrategyManagerMock.sol";
import "src/test/mocks/DelegationManagerMock.sol";
import "src/test/mocks/EigenPodManagerMock.sol";
+import "src/test/mocks/EigenMock.sol";
+import "src/test/mocks/BackingEigenMock.sol";
+import "src/test/mocks/RewardsCoordinatorMock.sol";
import "src/test/mocks/EmptyContract.sol";
import "src/test/utils/ArrayLib.sol";
@@ -43,6 +46,9 @@ abstract contract EigenLayerUnitTestSetup is Test {
StrategyManagerMock strategyManagerMock;
DelegationManagerMock delegationManagerMock;
EigenPodManagerMock eigenPodManagerMock;
+ EigenMock eigenMock;
+ BackingEigenMock backingEigenMock;
+ RewardsCoordinatorMock rewardsCoordinatorMock;
EmptyContract emptyContract;
mapping(address => bool) public isExcludedFuzzAddress;
@@ -81,6 +87,9 @@ abstract contract EigenLayerUnitTestSetup is Test {
StrategyManagerMock(payable(address(new StrategyManagerMock(IDelegationManager(address(delegationManagerMock))))));
delegationManagerMock = DelegationManagerMock(payable(address(new DelegationManagerMock())));
eigenPodManagerMock = EigenPodManagerMock(payable(address(new EigenPodManagerMock(pauserRegistry))));
+ backingEigenMock = BackingEigenMock(payable(address(new BackingEigenMock())));
+ eigenMock = EigenMock(payable(address(new EigenMock(backingEigenMock))));
+ rewardsCoordinatorMock = RewardsCoordinatorMock(payable(address(new RewardsCoordinatorMock())));
emptyContract = new EmptyContract();
isExcludedFuzzAddress[address(0)] = true;
@@ -92,5 +101,8 @@ abstract contract EigenLayerUnitTestSetup is Test {
isExcludedFuzzAddress[address(strategyManagerMock)] = true;
isExcludedFuzzAddress[address(delegationManagerMock)] = true;
isExcludedFuzzAddress[address(eigenPodManagerMock)] = true;
+ isExcludedFuzzAddress[address(eigenMock)] = true;
+ isExcludedFuzzAddress[address(backingEigenMock)] = true;
+ isExcludedFuzzAddress[address(rewardsCoordinatorMock)] = true;
}
}